美文网首页
插件化之资源id冲突问题

插件化之资源id冲突问题

作者: __hgb | 来源:发表于2019-04-14 21:42 被阅读0次

    由于插件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文件。

    相关文章

      网友评论

          本文标题:插件化之资源id冲突问题

          本文链接:https://www.haomeiwen.com/subject/gttewqtx.html