android打包固定id
前言
6月份跳槽来了一家广告公司,整个业务逻辑就是流量玩法,上架市场,买量,赚广告费。因为gp上架越来越难,就衍生出一种玩法叫AB面。关于AB面,这里先不讲,主要说说B包的资源处理。这篇没技术,单纯自己记下来当笔记用。
id
id其实是个整数,应用内的id一般情况是0x7fxxxxxx,这个hex其实是package,type,value的结构。而代码中如果有R.id.xx,会在编译时直接替换成该整数。做AB面的包,B包都是通过动态加载的,这就导致这个整数,必须在使用时,和你的资源对应。10年有,有种粗暴的解决办法,就是构建一个自己的aapt,可以指定package,也就是前面的7f,然后再用添加Resources的方式,将资源添加到资源管理器中。这样就能一劳永逸。B包打包,使用0x7e的资源,A包不处理,这样AB的资源就不会冲突。
1 | android{ |
固定id
上述方法是打包了两套resource,缺点就是需要将自己的Resources添加到系统Resources,如果资源少,又想尽量避免动态加载资源,直接指定需要指定的资源id就行。而aapt恰好就提供了一个参数--stable-ids。
- 在A包中对应资源位置添加B包的资源,构建B包
- 在build/intermediates/stable_resource_ids_file/release/processReleaseResources/stableIds.txt,能找到B包的资源,复制你想要固定的id。
- 将复制出来的内容,加到app/public.txt
- gradle添加如下,然后build。构建完成不放心可以Analyze APK看一看
1
2
3
4
5
6
7
8
9
10
11
12
13android{
aaptOptions {
// 注意路径
File publicTxtFile = project.file('public.txt')
if (publicTxtFile.exists()) {
project.logger.error "${publicTxtFile} exists, apply it."
//-stable-ids
aaptOptions.additionalParameters("--stable-ids", "${publicTxtFile}")
} else {
project.logger.error "${publicTxtFile} not exists"
}
}
}
其它方案
- 自定义aapt、dex字节修改,市面上有一些开源工具。
- 转换调用。11年的时候,做过一款sdk,当时采用的是提供了一个工具类,包含一堆getxxxID函数。然后,所有调用资源全使用get函数调用不打入jar包(可以理解为B包),工具类提供给商户(A包)。