最近把依賴安卓源碼編譯環(huán)境的多個(gè)項(xiàng)目切換到gradle編譯環(huán)境捕仔,需要把一些項(xiàng)目改成lib庫依賴墙懂,基本思路是把通用的代碼和第三方j(luò)ar放在一個(gè)utils庫項(xiàng)目中橡卤, 其他子項(xiàng)目改為lib庫,子項(xiàng)目統(tǒng)一依賴utils损搬,主項(xiàng)目依賴9個(gè)子項(xiàng)目碧库,解除子項(xiàng)目對(duì)主頁面的依賴,最后gradle編譯成一個(gè)apk巧勤。
我整理了一些遇到的常見問題嵌灰,希望對(duì)大家有幫助。
首先注意的gradle編譯比mm方式編譯對(duì)項(xiàng)目質(zhì)量的要求更嚴(yán)格颅悉,特別是編譯release版本沽瞭,很多命名不規(guī)范的資源需要修改, strings缺少的翻譯等需要對(duì)齊剩瓶。
問題一:
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)會(huì)啟用Manifest Merger Tool驹溃,若Library項(xiàng)目中也定義了與主項(xiàng)目相同的屬性(例如默認(rèn)生成的Android:icon和android:theme),則此時(shí)會(huì)合并失敗延曙,并報(bào)上面的錯(cuò)誤吠架。
解決方法有以下2種:
方法1:在Manifest.xml的application標(biāo)簽下添加tools:replace="android:icon, android:theme"(多個(gè)屬性用,隔開,并且記住在manifest根標(biāo)簽上加入xmlns:tools="http://schemas.android.com/tools"搂鲫,否則會(huì)找不到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的一個(gè)已知問題,某Google的攻城獅說魂仍,Library projects目前只會(huì)生成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, 這個(gè)問題一般是引用了不同版本的com.android.support庫擦酌,或者不同的jar里面有同名的class文件導(dǎo)致的俱诸,需要人工排查了。
解決方法:
Settings->IDE Settings->Editor->Other->Strip trailing spaces on Save->None
問題四:
編譯的時(shí)候赊舶,報(bào):Failure [INSTALL_FAILED_OLDER_SDK]睁搭。一般是系統(tǒng)自動(dò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)會(huì)啟用Manifest Merger Tool笼平,若Library項(xiàng)目中也定義了與主項(xiàng)目相同的屬性(例如默認(rèn)生成的android:icon和android:theme)园骆,則此時(shí)會(huì)合并失敗,并報(bào)上面的錯(cuò)誤寓调。
解決方案:
在manifest根標(biāo)簽上加入xmlns:tools="http://schemas.android.com/tools"
锌唾,并在Manifest.xml的application標(biāo)簽下添加tools:replace="name,icon, label,theme"
以及在主項(xiàng)目的 manifest文件中晌涕,重復(fù)寫了 call_phone的權(quán)限滋捶,網(wǎng)上也有人是某個(gè)activity下多寫了一句intent-filter,里面沒有內(nèi)容余黎,將這些重復(fù)的空的刪掉就好重窟,并將作為lib的minisdk與主項(xiàng)目同步(修改library飛build.gradle文件中最小sdk,或者降低主項(xiàng)目的sdk)
問題六:
在作為library的項(xiàng)目中報(bào)錯(cuò):需要常量表達(dá)式
解決方案:
在一般的Android項(xiàng)目中惧财,R類的常量都是用final定義的亲族,但ADT 14之后,如果在library 項(xiàng)目中可缚,它會(huì)沒有final關(guān)鍵字霎迫,而我們在作為library的項(xiàng)目中使用了switch ,在switch語句的case中帘靡,如果使用 R.id.xxx 則會(huì)提示有問題知给,不允許非常量在case語句中。
Google提供的一個(gè)方法就是把它轉(zhuǎn)化為if-else語句描姚。目前我也是用了這個(gè)笨辦法涩赢,還好Android studio 只要按Anter+Enter自動(dòng)幫改,就是比較煩