插件化之资源id冲突问题
2019-04-14 本文已影响0人
__hgb
由于插件apk中和宿主apk各自打包,插件资源id有可能会和宿主中的资源id产生冲突。而解决这个问题,可以有两种思路。
解决方案一
Android打包过程中需要用到aapt工具来为资源生成资源id,而我们可以修改插件资源id前缀,就可以避免发生冲突。
每一个资源都对应一个十六进制的变量。由三部分组成,package id+typeid+entry id.
package id:apk的package id默认为0x7f.
type id:举个例子,为attr,string,drawable的类型id.
entry id:类型id分类下从0开始的值。
修改AAPT代码步骤如下:
1)在aapt的命令行参数中传递apk打包时的前缀值。
2)把这个值设置给Bundle实体的mApkModule字段,作为ResourceTable构造函数的参数传递进去。
3)在ResourceTable构造函数中,读取Bundle参数中的mApkModule值,设置给package id。
解决方案二
在Android打包生成recources.arsc文件后,对这个recources.arsc文件进行修改,把packageid修改为0x71.
大体思路如下:
1)拦截processReleaseResources这个task.在执行aapt命令之后,会生成一个R.java文件,里面定义了每个资源的id值,我们修改了它的pakage id,并且生成一个新的R.java文件。把recources.arsc文件中的资源也都修改了它的package id.
2)拦截compileReleaseJavaWithJavac这个原生task.把旧的R.java文件生成的class文件删除掉。重新执行javac命令,编译新的R.java文件。