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

AOSP引入emma.jar编译成功但运行崩溃:ClassNotFoundException问题求助

解决AOSP集成Emma.jar运行崩溃的问题

嘿,我之前在AOSP项目里搞代码覆盖率的时候也踩过Emma的坑,编译过了但一运行就崩,跟你这个报错一模一样。咱们来一步步排查解决:

1. 先检查Android.mk的集成配置是否正确

编译成功不代表jar包真的被正确打包进APK了,大概率是你在Android.mk里的引用方式有问题。试试这样配置:

首先在存放emma.jar的目录下创建单独的Android.mk片段:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := emma
LOCAL_SRC_FILES := emma.jar  # 确保路径和你的jar位置一致
include $(PREBUILT_STATIC_JAVA_LIBRARY)

然后在你的应用模块的Android.mk里引用这个预编译库:

include $(CLEAR_VARS)
LOCAL_PACKAGE_NAME := com.panasonic.dairse.lo  # 你的应用包名
LOCAL_STATIC_JAVA_LIBRARIES := emma
# 其他原有配置(比如LOCAL_SRC_FILES、LOCAL_RESOURCE_DIR等)
include $(BUILD_PACKAGE)

配置完后clean重新编译:

make clean && make your_app_module_name

2. 验证Emma版本与AOSP环境的兼容性

Emma是比较老的工具了,很多新版本的AOSP(比如Android 10+)用的JDK版本更高,可能和旧版Emma不兼容。建议你:

  • 确认你用的emma.jar是适配JDK 1.8+的版本(如果你的AOSP用JDK11的话,得找兼容的Emma分支)
  • 检查jar包是否完整,重新下载一个官方的emma.jar替换试试

3. 排查类加载与打包权限问题

AOSP系统应用的类加载规则和普通第三方APP不一样,报错里的ClassNotFoundException可能是Emma的类没被加载到系统类路径里。如果你的应用是系统应用:

  • 试试把Emma jar放到framework层的frameworks/base/core/java目录下,然后在framework的Android.mk里引用,再重新编译framework和应用
  • 确保编译时没有开启混淆或者压缩规则把Emma的类给剔除了,在proguard.cfg里加上:
-keep class com.vladium.emma.** { *; }
-keep class org.apache.tools.ant.** { *; }

4. 更省心的替代方案:用AOSP原生Coverage工具

其实AOSP本身自带了代码覆盖率统计工具,不用额外集成Emma,适配性更好。步骤如下:

  1. 编译带coverage的应用:
m coverage
  1. 安装编译好的APK:
adb install -r out/target/product/[你的设备型号]/system/app/YourApp/YourApp.apk
  1. 打开应用进行手动测试,测试完成后导出覆盖率数据:
adb pull /data/data/com.panasonic.dairse.lo/files/coverage.ec ./
  1. 生成HTML覆盖率报告:
java -jar out/host/linux-x86/framework/emma.jar report -r html -in coverage.ec -in out/target/common/obj/APPS/YourApp_intermediates/classes-emma.jar

这个方案我自己在多个AOSP版本上用过,基本不会出现类找不到的问题,推荐试试。

内容的提问来源于stack exchange,提问作者Nikhil S

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:27:22