安卓源码项目进行gradle编译改造常见问题解决
2017-02-28 21:47
471 查看
最近把依赖安卓源码编译环境的多个项目切换到gradle编译环境,需要把一些项目改成lib库依赖,基本思路是把通用的代码和第三方jar放在一个utils库项目中, 其他子项目改为lib库,子项目统一依赖utils,主项目依赖9个子项目,解除子项目对主页面的依赖,最后gradle编译成一个apk。
我整理了一些遇到的常见问题,希望对大家有帮助。
首先注意的gradle编译比mm方式编译对项目质量的要求更严格,特别是编译release版本,很多命名不规范的资源需要修改, strings缺少的翻译等需要对齐。
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 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
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
解决方法:
Settings->IDE Settings->Editor->Other->Strip trailing spaces on Save->None
解决方法:
修改build.gradle下的compileSdkVersion ‘android-L’为compileSdkVersion 24
原因:AS的Gradle插件默认会启用Manifest Merger Tool,若Library项目中也定义了与主项目相同的属性(例如默认生成的android:icon和android:theme),则此时会合并失败,并报上面的错误。
解决方案:
在manifest根标签上加入
以及在主项目的 manifest文件中,重复写了 call_phone的权限,网上也有人是某个activity下多写了一句intent-filter,里面没有内容,将这些重复的空的删掉就好,并将作为lib的minisdk与主项目同步(修改library飞build.gradle文件中最小sdk,或者降低主项目的sdk)
解决方案:
在一般的Android项目中,R类的常量都是用final定义的,但ADT 14之后,如果在library 项目中,它会没有final关键字,而我们在作为library的项目中使用了switch ,在switch语句的case中,如果使用 R.id.xxx 则会提示有问题,不允许非常量在case语句中。
Google提供的一个方法就是把它转化为if-else语句。目前我也是用了这个笨办法,还好Android studio 只要按Anter+Enter自动帮改,就是比较烦
我整理了一些遇到的常见问题,希望对大家有帮助。
首先注意的gradle编译比mm方式编译对项目质量的要求更严格,特别是编译release版本,很多命名不规范的资源需要修改, strings缺少的翻译等需要对齐。
问题一:
Error:(26, 9) Attribute application@icon value=(@drawable/logo) from AndroidManifest.xml:26:9Error:(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 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自动帮改,就是比较烦
相关文章推荐
- 安卓系统源码编译系列(七)——单独编译WebView兼容性问题解决
- 安卓项目导入Android studio编译出现gradle错误部分问题
- cocos2d-x在安卓平台编译常见的2个问题及解决办法
- 简单的Junit和Maven结合应用(Maven项目怎么进行Junit单元测试以及常见问题解决方法)
- 在使用android studio过程中,使用gradle编译的时候总会出现一些问题,下面是几个常见问题的解决方法。
- 安卓Gradle编译失败问题分析及解决
- intellij IDE build出错,无法显示图片,找不到tomcat server,java编译版本过低,异常推出后无法启动项目等常见问题解决
- 安卓系统源码编译系列(七)——单独编译WebView兼容性问题解决
- maven常见问题处理(3-3)Gradle编译时下载依赖失败解决方法
- 解决源码编译android 4.0.4和SDK 后无法更新安卓平台的更新问题
- 编译Android源码时常见问题以及解决方法
- Qt[5.4]开发Android[安卓]Quick/QML Extension[扩展]库[.so]工程[项目]编译问题及解决办法
- 安卓源码编译--常见问题集
- 解决eclipse和myeclipse不能编译项目的问题
- 项目中遇到问题就是增加aranda(图片存储)测试环境依赖报错解决进行中
- android导入项目常见问题解决
- android导入项目常见问题解决
- Ubuntu编译android源码出错及问题解决
- 解决Android源码编译后网页中无法正确显示GIF图片的问题
- ubuntu下eclipse编译的java项目乱码问题的解决