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
2
3
4
5
android{
aaptOptions {
additionalParameters "--package-id", "0x7E", "--allow-reserved-package-id"
}
}

固定id

上述方法是打包了两套resource,缺点就是需要将自己的Resources添加到系统Resources,如果资源少,又想尽量避免动态加载资源,直接指定需要指定的资源id就行。而aapt恰好就提供了一个参数--stable-ids

  1. 在A包中对应资源位置添加B包的资源,构建B包
  2. 在build/intermediates/stable_resource_ids_file/release/processReleaseResources/stableIds.txt,能找到B包的资源,复制你想要固定的id。
  3. 将复制出来的内容,加到app/public.txt
  4. gradle添加如下,然后build。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    android{
    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"
    }
    }
    }
    构建完成不放心可以Analyze APK看一看

其它方案

  1. 自定义aapt、dex字节修改,市面上有一些开源工具。
  2. 转换调用。11年的时候,做过一款sdk,当时采用的是提供了一个工具类,包含一堆getxxxID函数。然后,所有调用资源全使用get函数调用不打入jar包(可以理解为B包),工具类提供给商户(A包)。