Android_Error_无法运行、崩溃

简述

以下是遇到的各种运行不起来、运行中崩溃的问题。如果是显示异常、功能失效之类的,参见另一篇文章Android_Error_显示异常、功能失效

IO

/storage/emulated/0/Android/data/com…

❌之前一直以为目录位置如下图,然后发现没有权限。
在这里插入图片描述

⭕其实这个目录的正确位置是:在这里插入图片描述

编译时报错

E: Defined multiple times

问题Type XXX is defined multiple times: ...\app\build\..., ...\build\...
解决:跳转到问题提示中所提到的地址,删除build文件,重新运行。

E: Gradle project sync failed.

问题Basic functionality(e.g.editing,debugging) will not work properly.
原因:原本android studio会自动下载配置中的gradle,无法下载可能是国内网络访问比较慢的原因。
解决1:自行上网下载对应版本 gradle,无需解压直接拷贝到对应地址。
在这里插入图片描述
解决2:在build.gradle中添加国内镜像网站。

E: NoSuchFieldError

问题:系统没有找到"tv_loading"这个id
在这里插入图片描述
原因

  1. 真的没有
  2. 有重名文件,本来应该加载文件A,结果加载到了同名的A’文件,在A’中没有该id

解决
没有就加上,重名就改名。

我这里是因为主工程和Model中有同名布局文件,都叫dialog_loading.xml,其中一个布局有tv_loading这个id,另一个没有。

E: Unsupported Java.

问题Unsupported Java. Your build is currently configured to use Java 17.0.6 and Gradle 6.5.
原因:当前使用的 java 版本和 gradle 版本和不匹配。
解决:改gradle版本或者改java。

E: Manifest merger failed

问题 Manifest merger failed : uses-sdk:minSdkVersion 23 cannot be smaller than version 26 declared in library [xxx.aar] ...\xxx.aar\...\AndroidManifest.xml as the library might be using APIs not available in 23.
原因:依赖的module支持的最低版本高于项目
解决1:降低module支持的最低版本
解决2:找到对应module的包名,在项目的 AndroidManifest.xml 中重写module的minSdkVersion属性。若有多个module都存在该问题,用逗号分隔。

<manifest ...>
	<uses-sdk android:minSdkVersion="23"
	tools:overrideLibrary="com.xxx.sdk,com.xxx2.sdk"/>
    ...
</manifest>

运行时错误

E:NullPointerException 空指针异常

上下文未生成

问题: Attempt to invoke virtual method ‘android.content.SharedPreferences android.content.Context.getSharedPreferences(java.lang.String, int)’ on a null object reference

原因:上下文还未生成
如下所示,此时mShare是MainActivity的成员变量,在实际执行时,会先创建mShare属性,后执行onCreate方法。
然而,getSharedPreferences()方法是基于上下文创建的,因此会空指针异常。

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {...}
	private val mShare = getSharedPreferences("tmpShare", MODE_PRIVATE)
	...
}

下图为上述代码反编译后的Java代码:
在这里插入图片描述
解决:把该语句移动到已生成上下文之后的代码块中。

频繁添加移除子View

问题:Attempt to read from field ‘int android.view.View.mPrivateFlags’ on a null object reference
原因:ViewGroup中频繁添加移除子View,引起的管理混乱。
解决:Dialog引起的问题,多是show、dismiss引起的,可以在这些操作前根据业务逻辑增加判断,或者直接用try catch捕获。添加动画或添加fragment互相切换时引起的,考虑在适当的地方,调remove(view),将不需要的子View及时移除。

安装时错误

INSTALL_FAILED_TEST_ONLY

问题:编译正常,安装时提示:Installation did not succeed. The application could not be installed: INSTALL_FAILED_TEST_ONLY
原因:应用添加了测试专用标志,而您尝试将其安装为非测试应用。这是Android系统的一种安全措施,防止在非测试环境中意外地安装测试应用。

添加该标志的方式:

  1. 在AndroidManifest.xml文件的application元素中添加
<application
    android:testOnly="true">
    ...
</application>
  1. 在app的build.gradle文件中的android块中添加
android {
    ...
    testOnly true
}
  1. gradle.properties中
android.injected.testOnly=false
  1. android studio 在编译时自行添加的该标志

解决:找到对应的设置,将其改为false,我一般都是在gradle.properties中强行将其设为false

安卓版本不兼容

关于API和Android的版本对应,可以看这篇文章:Android_版本对应

<queries>标签

:app:processXXXAGPBI: {"kind":"error","text":"error: unknown element \u003cqueries\u003e found.","sources":[{"file":"C:\\Users\\...\\app\\build\\intermediates\\manifests\\full\\pkgHanziUcNormalAdNormalCustomChannelHuawei\\debug\\AndroidManifest.xml","position":{"startLine":64}}],"original":"","tool":"AAPT"}
 FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':app:processXXX'.
> Failed to process resources, see aapt output above for details.

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.

* Get more help at https://help.gradle.org

BUILD FAILED in 2s
77 actionable tasks: 1 executed, 76 up-to-date

问题:报错信息中已经说明了“unknown element \u003cqueries\u003e”。无法识别Manifest文件中的<queries>标签。
(\u003c、\u003e分别对应 “<”、 “>”)
原因:对于设备上已安装的其他应用,Android 11 更改了对其查询和与之交互的方式。
使用<queries> 元素,应用可以定义一组自身可访问的其他软件包。
解决1:在manifest文件中删除即可。
解决2:安装 Android Studio 3.6.1 或更高版本。
解决3:安装最新版的Gradle。
解决4:将应用的 targetSdkVersion 设为 30。

  1. 解决2~4,可能需要配合一起使用。
  2. 选用解决3时,注意gradle版本和gradle插件版本的对应关系

非 Activity Context 启动 Activity

问题Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?
原因:使用非 Activity Context 启动 Activity导致的崩溃,例如使用Application的Context。
在API 24 ~ API 27,即Android 7 Android 8上检测不到该问题。

不存在PersistableBundle类

问题java.lang.ClassNotFoundException Didn't find class "android.os.PersistableBundle"
原因:从官网关于PersistableBundle介绍可知,这是从API 21 即Andriud 5之后才添加的类。我在使用onSaveInstanceState、onRestoreInstanceState的时候重写了 public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) {}方法,导致在Android 4.4.4的机型上运行报错。
在这里插入图片描述

解决:避免使用该类,低版本上做数据保存恢复可以用如下方法:

@Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        ...
    }

    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
        ...
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
CustomActivityOnCrash是一款Android开源库,它可以在应用程序崩溃时显示自定义Activity而不是默认的错误对话框。下面是使用CustomActivityOnCrash的步骤: 1. 在项目的build.gradle文件中添加以下依赖项: ``` dependencies { implementation 'cat.ereza:customactivityoncrash:2.3.0' } ``` 2. 在应用程序的Application类中初始化CustomActivityOnCrash,以便在应用程序崩溃时显示自定义Activity: ```java public class MyApplication extends Application { @Override public void onCreate() { super.onCreate(); CustomActivityOnCrash.install(this); } } ``` 3. 创建一个自定义Activity来显示错误信息。例如: ```java public class CustomErrorActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_custom_error); // 获取错误信息 String error = CustomActivityOnCrash.getStackTraceFromIntent(getIntent()); // 显示错误信息 TextView errorTextView = findViewById(R.id.error); errorTextView.setText(error); // 重启应用程序按钮 Button restartButton = findViewById(R.id.restart_button); restartButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { CustomActivityOnCrash.restartApplication(CustomErrorActivity.this); } }); } } ``` 4. 在AndroidManifest.xml文件中添加CustomErrorActivity,并将其设置为应用程序崩溃时的默认Activity: ```xml <application android:name=".MyApplication" ...> <activity android:name="cat.ereza.customactivityoncrash.activity.DefaultErrorActivity" android:configChanges="orientation|screenSize|smallestScreenSize" android:label="@string/default_error_activity_title" android:theme="@style/Theme.AppCompat.Light" /> <activity android:name=".CustomErrorActivity" android:configChanges="orientation|screenSize|smallestScreenSize" android:label="@string/custom_error_activity_title" android:theme="@style/Theme.AppCompat.Light" /> <provider android:name="androidx.core.content.FileProvider" android:authorities="${applicationId}.cat.ereza.customactivityoncrash.provider" android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/cat_ereza_customactivityoncrash_paths" /> </provider> </application> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="28" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="28" /> ``` 5. 运行应用程序并在应用程序崩溃时查看自定义错误Activity。 以上就是使用CustomActivityOnCrash的详细步骤。希望对你有所帮助。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Uuln

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值