最近在使用AS常遇到一些问题反复出现。于是整理了一下以前遇到的一些问题,并附带常见的解决办法。
- 首先简单看一下gradle build的工作流程,如图:
如上图,gradle编译主要分为Load build,Configure build,calculate task graph ,Run tasks四个步骤,但是一般情况主要关注第4步Run tasks,这一步是编译时问题高发地带。大部分错误都是在Run tasks里面寻找。
- android studio寻找错误步骤:
1.点击下图红色区域查看编译错误日志:
2. 找到具体出错的task,在Terminal中手动执行任务,以便查看错误。如图:
3.在Terminal中用输入命令 gradlew build --debug/--scan/--stacktrace 编译,以便发现问题,如下图:
- 常见错误收集分析:
:xxx:compileDebugJavaWithJavac错误
描述:比较常见的错误,引发原因有多种,如java代码本身存在错误,代码中引用了不存在的三方库,编译缓存错误等。
发现问题:首先Build->clean project再编译。不行的话就在Terminal中输入gradlew :xxx:compileDebugJavaWithJavac ,其中xxx根据实际情况替换对应出错项目。比如我的执行结果的情况如下:
出现该错误的是因为android 6.0(api 23)删除了一些库导致的。
解决办法:
1.找到出错工程gradle文件的compileSdkVersion和targetSdkVersion修改为23以下。
2.在android sdk的安装目录找到对应jar包 比如/Users/xxx/Library/Android/sdk/platforms/android- 22/optional/org.apache.http.legacy.jar,拷贝到工程的libs目录下,并在gradle文件对应位置添加implementation('org.apache.http.legacy')。
:xxx:transformDexArchiveWithExternalLibsDexMergerForDebug,Program type already present,com.android.builder.dexing.DexArchiveMergerException等错误
描述:比较常见的错误,相同jar包(无论版本号是否相同)在多个工程中同时出现多份。
发现问题: gradlew :xxx:transformDexArchiveWithExternalLibsDexMergerForDebug,我的问题如下:
不难看出是android.net.http.CertificateChainValidator出现冲突,在android studio界面双击shift,搜索具体冲突位置。如图:
可以看出有两个jar包包含了同一个类。
解决办法:
1. jar包只保留一份,在多个工程中直接引用。
2. jar包保留多份,分别在每个工程中的gradle配置中的dependencies属性中添加compileOnly ('对应的jar包')
:xxx:processDebugManifest, Manifest merger failed with multiple errors等错误
描述:处理AndroidManifest.xml文件是出错,引发原因有多种,比如manifest文件本生配置错误,多个manifest文件中都有设置application属性或启动activity,这样在合并的时候就会出现冲突 。
发现问题:gradlew :xxx:processDebugManifest,我的错误如下:
解决办法:如果出现和上图类似的错误,只需找到对应行修改即可。如果多个manifest都设置了启动activity,只保留主工程的即可。