近期因需要集成新的第三方库,发现其用的是jdk11,而且sdk版本较高,无法兼容之前的老项目代码,故抽时间把as更新升级到北极狐版本,重新进行适配。下面记录一下其中遇到的一些问题。
问题1:gradle版本不匹配。
原来的as 3.0我的配置如下:
gradle-wrapper.properties gradle-4.1-all.zip
build.gradle gradle:3.0.0
升级到北极狐之后,as提示需要将gradle-wrapper里面配置到4.8以上,其搭配使用的build.gradle里面版本号也需要更新。综合测试几个版本,最终配置如下:
gradle-wrapper.properties gradle-6.7.1-all.zip
build.gradle gradle:4.2.1
手动下载gradle的地址如下: Gradle Distributions
问题2:jdk11的安装
参考如下: 2020最新java JDK11下载、安装与环境变量配置图文教程 - 知乎 (zhihu.com)
问题3:依赖库的变更
因Jcenter服务关闭,切换到mavenCentral,参考如下:Jcenter服务即将关闭,改用mavenCentral
问题4:
JNI的库报重复定义:
2 files found with path 'lib/armeabi-v7a/lib*****.so'.
If you are using jniLibs and CMake IMPORTED targets, see
https://developer.android.com/r/tools/jniLibs-vs-imported-targets
修改build.gradle如下:
sourceSets{ main{ jniLibs.srcDirs=[]//解决as更新到4.0以后的两个lib库的问题 //jniLibs.srcDirs=['libs'] } }
或者增加如下:
packagingOptions { pickFirst 'lib/armeabi-v7a/lib****.so' pickFirst 'lib/armeabi-v7a/libiconv.so' }
参考来源:Execution failed for task ':sdk:mergeDebugNativeLibs' - 长尾景虎 - 博客园 (cnblogs.com)
问题5.
Android8.0之后的服务启动方式变更。
adb shell am start-foreground-service -n com.xx.xxx/com.xx.xxx.MainService
问题6.
运行在加载JNI库的位置System.loadLibrary("****");崩溃,没有详细崩溃信息。能看到的报错如下:
05-29 11:33:02.855 1074 1116 I ActivityManager: Start proc 11437:com.**.**/u0a95 for service {com.**.**/com.**.**.MainService}
05-29 11:33:02.890 11437 11437 E AndroidRuntime: Process: com.**.**, PID: 11437
05-29 11:33:02.890 11437 11437 E AndroidRuntime: at com.**.**.JniApi.<clinit>(JniApi.java:33)
05-29 11:33:02.890 11437 11437 E AndroidRuntime: at com.**.**.JniApi.getInstance(JniApi.java:63)
很奇怪的错误,折腾了一整天的时间,后面实在没招了换到另一款RK芯片Android10的机型上跑,才出现较为详细的加载库报错信息。如下:
05-29 11:29:44.878 18148 18148 E AndroidRuntime: java.lang.UnsatisfiedLinkError: dlopen failed: library "libcutils.so" not found: needed by /data/app/~~UGG4vA7PaAc3XqhaCSnf-w==/com.***.***-lGjPNN8pdMCyliNwuJyWEA==/lib/arm/lib****.so in namespace classloader-namespace
05-29 11:29:44.878 18148 18148 E AndroidRuntime: at com.***.***.JniApi.<clinit>(JniApi.java:33)
初步猜测是MTK平台或者次级开发商对系统进行了裁剪,导致报错不全。
add: 另一种处理方式:使用 objdump -p lib*****.so | grep NEEDED 查询出依赖库信息,然后逐个去设备里面找是否存在此库。
问题7
启动服务报错:Reason: Context.startForegroundService() did not then call Service.startForeground(): ServiceRecord{
参考 Android Service 系列2. Android开机启动Service和“ did not then call Service.startForeground()”异常-优快云博客