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,适配性更好。步骤如下:
- 编译带coverage的应用:
m coverage
- 安装编译好的APK:
adb install -r out/target/product/[你的设备型号]/system/app/YourApp/YourApp.apk
- 打开应用进行手动测试,测试完成后导出覆盖率数据:
adb pull /data/data/com.panasonic.dairse.lo/files/coverage.ec ./
- 生成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
相关产品推荐
相关产品推荐

