工作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)版本, 成功;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值