目錄
記錄項(xiàng)目升級(jí)androidX+API29的各種坑1
記錄項(xiàng)目升級(jí)androidX+API29的各種坑2
前言
年前的時(shí)候,公司為了業(yè)務(wù)發(fā)展,簽署了一個(gè)第三方的代碼庫,需要我們集成,然后這個(gè)項(xiàng)目是依賴于androidX和各種各樣新庫.所以為了集成該項(xiàng)目,我們強(qiáng)制升級(jí)了我們的gradle,依賴庫,目標(biāo)api版本.我們的項(xiàng)目一直使用API27作為target和build的版本,所以在前期利用api版本避免了很多坑,自從集成了這個(gè)項(xiàng)目,噩夢(mèng)開始了
正文
升級(jí)
升級(jí)比較簡(jiǎn)單,首先修改
classpath 'com.android.tools.build:gradle:3.2.0'
然后將gradle版本改為4.6(因?yàn)樽畹椭С?.6)
最后使用Android studio的一鍵修改
最后使用全文搜索,將support.v搜索一遍,將項(xiàng)目中所有support包替換成對(duì)應(yīng)的androidX庫
問題1
問題:項(xiàng)目跑不起來,報(bào)錯(cuò)無明顯信息
解決過程:編譯時(shí)一直盯著控制臺(tái),發(fā)現(xiàn)在混淆過程中,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相關(guān)代碼
問題2
問題:android10手機(jī)安裝應(yīng)用,log一直打印com.loc包相關(guān)信息,時(shí)間久了就內(nèi)存溢出
解決過程:尋找loc包,發(fā)現(xiàn)是高德地圖定位時(shí),獲取唯一設(shè)備信息一直異常,android10以后禁止了這一行為,發(fā)現(xiàn)高德地圖定位包太老了
解決方案:更新高德地圖定位包
問題3
問題:一個(gè)頁面通過webview展示的圖片不展示
解決過程:發(fā)現(xiàn)通過loadData不展示,通過loadUrl的方式可以,后來(百度,谷歌)發(fā)現(xiàn)10以后loadData需要base64數(shù)據(jù)處理
解決方案:
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
問題:某個(gè)第三方請(qǐng)求老失敗
解決過程:查了下他發(fā)的請(qǐng)求是http
解決方案:讓第三方使用http請(qǐng)求
<uses-library
android:name="org.apache.http.legacy"
android:required="false" />
問題5
問題:android10手機(jī)上相冊(cè)看不到圖片
解決過程:百度啊(為啥不谷歌?先百度看看國(guó)內(nèi)怎么解決),10嘛,一看就是儲(chǔ)存權(quán)限問題
解決方案:
臨時(shí)方案
當(dāng)target=29時(shí),谷歌臨時(shí)允許使用老版本的權(quán)限來解決儲(chǔ)存分區(qū)問題
<application
android:name=".MainApplication"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:requestLegacyExternalStorage ="true"
>
問題6
問題:使用tabLayout的反射獲取變量崩潰
解決過程:打開頁面就崩潰,后來發(fā)現(xiàn)tabLayout設(shè)置Indicator寬高時(shí)使用反射獲取內(nèi)部類變量修改的,名字叫mTabStrip,你們快搜搜,有的話在AndroidX里已經(jīng)改為slidingTabIndicator
解決方案:
Class<?> tabLayout = tabs.getClass();
Field tabStrip = null;
try {
tabStrip = tabLayout.getDeclaredField("slidingTabIndicator");
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
尾
目前先記錄這么多,目前還在測(cè)試中,遇到什么問題繼續(xù)記錄