个推Push SDK 2.12.5.0初始化函数中会调用boolean com.igexin.push.util.a.b(Context context);函数。
该方法对libgetuiext3.so做了存在性校验,但是插件化后,对应动态库不在原始目录上,校验失败,导致个推不初始化,push功能异常。
之所以会校验失败,是因为插件化后该动态库位于/data/data/packageName/app_plugins/pluginName/pluginVersion/lib/libgetuiext3.so目录下,不在常规目录下
对应校验方法如下:
1 | public static boolean b(Context var0) { |
个推初始化函数中调用了该校验方法,并且校验失败后直接return
1 | public <T extends Service> void initialize(Context var1, Class<T> var2) { |
虽然会进行该校验,但是实际加载的so其实还是由我们插件化的框架控制,加载的真正的文件是插件目录下的so,因此,只要绕过上述存在性校验即可。
目前共有几种解决方案,但都不完美:
1、让个推打一个定制版,去掉so路径校验。忽略此方案,依赖个推。
2、在宿主中放一个空的同名so文件,此方案虽然可行,但是会在宿主莫名其妙的多一个空文件存在,并不完美,作为备选方案。
3、编译期利用AOP进行环绕通知切除,修改方法返回值。此方案虽然可行,但是会额外引入AspectJ依赖,不考虑。
最终采取方法3进行实行,既不依赖个推,又可以解决问题。
接着就是编写一个脚本,使用javassist将该校验方法进行修改,强制返回true即可。
1 | project.afterEvaluate { |
将修改完成后的aar发布到私服上,引用修改后的aar即可。
