Android 9 APK迁移

Creative Commons
本作品采用知识共享署名

本文说明如何解决Android 8迁移到Android 9时 AOSP内过Android.mk & make命令的自研APK运行错误的问题。

概述

在APK切换到Android 9后在之前正常运行的APK会出现运行时class不能找到错误,原因是Android 9的SDK support lib API已经切到androidx,参见:
https://android-developers.googleblog.com/2018/05/hello-world-androidx.html
https://developer.android.com/jetpack/androidx/
而Android 8迁移过来APK的Android.mk并未导入androidx,导致运行时找不到class,目前官网上提供的文章只说明了AS切换AndroidX的方法,没有说明AOSP下基于Android.mk如何修改,本文提供修改方法。

修改方法

应对找不到Class

Error inflating class androidx.appcompat.app.AlertController$RecycleListView)
修改AKP的Android.mk,增加

1
LOCAL_USE_AAPT2 := true

切换导入的package

1
2
3
4
5
6
7
8
9
10
LOCAL_STATIC_JAVA_LIBRARIES := \
androidx.appcompat_appcompat \ (对应之前的android-support-v7-appcompat)
androidx.legacy_legacy-support-v4 \ (对应之前的android-support-v4)
androidx.cardview_cardview \ (对应之前的android-support-v7-cardview)
androidx.recyclerview_recyclerview \ (对应之前的androidx.recyclerview_recyclerview)
LOCAL_AAPT_FLAGS := \
--auto-add-overlay \
--extra-packages androidx.recyclerview.widget \ (对应之前的android.support.v7.recyclerview)
--extra-packages androidx.cardview \ (对应之前的android.support.v7.cardview)
--extra-packages androidx.appcompat.app \ (对应之前的android.support.v7.appcompat)

处理class不能转换的问题

Class cast to error androidx.appcompat.app.AlertController cannot be cast to android.support.v7.app.AlertController
修改导入package

1
import androidx.appcompat.app.AlertDialog;                 //(对应之前的import android.support.v7.app.AlertDialog)

替换原则

package的对应替换可以在https://developer.android.com/jetpack/androidx/migrate#artifact_mappings找到
class的对应替换可以在https://developer.android.com/jetpack/androidx/migrate#class_mappings 找到
注意: package的替换链接给出的对应map是AS内的字样:
android.arch.core:common androidx.arch.core:core-common:2.0.0-rc01
写到Android.mk 将:替换成 _去掉版本号即可,例如上面应该对应的是androidx.arch.core_core-common