You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Android.mk通过mm命令构建的APK安装后运行异常问题的排查与解决

解决AOSP中mm构建APK启动崩溃(ClassNotFoundException)的问题

从你的崩溃日志和配置来看,核心问题是编译后的APK的Dex文件中没有包含MainActivity的字节码,导致系统无法找到这个类。结合你对比Gradle构建的差异,下面是针对性的排查和修复方案:

一、先定位问题根源

首先确认你的Java代码是否真的被编译进了APK:

  1. 找到mm构建生成的APK文件(通常在out/target/product/[你的设备型号]/obj/APPS/[你的包名]_intermediates/apk/目录下)
  2. 执行命令检查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

三、关键注意事项

  1. 包名一致性:LOCAL_PACKAGE_NAME必须和AndroidManifest.xml中的package="com.example.mediadecode"完全匹配,崩溃日志中已经显示包名是com.example.mediadecode,之前你写的mediadecode是错误的!
  2. 源文件路径:all-java-files-under的参数是相对于LOCAL_PATH的路径,如果你的Java代码在mk所在目录/java/下,这个配置就正确;如果结构不同(比如之前的app/src/main/java),需要调整为对应的相对路径。
  3. 依赖库验证:确保AOSP源码中包含你引用的AndroidX库,如果你是自定义的AOSP分支,可能需要提前编译这些依赖模块。
  4. 清理构建缓存:每次修改Android.mk后,先执行mm clean再重新构建,避免旧缓存干扰:
    mm clean && mm
    

四、系统应用的额外配置

如果要把应用做成系统应用,还需要:

  1. 在设备的device/[厂商]/[设备型号]/product.mk或device.mk中添加:
    PRODUCT_PACKAGES += com.example.mediadecode
    
  2. 编译完整系统镜像时,应用会自动被打包到/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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 04:04:08