最近一頭扎進安卓的坑。Android小白sync project with gradle總是坎坷無比是不是?總算弄好一次, 過了一陣又掛了有木有?
此篇主要總結在這次成功編譯之後,各種慘痛的踩坑歷程。(項目名稱已在文中隱去)
下載資源踩坑
gradle-x.x-all.zip文件
Android studio在sync項目時會先下載gradle-x.x-all.zip文件, 具體那個版本,是由項目內的gradle/wrapper/gradle-wrapper.properties文件指定:
distributionUrl=https\://services.gradle.org/distributions/gradle-5.2.1-all.zip
Android會下載該zip文件,該文件一般上百M,下載很慢.Android下載成功後, 會把它解壓到項目的.gradle隱藏目錄; 可以手動下載該文件, 並且放到相應的特定的位置, 會加速以後的sync項目的速度;
wget -c https://services.gradle.org/distributions/gradle-5.2.1-all.zip
// 放置的位置
~/.gradle/wrapper/dists/gradle-5.2.1-all/bviwmvmbexq6idcscbicws5me/
// 由於由IDE啓動了下載, 該位置自動生成且包含了一長串hash值,這是必須的;
// 把下載的zip文件放入,
// 把該文件夾內的.part文件刪除, 修改爲同名的.ok文件, touch size設爲0;
// 其他的版本也做類似處理;這會節省很多時間;
gradle的版本會要求所使用的Android Studio的版本, e.g. gradle 5.x.x 要求Android Studio version > 3.4 etc. 這在後面會敘述;
各種依賴jar包和阿里maven鏡像
下載完gradle之後, 各種依賴jar包的下載也非常耗時. 曾經嘗試過,手動下載相關jar包, 如果jcenter上下載不下來, 也可以從其他地點下載(e.g. https://repo1.maven.org/maven2/), 下載後放置到位置: ~/.gradle/caches/modules-2/files-2.1/java.package.name/x.x.x/hash_value_longstring/
(e.g. /.gradle/caches/modules-2/files-2.1/com.google.code.findbugs/jsr305/3.0.1/f7be08ec23c21485b9b5a1cf1654c2ec8c58168d/jsr305-3.0.1.jar );
但實際上,手動下載這個方法並不可行.下載jar包的工作量巨大 且還要留意廠商, 版本; 另外, 會出現放置到caches目錄中也不生效的問題(e.g. com/google/zxing/core-3.1.0.jar).
解決辦法是添加阿里的國內maven鏡像;
ref:
- https://blog.csdn.net/lj402159806/article/details/78422953
- https://yq.aliyun.com/articles/657575
對單個項目:
// method 1
// 添加以下內容到build.gradle, 且必須在原有不通的maven資源之前
buildscript {
repositories {
maven { url "http://maven.aliyun.com/nexus/content/repositories/jcenter/" }
maven { url "http://maven.aliyun.com/nexus/content/repositories/google/" }
maven{ url 'http://maven.aliyun.com/nexus/content/groups/public/'}
...
}
}
allprojects {
repositories {
maven { url "http://maven.aliyun.com/nexus/content/repositories/jcenter/" }
maven { url "http://maven.aliyun.com/nexus/content/repositories/google/" }
maven{ url 'http://maven.aliyun.com/nexus/content/groups/public/'}
}
}
編譯踩坑
AbstractMethodError
sync時會爆出類似AbstractMethodError: org.jetbrains.plugins.gradle.tooling.util....
的錯誤. 這個錯誤,android studio本身並沒有報出有效的提示信息. 問了谷仙人告知是由於Android Studio的版本過低;(e.g. 3.2), gradle 5.x.x 要求Android Studio的版本;
爲了簡單,嘗試直接在gradle-wrapper.properties文件中指定低版本的gradle(e.g. 4.6), 但有時卻會遇到另一個錯誤提示. e.g. Minimum supported Gradle version is 5.1.1. Current version is 4.6.
, 這個在這個工作項目確實出現了.
com.android.tools.build:gradle:x.x.x決定了能使用的gradle版本
ref:
- https://github.com/react-native-community/async-storage/issues/115#issuecomment-498016892
- https://developer.android.com/studio/releases/gradle-plugin#updating-gradle (android build gradle插件和gradel的兼容性表格)
dependencies {
// 參照ref, 可以看到,
// 3.4.2版本要求使用gradle 5.1.1+ (參照ref2頁面的Update Gradle表格)
classpath 'com.android.tools.build:gradle:3.4.2'
// classpath 'com.android.tools.build:gradle:3.1.0'
...
}
可以看到, Android的gradle plugin com.android.tools.build的版本對gradle的使用也有要求,嘗試使用註釋的較低版本(3.1.0).
編譯大部分過程順利, 仍然出現一個module(account)的依賴有問題.查看它的build.gradle文件, 發現並沒有指定的相關依賴,於是推測還是較低版本的gradle不能識別目前快應用build.gradle配置所使用的gradle指令集.於是還是應該使用repo sync時初始的gradle-wrapper.properties和com.android.tools.build的版本, 升級Android Studio到3.4.1, 再次sync project, 顯示sync success.
但是在工具欄make project旁邊的’open edit run/debug configuration '的dropdown裏,app的狀態是紅叉, 點擊instance run按鈕之後,又喜迎下一個錯誤: Error running :Default Activity not found
Error running :Default Activity not found
ref:
- https://juejin.im/post/5b6586b8e51d45191e0d3225
- https://www.jianshu.com/p/07f6363f080d
ref1中的方法2, 是適用於此處的方案, 即app framework apk是沒有界面的apk,
所以vender工程確實不需要launcher Acitivity. 點edit run/debug configuration, 然後選擇launch option->launch: nothing;
mockup工程,存在默認的launch activity;
至此,編譯過程真正搞定, sync成功vender工程;
安裝踩坑
本以爲,下一步就安裝成功,進行調試了; 但蒼天眷顧,又賜給我下一個大坑;
INSTALL_FAILED_UPDATE_INCOMPATIBLE 和 adb uninstall “com.miui.hybrid”
ref
- https://www.jianshu.com/p/e248f19963fe
已經刪除了工程機上的2個apk,但安裝仍然報錯INSTALL_FAILED_UPDATE_INCOMPATIBLE previous version xxxx, 查看ref1, 以爲找到了答案,即instance run造成了多個版本的在build/immediate中的apk, 照做,刪除,用./gradlew assembleDebug也編譯了一次仍然失敗;
執行了adb uninstall “com.miui.hybrid”, 報不能刪除該應用;
原來這是無法adb root造成,工程機刷的是非dev版本miui, 無法adb root, 無法刪除系統級別的framework apk. 我之前刪除的只是mockup版本;
所以對於刷機成非root版本的工程機,只能安裝的是mockup版本.
duang-duang-duang
重新編譯mockup(path:hap/quickapp/mockup/platform/android)版本
./gradlew iD // 成功
sync debugger(path: hap/debug/shell/android)版本, 成功;