适配Android技术知识Android 技术收集

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

2020-03-02  本文已影响0人  bridegg

前言

年前的时候,公司为了业务发展,签署了一个第三方的代码库,需要我们集成,然后这个项目是依赖于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();
        }

目前先记录这么多,目前还在测试中,遇到什么问题继续记录

上一篇 下一篇

猜你喜欢

热点阅读