学习笔记:插件化资源解决

简介: 学习笔记:插件化资源解决

一,资源获取

getResource传入R.资源名称,通过资源名称可以找到对应的资源ID(通过R.java文件保证),之后AssetManager通过资源ID找到对应的资源文件名称(通过arsc文件保证)

二,资源冲突:

插件和宿主使用aapt打包资源,aapt生成R和arsc文件是根据前缀信息(在aapt逻辑中apk默认为0X71)和资源顺序来进行命名的

因此会出现同一个资源ID在插件和宿主中都有对应的资源文件系统会出错。因此我们需要修改前缀即可保证,修改哪些前缀信息呢:

解决方案概述

根据上面的原理,可知道两种解决方案:

第一种

修改aapt脚本。我在aapt创建R,arsc文件时的源头上进行拦截,aapt使用我自定义的前缀这样出来的R文件和arsc文件里面的前缀就会和宿主不一样。【默认0X71(系统会根据不同的包用不同的前缀信息),使用自定义生成的R和arsc使用我自定义的前缀】

第二种

我在aapt打包后进行修改替换R和arsc文件。需要在aapt第一步整理生成对应的R.java(对应编译类型会生成不同的R文件varint)进行拦截,捕获原始的r.java文件修改之后编译为class存储起来。

之后再javac的过程中使用我们的这个class文件,取出arsc文件修改对应的前缀。

三,方案可行性:

第一种

简单直接,只需修改aapt中使用资源前缀的逻辑增加新case就好

缺点是需要进行修改aapt文件且不同SDK版本都需要生成一个aapt文件与之对应。

第二种

只需简单修改task名字即可,不需要根据不同sdk平台生成不同的aapt。复用性强。

缺点:需要修改的地方较多:1.生成R.java时还须修改完再次手动调用javac编译为class存储2.进行javac时在用之前生成的class。对arsc文件进行修改

方案二 不修改aapt,在打包后进行资源id冲突处理。将插件资源前缀改为0X71,72等 可自定义的数字防止资源冲突:同一个资源ID对应多个资源文件

四,优化资源复用问题:

很多情况下插件和宿主中的默认文件夹里面放的都是相同的资源比如android自动生成的那些图片等,占据着很多空间很少是自己独有的。

因此可以进行优化,提炼出一份名单位于这个名单里面的资源可以进行删除,时机是在生成我们修改后的R.java文件时我们可以根据这个名单删除对应资源

该方案是基于方案二提出的(方案一也可以进行该处理,只不过方案二更顺理成章).该方案已有开源框架实现~。

(默认的aapt在决定使用前缀时会进行case判断系统,library,apk然后使用不同的前缀。

方案一是对aapt进行修改,使用aapt时新增Bundle参数携带前缀信息,在使用前缀时增加新case,取出Bundle中的前缀信息,使用传入的前缀)。


相关文章
|
API 开发工具 Android开发
AppsFlyer 研究(一)AppsFlyer SDK 集成(1)
AppsFlyer 研究(一)AppsFlyer SDK 集成
1785 0
|
XML 图形学 C++
技术经验分享:ASSIMP概述
技术经验分享:ASSIMP概述
305 0
|
安全 数据处理 Android开发
安卓隐私权政策和Google Play规范更新
【4月更文挑战第14天】谷歌针对安卓平台的隐私权政策和Google Play规范进行重要更新,强化用户隐私保护和安全标准。新政策强调最小化数据收集,要求开发者明确告知用户敏感数据用途,并限制不必要的后台数据处理。Google Play规范更新要求应用详述数据收集方式,增加安全审查机制,确保无恶意代码。开发者面临调整,但有机会提升应用安全标准,赢得用户信任。用户数据安全得到提升,移动生态系统将更健康、可持续。
335 1
|
图形学
Unity 解决“... can only be called from the main thread”问题
“... can only be called from the main thread”
1160 0
|
缓存 安全 开发工具
Google Play上架总结(三)Google Play 上架流程(1)
Google Play上架总结(三)Google Play 上架流程
868 0
|
Android开发
【Android 逆向】APK 文件处理脚本 ApkTool.py ( 脚本简介 | 用法 | 分析 APK 文件 )(二)
【Android 逆向】APK 文件处理脚本 ApkTool.py ( 脚本简介 | 用法 | 分析 APK 文件 )(二)
541 0
【Android 逆向】APK 文件处理脚本 ApkTool.py ( 脚本简介 | 用法 | 分析 APK 文件 )(二)
|
开发工具
【Google Play】应用 “更新被拒“ 后续处理 ( 上传新版本后 , 一定要停用被拒的版本, 才可以通过审核 | 停用被拒的版本 | 送审 )(一)
【Google Play】应用 “更新被拒“ 后续处理 ( 上传新版本后 , 一定要停用被拒的版本, 才可以通过审核 | 停用被拒的版本 | 送审 )(一)
2203 0
【Google Play】应用 “更新被拒“ 后续处理 ( 上传新版本后 , 一定要停用被拒的版本, 才可以通过审核 | 停用被拒的版本 | 送审 )(一)
|
存储 JavaScript 前端开发
iOS逆向小知识: hook框架frida的安装和使用( frida Failed to spawn 的 解决方案)
iOS逆向小知识: hook框架frida的安装和使用( frida Failed to spawn 的 解决方案)
1488 0
|
Android开发
Android项目打包遇com.android.builder.internal.aapt.v2.Aapt2Exception: AAPT2 error: check logs for details
原文:Android项目打包遇com.android.builder.internal.aapt.v2.Aapt2Exception: AAPT2 error: check logs for details 版权声明:著作权归作者所有。
5578 0