Tencent / Shadow

零反射全动态Android插件框架
BSD 3-Clause "New" or "Revised" License
7.37k stars 1.29k forks source link

同一份代码,android 4.4 ClassNotFoundException ,高版本(如android 8)正常 #1256

Closed duxiyao closed 5 months ago

duxiyao commented 7 months ago

在业务代码上报错找不到类,所以就想在sample上验证多dex插件包,如下图: image 并没有加上业务代码,只是在sample-app里的libs下放一个aar,使得方法数超过 64K ,开启 multiDexEnabled true然后debug运行,在android 8上正常启动,但android 4.4上报错,debug代码报错位置为: image 上图为android 8上,能正常找到加载com.tencent.shadow.core.manifest_parser.PluginManifest; image 上图为android 4.4上的报错,与android 8是同一个包

由于libs下aar无法对外,所以没有提供push代码,随便找一个手头大点的aar,都可以,辛苦大佬们谁看见了帮忙解答下。

大致在projects--sample里的改动: build.gradle里加了: multiDexEnabled true implementation fileTree(dir: 'libs', include: ['.jar', '.aar'])

UseCaseApplication里加了 @Override protected void attachBaseContext(Context base) { super.attachBaseContext(base); MultiDex.install(this); }

然后加了libs文件夹,里头放了个较大的aar

shifujun commented 7 months ago

这里确实是需要额外keep一下PluginManifest类。其实可以在transform里让ShadowApplication引用一下这个类,就不用手工keep了。不过MultiDex库本来也要写keep,而且这个场景也不太常见了。暂时就不写这个自动化了。

这是例子: 8aae25868ebff05438646a24657706fa2e5aa925

duxiyao commented 7 months ago

这里确实是需要额外keep一下PluginManifest类。其实可以在transform里让ShadowApplication引用一下这个类,就不用手工keep了。不过MultiDex库本来也要写keep,而且这个场景也不太常见了。暂时就不写这个自动化了。

这是例子: 8aae258

非常感谢大佬指点!!!这个问题解决了。

另外想请教个问题哈,在4.4上,就是分dex打包后,有的类没在主dex中,在class2.dex 或者 class3.dex class4.dex中,有时候访问不到,会找不到类,这个是什么原因呀。同样的包高版本没问题

shifujun commented 7 months ago

另外想请教个问题哈,在4.4上,就是分dex打包后,有的类没在主dex中,在class2.dex 或者 class3.dex class4.dex中,有时候访问不到,会找不到类,这个是什么原因呀。同样的包高版本没问题

https://developer.android.com/build/multidex