最近把依賴安卓源碼編譯環(huán)境的多個項目切換到gradle編譯環(huán)境,需要把一些項目改成lib庫依賴,基本思路是把通用的代碼和第三方j(luò)ar放在一個utils庫項目中, 其他子項目改為lib庫,子項目統(tǒng)一依賴utils,主項目依賴9個子項目,解除子項目對主頁面的依賴,最后gradle編譯成一個apk。
我整理了一些遇到的常見問題,希望對大家有幫助。
首先注意的gradle編譯比mm方式編譯對項目質(zhì)量的要求更嚴(yán)格,特別是編譯release版本,很多命名不規(guī)范的資源需要修改, 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插件默認(rèn)會啟用Manifest Merger Tool,若Library項目中也定義了與主項目相同的屬性(例如默認(rèn)生成的Android:icon和android:theme),則此時會合并失敗,并報上面的錯誤。
解決方法有以下2種:
方法1:在Manifest.xml的application標(biāo)簽下添加tools:replace="android:icon, android:theme"(多個屬性用,隔開,并且記住在manifest根標(biāo)簽上加入xmlns:tools="http://schemas.android.com/tools",否則會找不到namespace哦)
方法2:在build.gradle根標(biāo)簽上加上useOldManifestMerger true (懶人方法)
參考官方介紹:
http://tools.android.com/tech-docs/new-build-system/user-guide/manifest-merger
問題二:
Library Project里面的BuildConfig.DEBUG永遠(yuǎn)都是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文件導(dǎo)致的,需要人工排查了。
解決方法:
Settings->IDE Settings->Editor->Other->Strip trailing spaces on Save->None
問題四:
編譯的時候,報:Failure [INSTALL_FAILED_OLDER_SDK]。一般是系統(tǒng)自動幫你設(shè)置了compileSdkVersion
解決方法:
修改build.gradle下的compileSdkVersion 'android-L'為compileSdkVersion 24
問題五:
Error:Executionfailed for task ':greencar:processDebugManifest'.> Manifest merger failed withmultipleerrors, see logs。
原因:AS的Gradle插件默認(rèn)會啟用Manifest Merger Tool,若Library項目中也定義了與主項目相同的屬性(例如默認(rèn)生成的android:icon和android:theme),則此時會合并失敗,并報上面的錯誤。
解決方案:
在manifest根標(biāo)簽上加入xmlns:tools="http://schemas.android.com/tools",并在Manifest.xml的application標(biāo)簽下添加tools:replace="name,icon, label,theme"
以及在主項目的 manifest文件中,重復(fù)寫了 call_phone的權(quán)限,網(wǎng)上也有人是某個activity下多寫了一句intent-filter,里面沒有內(nèi)容,將這些重復(fù)的空的刪掉就好,并將作為lib的minisdk與主項目同步(修改library飛build.gradle文件中最小sdk,或者降低主項目的sdk)
問題六:
在作為library的項目中報錯:需要常量表達(dá)式
解決方案:
在一般的Android項目中,R類的常量都是用final定義的,但ADT 14之后,如果在library 項目中,它會沒有final關(guān)鍵字,而我們在作為library的項目中使用了switch ,在switch語句的case中,如果使用 R.id.xxx 則會提示有問題,不允許非常量在case語句中。
Google提供的一個方法就是把它轉(zhuǎn)化為if-else語句。目前我也是用了這個笨辦法,還好Android studio 只要按Anter+Enter自動幫改,就是比較煩