简述
以下是遇到的各种运行不起来、运行中崩溃的问题。如果是显示异常、功能失效之类的,参见另一篇文章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
原因:
- 真的没有
- 有重名文件,本来应该加载文件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系统的一种安全措施,防止在非测试环境中意外地安装测试应用。
添加该标志的方式:
- 在AndroidManifest.xml文件的application元素中添加
<application
android:testOnly="true">
...
</application>
- 在app的build.gradle文件中的android块中添加
android {
...
testOnly true
}
- gradle.properties中
android.injected.testOnly=false
- 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。
- 解决2~4,可能需要配合一起使用。
- 选用解决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);
...
}