code小生 一个专注大前端领域的技术平台公众号回复Android加入安卓技术群
作者:bridegg链接:https://www.jianshu.com/p/2dc5e7a25dc3声明:本文已获
bridegg授权发表,转发等请联系原作者授权
目录
记录项目升级androidX+API29的各种坑1 https://www.jianshu.com/p/2dc5e7a25dc3
记录项目升级androidX+API29的各种坑2 https://www.jianshu.com/p/89f0ba854da2
前言
年前的时候,公司为了业务发展,签署了一个第三方的代码库,需要我们集成,然后这个项目是依赖于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(); }
尾
目前先记录这么多,目前还在测试中,遇到什么问题继续记录
相关阅读
1 总是听到有人说AndroidX,到底什么是AndroidX?2 Android 迁移到 Androidx3 碎阅:一款基于 douban 及 ONE API 开发的资讯类 App4 MVVM 最新学习心得5 Android 后台运行白名单,优雅实现保活
如果你有写博客的好习惯
欢迎投稿
点个在看,小生感恩 ❤️