最近把依赖安卓源码编译环境的多个项目切换到gradle编译环境,需要把一些项目改成lib库依赖,基本思路是把通用的代码和第三方jar放在一个utils库项目中, 其他子项目改为lib库,子项目统一依赖utils,主项目依赖9个子项目,解除子项目对主页面的依赖,最后gradle编译成一个apk。
我整理了一些遇到的常见问题,希望对大家有帮助。
首先注意的gradle编译比mm方式编译对项目质量的要求更严格,特别是编译release版本,很多命名不规范的资源需要修改, strings缺少的翻译等需要对齐。
问题一:
Error:(26, 9) Attribute application@icon value=(@drawable/logo) from AndroidManifest.xml:26:9
Error:(28, 9) Attribute application@theme value=(@style/ThemeActionBar) from AndroidManifest.xml:28:9
is also present at XXXX-trunk:XXXXLib:unspecified:15:9 value=(@style/AppTheme)
Suggestion: add 'tools:replace="android:theme"' to <application> element at AndroidManifest.xml:24:5 to override
Error:Execution failed for task ':XXXX:processDebugManifest'.
Manifest merger failed with multiple errors, see logs
原因:
AS的Gradle插件默认会启用Manifest Merger Tool,若Library项目中也定义了与主项目相同的属性(例如默认生成的Android:icon和android:theme),则此时会合并失败,并报上面的错误。
解决方法有以下2种:
方法1:在Manifest.xml的application标签下添加tools:replace="android:icon, android:theme"(多个属性用,隔开,并且记住在manifest根标签上加入xmlns:tools="http://schemas.android.com/tools",否则会找不到namespace哦)
方法2:在build.gradle根标签上加上useOldManifestMerger true (懒人方法)
参考官方介绍:
http://tools.android.com/tech-docs/new-build-system/user-guide/manifest-merger
问题二:
Library Project里面的BuildConfig.DEBUG永远都是false。这是Android Studio的一个已知问题,某Google的攻城狮说,Library projects目前只会生成release的包。
Issue 52962: https://code.google.com/p/android/issues/detail?id=52962
解决方法:(某Google的攻城狮推荐的方法)
Workaround: instaed of BuildConfig.DEBUG create another boolean variable at lib-project's e.g. BuildConfig.RELEASE and link it with application's buildType.
https://gist.github.com/almozavr/d59e770d2a6386061fcb
参考stackoverflow上的这篇帖:
http://stackoverflow.com/questions/20176284/buildconfig-debug-always-false-when-building-library-projects-with-gradle
问题三:
Duplicate zip entry error, 这个问题一般是引用了不同版本的com.android.support库,或者不同的jar里面有同名的class文件导致的,需要人工排查了。
解决方法:
Settings->IDE Settings->Editor->Other->Strip trailing spaces on Save->None
问题四:
编译的时候,报:Failure [INSTALL_FAILED_OLDER_SDK]。一般是系统自动帮你设置了compileSdkVersion
解决方法:
修改build.gradle下的compileSdkVersion 'android-L'为compileSdkVersion 24
问题五:
Error:Executionfailed for task ':greencar:processDebugManifest'.> Manifest merger failed withmultipleerrors, see logs。
原因:AS的Gradle插件默认会启用Manifest Merger Tool,若Library项目中也定义了与主项目相同的属性(例如默认生成的android:icon和android:theme),则此时会合并失败,并报上面的错误。
解决方案:
在manifest根标签上加入xmlns:tools="http://schemas.android.com/tools"
,并在Manifest.xml的application标签下添加tools:replace="name,icon, label,theme"
以及在主项目的 manifest文件中,重复写了 call_phone的权限,网上也有人是某个activity下多写了一句intent-filter,里面没有内容,将这些重复的空的删掉就好,并将作为lib的minisdk与主项目同步(修改library飞build.gradle文件中最小sdk,或者降低主项目的sdk)
问题六:
在作为library的项目中报错:需要常量表达式
解决方案:
在一般的Android项目中,R类的常量都是用final定义的,但ADT 14之后,如果在library 项目中,它会没有final关键字,而我们在作为library的项目中使用了switch ,在switch语句的case中,如果使用 R.id.xxx 则会提示有问题,不允许非常量在case语句中。
Google提供的一个方法就是把它转化为if-else语句。目前我也是用了这个笨办法,还好Android studio 只要按Anter+Enter自动帮改,就是比较烦