本文说明如何解决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,增加

LOCAL_USE_AAPT2 := true

切换导入的package

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

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