我有一个最近上传到 Play 商店的应用程序,启用了 Crashlytics。此应用程序中有一个名为 StartQuizActivity 的 Activity ,它是在开发期间创建的,但目前未使用。 Activity 仍然在 list 中声明,但应用程序中没有调用它的 Intent 。
我收到了一份带有堆栈跟踪的崩溃报告,表明设备已尝试启动此 Activity ,这导致了 IllegalArgumentException,表明所需的对象未按 Intent 传递:
Fatal Exception: java.lang.RuntimeException: Unable to start activity ComponentInfo{com.fractalwrench.acidtest/com.fractalwrench.acidtest.activities.StartQuizActivity}: java.lang.IllegalArgumentException: No extras supplied to startQuizActivity!
StartQuizActivity.java
@Override protected void onCreate(Bundle savedInstanceState) {
aminoAcid = getIntent().getExtras().getParcelable(AMINO_ACID);
super.onCreate(savedInstanceState);
if (aminoAcid != null) {
// do things
} else {
throw new IllegalArgumentException("No extras supplied to startQuizActivity!");
}
既然无法使用应用程序的 UI 启动 StartQuizActivity,为什么设备能够启动此 Activity?我注意到该设备是运行 API 21 的根 Nexus,并且在应用程序中的其他 Activity 中看到了类似的崩溃。即使在尝试 MonkeyRunner 之后,我也无法在任何设备上重现崩溃。
这是由 Google 进行的某种形式的自动测试,还是由具有非常特定设备设置的用户进行的?任何想法将不胜感激。
AndroidManifest.xml
<activity
android:name=".activities.StartQuizActivity"
android:label="@string/activity_title_prepare_for_quiz" />
最佳答案
当您使用 android:exported="true"
(这是 Activity 的默认设置)将 Activity 添加到您的 list 时,它会成为任何应用程序都可以调用的公共(public) API 的一部分。
可以理解的是,其他应用程序很少会无缘无故地从另一个应用程序显式启动随机 Activity,但应用程序如 Tasker确实允许最终用户这样做。
你可以
- 从 list 中删除 Activity - 这显然完全删除了启动它的任何能力
- 添加
android:exported="false"
- 这可确保其他应用无法启动 Activity - 调用finish()如果没有额外提供,立即停止 Activity 。
关于java - 为什么未使用的 Activity 在上传到 Play 商店时抛出异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34730062/