在使用Android统一资源定位符file//android_res/ 出现 ClassNotFoundException 的问题分析

最近在一个项目中使用统一资源定位符的时候,出现一个很诡异的问题,同样的代码,同样的资源放在两个不同的项目工程里,有一个工程正常运行,另一个工程运行异常,报ClassNotFoundException,具体问题和原因,我慢慢道来。

说一下项目使用的场景,有一个html文件需要国际化,所以把该html文件从assets文件夹移动到raw文件夹,并添加了国际化支持,在其中一个项目中完美运行,经过测试js也能成功调用,符合我的使用要求,于是理所当然的移植到另一个项目中,原本以为也会顺利运行,哪晓得打开后,给我一个大大的ERR_FILE_NOT_FOUND,立马打开Logcat,看到以下报错信息:

AndroidProtocolHandler: Unable to open resource URL: file:///android_res/raw/error.html
java.lang.ClassNotFoundException: 
Didn't find class "aaa.bbb.ccc.ddd.eee.R$raw" on path: 
DexPathList[[zip file "/data/app/aaa.bbb.ccc.ddd-1/base.apk"],
nativeLibraryDirectories=[/data/app/aaa.bbb.ccc.ddd-1/lib/arm64, 
/system/lib64, /vendor/lib64]]                                                                                       
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)

开始排查是不是路径错误、是不是构建混淆问题,但排查的结果是两边几乎完全一致,没有这些问题,当时我是懵逼的,随后我就去打了一杯水,慢慢的把目光望向窗外,看到门口地铁施工工地龙门吊上醒目地“勇于跨越,追求卓越”8个大字,于是回来仔细的又看来一遍代码和Logcat日志,于是发现了一个奇怪的地方:

报错的R文件跟我实际使用的R文件不一致,因为manifest里面的包名和applicationId不一致,导致通过统一资源定位符无法找到我的那个文件,需要修改manifest里面的包名与applicationId一致,这样就可以顺利找到raw文件。

标签:none