基于Android.mk通过mm命令构建的APK安装后运行异常问题的排查与解决
解决AOSP中
mm构建APK启动崩溃(ClassNotFoundException)的问题 从你的崩溃日志和配置来看,核心问题是编译后的APK的Dex文件中没有包含MainActivity的字节码,导致系统无法找到这个类。结合你对比Gradle构建的差异,下面是针对性的排查和修复方案:
一、先定位问题根源
首先确认你的Java代码是否真的被编译进了APK:
- 找到
mm构建生成的APK文件(通常在out/target/product/[你的设备型号]/obj/APPS/[你的包名]_intermediates/apk/目录下) - 执行命令检查Dex内容:
# 解压查看是否有classes.dex unzip -l [你的APK文件名].apk | grep classes.dex # 检查Dex中是否包含MainActivity unzip -p [你的APK文件名].apk classes.dex | dexdump -d | grep "Lcom/example/mediadecode/MainActivity;"
如果没有找到对应的类信息,说明你的Android.mk中Java源文件路径配置错误,代码根本没被编译。
二、修复Android.mk的关键配置
针对你的场景,调整后的Android.mk应该满足以下要求(假设你的Android.mk放在AndroidManifest.xml所在目录,比如app/src/main/):
ifeq ($(TARGET_FWK_SUPPORTS_FULL_VALUEADDS),true) ifeq ($(TARGET_BUILD_JAVA_SUPPORT_LEVEL),platform) LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) # 标记模块为可选,会被包含在完整系统构建中 LOCAL_MODULE_TAGS := optional # 核心:确保Java源文件路径正确! # 这里的"java"是相对于LOCAL_PATH(即mk所在目录)的Java代码根目录 LOCAL_SRC_FILES := $(call all-java-files-under, java) # 资源目录指向当前目录下的res文件夹 LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res # 启用AAPT2编译资源(和Android Studio一致) LOCAL_USE_AAPT2 := true # 依赖的AndroidX库,确保AOSP中已预编译这些模块 LOCAL_STATIC_ANDROID_LIBRARIES := \ androidx.core_core \ androidx.appcompat_appcompat \ androidx.fragment_fragment \ android-support-constraint-layout \ com.google.android.material_material # 调试阶段关闭Dex预优化,避免缓存问题;发布系统应用时可改为true LOCAL_DEX_PREOPT := false # 系统应用必须使用平台签名 LOCAL_CERTIFICATE := platform # 标记为特权应用(会安装到/system/priv-app目录) LOCAL_PRIVILEGED_MODULE := true # 包名必须和AndroidManifest.xml中的package字段完全一致! LOCAL_PACKAGE_NAME := com.example.mediadecode # 如果应用用到了私有平台API,开启此选项 LOCAL_PRIVATE_PLATFORM_APIS := true # 执行APK构建 include $(BUILD_PACKAGE) endif endif
三、关键注意事项
- 包名一致性:
LOCAL_PACKAGE_NAME必须和AndroidManifest.xml中的package="com.example.mediadecode"完全匹配,崩溃日志中已经显示包名是com.example.mediadecode,之前你写的mediadecode是错误的! - 源文件路径:
all-java-files-under的参数是相对于LOCAL_PATH的路径,如果你的Java代码在mk所在目录/java/下,这个配置就正确;如果结构不同(比如之前的app/src/main/java),需要调整为对应的相对路径。 - 依赖库验证:确保AOSP源码中包含你引用的AndroidX库,如果你是自定义的AOSP分支,可能需要提前编译这些依赖模块。
- 清理构建缓存:每次修改
Android.mk后,先执行mm clean再重新构建,避免旧缓存干扰:mm clean && mm
四、系统应用的额外配置
如果要把应用做成系统应用,还需要:
- 在设备的
device/[厂商]/[设备型号]/product.mk或device.mk中添加:PRODUCT_PACKAGES += com.example.mediadecode - 编译完整系统镜像时,应用会自动被打包到
/system/priv-app目录下;如果临时测试,可以用命令推送安装:adb root adb remount adb push out/target/product/[你的设备]/system/priv-app/com.example.mediadecode/com.example.mediadecode.apk /system/priv-app/com.example.mediadecode/ adb reboot
内容的提问来源于stack exchange,提问作者abirusabil
相关产品推荐
相关产品推荐

