目录
记录项目升级androidX+API29的各种坑1
记录项目升级androidX+API29的各种坑2
前言
年前的时候,公司为了业务发展,签署了一个第三方的代码库,需要我们集成,然后这个项目是依赖于androidX和各种各样新库.所以为了集成该项目,我们强制升级了我们的gradle,依赖库,目标api版本.我们的项目一直使用API27作为target和build的版本,所以在前期利用api版本避免了很多坑,自从集成了这个项目,噩梦开始了
正文
升级
升级比较简单,首先修改
classpath 'com.android.tools.build:gradle:3.2.0'
然后将gradle版本改为4.6(因为最低支持4.6)
最后使用Android studio的一键修改
最后使用全文搜索,将support.v搜索一遍,将项目中所有support包替换成对应的androidX库
问题1
问题:项目跑不起来,报错无明显信息
解决过程:编译时一直盯着控制台,发现在混淆过程中,androidx包被混淆了
解决方案:
-keep class com.google.android.material.** {*;}
-keep class androidx.** {*;}
-keep public class * extends androidx.**
-keep interface androidx.** {*;}
-dontwarn com.google.android.material.**
-dontnote com.google.android.material.**
-dontwarn androidx.**
不混淆所有androidx相关代码
问题2
问题:android10手机安装应用,log一直打印com.loc包相关信息,时间久了就内存溢出
解决过程:寻找loc包,发现是高德地图定位时,获取唯一设备信息一直异常,android10以后禁止了这一行为,发现高德地图定位包太老了
解决方案:更新高德地图定位包
问题3
问题:一个页面通过webview展示的图片不展示
解决过程:发现通过loadData不展示,通过loadUrl的方式可以,后来(百度,谷歌)发现10以后loadData需要base64数据处理
解决方案:
if (Build.VERSION.SDK_INT>=Build.VERSION_CODES.Q){
String newhtml_code = Base64.encodeToString(htmlStr.getBytes(), Base64.NO_PADDING);
webview.loadData(newhtml_code,"text/html", "base64");
}else{
webview.loadData(htmlStr, "text/html; charset=UTF-8", null);
}
问题4
问题:某个第三方请求老失败
解决过程:查了下他发的请求是http
解决方案:让第三方使用http请求
<uses-library
android:name="org.apache.http.legacy"
android:required="false" />
问题5
问题:android10手机上相册看不到图片
解决过程:百度啊(为啥不谷歌?先百度看看国内怎么解决),10嘛,一看就是储存权限问题
解决方案:
临时方案
当target=29时,谷歌临时允许使用老版本的权限来解决储存分区问题
<application
android:name=".MainApplication"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:requestLegacyExternalStorage ="true"
>
问题6
问题:使用tabLayout的反射获取变量崩溃
解决过程:打开页面就崩溃,后来发现tabLayout设置Indicator宽高时使用反射获取内部类变量修改的,名字叫mTabStrip,你们快搜搜,有的话在AndroidX里已经改为slidingTabIndicator
解决方案:
Class<?> tabLayout = tabs.getClass();
Field tabStrip = null;
try {
tabStrip = tabLayout.getDeclaredField("slidingTabIndicator");
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
尾
目前先记录这么多,目前还在测试中,遇到什么问题继续记录