工作Android項目編譯札記

最近一頭扎進安卓的坑。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)版本, 成功;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章