美文网首页适配Android技术知识Android 技术收集
记录项目升级androidX+API29的各种坑

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

作者: bridegg | 来源:发表于2020-03-02 17:09 被阅读0次

    前言

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

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

    相关文章

      网友评论

        本文标题:记录项目升级androidX+API29的各种坑

        本文链接:https://www.haomeiwen.com/subject/duuvkhtx.html