记录项目升级 AndroidX+API29 的各种坑

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 迁移到 Androidx
3 碎阅:一款基于 douban 及 ONE API 开发的资讯类 App
4 MVVM 最新学习心得
5 Android 后台运行白名单,优雅实现保活

如果你有写博客的好习惯

欢迎投稿

点个在看,小生感恩❤️

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值