术语:
1.游戏apk(app):需要插入广告的游戏app,以下统称游戏app或游戏apk。
2.广告apk(app):接入了广告sdk的app,以下统称为广告app或广告apk。
本专栏文章以接入4399广告sdk为例。
本专栏文章适合有一定的android开发经验的developer阅读
需要配置的选项:
1.包名
2.appName
3.appIcon
4是否有闪屏广告
5广告id
步骤:
1.反编译游戏app待用。(付费文章可展开)
2.新建android工程(付费文章可展开)。接入4399广告sdk,编译生成sdk。
3.反编译广告sdk待用。
4.合并public.xml文件(可单独写一个public.xml的介绍)
publc.xml是aapt在打包资源时用来固定资源id的,如果资源在public.xml中有对应的id了,那么打包资源时就用已经有的id。
在开发中我们通常使用 Resources.getXXX(resid) 来获取某个资源,传入的是 ID 这个 ID 定义在 R.XXX 类里面,R 类是编译器自动生成的。
而 apktool 在重新打包 apk 的时候会对资源重新编译 (编译成 resources.arsc 你有zip打开 apk 看得到
编译资源的时候自然需要对所有资源ID进行重新编排(这是一个随机过程)试想假设原包里面 drawable/a.png id=0x7f020003 那么重新编排资源ID后就可能是 0x7f020004 又假设原包 0x7f020004 对应图片 b.png,那你重新打包后的 apk 当显示 a.png 的时候就会替换成 b.png,这还好不会出错,倘若生成的一个 id 原包不存在,那会导致程序崩溃的!
所以 public.xml 的作用就是把对象资源 ID 写死!
以游戏apk为基准文件,将广告sdk的public.xml合并。
合并原则:
在一个public.xml文件中,同类型比如attr对应的PackageId+TypeId是不能变的,否则回编译失败。因此要添加数据时,数据的PackageId+TypeId需要纠正为matrixPublic的值。
其次资源值,不能和已有的资源值重复,正常情况下public.xml中的值是aapt生成的有序的,这里可以扫描matrixPublic中attr类型值的最大值,然后加一作为新加的iconSrc的id值
4.1 将游戏app的public.xml资源id分类并保存,
4.2将sdkapp的public.xml文件资源id分类
4.3 找出游戏app的public.xml分类后的id中的最大值
4.5 将sdkapp的public.xml同类型的资源id值在4.3找出的最大值上+1,知道所有的sdkapp的public.xml中的同类型资源id处理完毕。
4.6 将4.5处理完的资源id合并到游戏app的public.xml的同类型资源下。
5.修改包名下的R文件
根据合并后的public.xml文件以此修改不同的资源及对应的id值
6.合并其他文件
注意多dex的情况,将不紧急的smail包放到第二个或更后面的dex
7.分析插入广告代码点
8.插入广告代码
9.重新打包。