本篇文章主要用來記錄導入項目作為依賴的問題集錦!!
昨天導師給了個任務,就是把AS的一個項目導入到另外一個項目中作為library,跟之前把github上的開源項目導入到工程中作為依賴是一樣的,由于之前隻導入過jar包 沒有導入過一個項目,是以我就開搜了,結果因為搜的姿勢不對一直不行,百度搜尋第一個eoe論壇的辦法也不管用,下面貼出我成功導入的方法:
1.啟動AndroidStudio後,打開你需要接收Library的項目。比如有兩個項目,項目A,和Library項目B,那麼打開項目A。
2.在下拉菜單中依次找到New— —Import Module,點選打開項目導入視窗。注意導入的是Module而不是Project,如果是Project的話AndroidStudio會自動打開一個新的視窗編輯,那樣的話就是不Library了。
3.在打開的視窗中點選右側的"..."浏覽視窗,在檔案夾視窗中找到你要導入的Library項目的位置,選擇後點選底部的OK按鈕導入。
4.導入視窗中顯示了該Module(項目)的詳細資訊,點選Finish完成導入。需要注意的是導入到AndoridStudio項目中的Library也必須是AndroidStudio項目,不能是Eclipse項目,如果是Eclipse項目的話,需要選擇導出AndroidStudio項目。
5.在項目首頁中選擇Project标簽,可以看到項目的檔案結構圖中多出了我們剛才導入的項目。Library的導入就完成了。
接下來是一些配置,把該library導入到主項目中
1.點選頂部左上角的File菜單,在出現的下拉菜單中找到Project Structure,點選進入。
2.在視窗左側選擇原始的項目後,點選右側的Dependencies(依賴項)。可以看到項目目前引用的jar包等資訊。
3.點選右側的“+”添加按鈕,在下拉菜單中找到Module Dependency(項目依賴),點選打開項目選擇視窗。
4.選擇前面步驟中導入的Library項目後,點選OK按鈕導入到原始項目中。
5.原始項目的依賴項中就出現了導入的Libray項目,這時在項目中就能正确引用Library項目中的内容了,點選底部的OK按鈕完成添加。
你以為這樣就完成了嗎?真是太天真了,這隻是第一步,接下來會有無數的bug在等着你,下面就是本篇文章的正題了,bug集錦!!
Bug No.1
Error: AndroidStudio TransformException : Error:Execution failed for task':app:transformClassesWithDexForDebug'
解決方案:
在你的主項目的build.gradle檔案中,增加加粗的那一行
android {
compileSdkVersion ..
buildToolsVersion '...'
defaultConfig {
...
targetSdkVersion ..
multiDexEnabled true // this line will solve this problem
}
}
Bug No.2
Error :unspecified on project app resolves to an APK archive which is not supported
解決方案:
在我們作為library的項目裡,他的頭部是apply plugin: 'com.android.application'
這句話告訴了Gradle将我們要作為library的項目編譯稱為application,也就是apk,這就是問題的所在;
方法就是,将上面該句改為:apply plugin: 'com.android.library' 後,别急 還有問題,Gradle将其編譯稱為一個Library,也就是庫,運作之後,會出現
Error :Libraryprojects cannot set applicationId. applicationId is set to 'package_name' indefault config.
那是因為一個庫不允許設定applicationId,需要将builde.gradle — android — defaultConfig中的applicationId删除。
Bug No.3
Error: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,heme"
以及在主項目的 manifest檔案中,重複寫了 call_phone的權限,網上也有人是某個activity下多寫了一句intent-filter,裡面沒有内容,将這些重複的空的删掉就好,并将作為lib的minisdk與主項目同步(修改library飛build.gradle檔案中最小sdk,或者降低主項目的sdk)
Bug No.4
error:在作為library的項目中報錯:需要常量表達式
解決方案:
在一般的Android項目中,R類的常量都是用final定義的,但ADT 14之後,如果在library 項目中,它會沒有final關鍵字,而我們在作為library的項目中使用了switch ,在switch語句的case中,如果使用 R.id.xxx 則會提示有問題,不允許非常量在case語句中。
Google提供的一個方法就是把它轉化為if-else語句
以上就是我遇到的幾大bug,印象最深刻的四個,還有其他小bug比較容易解決,我就不貼出來,留下這份筆記!作為經驗防止以後踏入同一個坑!