背景:
接手的老項目targetSdkVersion=28,為了使用新的api,養成好的編碼習慣,第三方sdk升級,Google上架等一些列原因吧,需要升級targetSdkVersion,擁抱新變化...代價就是一些列問題,記錄下留個腳印。
當前時間Google要求上架是31,對應Android12,我這邊直接升級到33了,
android = [
compileSdkVersion: 33,
buildToolsVersion: "30.0.2",
minSdkVersion : 19,
targetSdkVersion : 33,
versionCode : 100,
versionName : "1.0.0"
]
1.Installed Build Tools revision 33.0.0 is corrupted. Remove and install again using the SDK Manager.
buildToolsVersion編譯版本設置30以上會有這個報錯,buildeToolVersion是你構建工具的版本,其中包括了打包工具aapt、dx等等。這個工具的目錄位于..{$自己的sdk路徑}/build-tools/XX.XX.XX。
這個可以不設置,不設置默認就是最新的;也可以考慮降低一下;這兩個方式我這邊測試都可以編譯通過,網上也有說修改文件的,個人不喜歡的方式,嘗試新建一個項目,也是沒有設置這個buildToolsVersion。
2.Type mismatch: inferred type is String? but String was expected
升級之后編譯檢查更嚴格了,不規范的代碼都要修改,沒啥可拉扯的,必須改了,苦力活~
1.確定是非空可以使用str!! ;
2.不確定的話可以使用?:"" 給個默認值(看下代碼如果字段有默認值,這里就一樣,沒有默認值給個空字符比null靠譜的)
推薦后者,起碼可以保證空安全,不會造成崩潰。這種一般都是剛開始用kotlin對空安全使用不規范造成的,編譯也不會報錯,額 我的項目可能需要改個99+處,整吧...逃不掉!
3.安裝失敗:INSTALL_PARSE_FAILED_MANIFEST_MALFORMED
安裝失敗,解決思路是去項目中所有的清單文件看看有啥報錯
1.permission is only granted to system apps
報錯位置添加 tools:ignore="ProtectedPermissions"
2.As of Android 12, android:exported must be set; use true to make the activity available to other apps, and false otherwise. For launcher activities, this should be set to true.
<intent-filter>標簽所在的Activity,provider,receiver,service里 添加加 android:exported="true"
3.經過上述還是存在安裝失敗的情況,要考慮是不是第三方sdk問題了
我這邊遇到的是AndroidStudio只提示安裝失敗也沒暴露什么信息,需要自己去看第三方的一些清單文件是不是也存在上述情況,有的話就需要更新輪子的版本。
- (如果猜測是第三方sdk問題,Androidstudio 直接運行安裝可能是沒有詳細報錯信息的,我是通過adb install apk路徑 安裝的方式發送有個第三方依賴報錯的,升級一下解決問題) *
4.使用 Android Studio 的 "Lint" 工具來檢查清單文件中的錯誤或潛在問題,tools-->App Links Assistant..
4.細分媒體權限:
將 READ_EXTERNAL_STORAGE 細分為IAMGES、VIDEO、AUDIO權限