在拿到一个apk时,没有源码怎么去修改这个apk中的风格?如图片,图文字颜色?
这种情况下可以使用android 运行时(RRO)替换策略去修改。
运行时overlay(RRO), 是在app启动时,获取资源时,使用自定义资源替换原来的资源。
RRO需要有两个应用,一个是原应用(需要替换资源的应用,比如下面录音机应用),另外一个是用来生成替换资源的应用(没有code)。
1. 创建一个新的项目,在AndroidManifast.xml中配置:
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.android.overlayPackage"> <overlay android:priority="1" android:targetPackage="com.android.soundrecorder" /> </manifest>
package: 包名随便命名,不过最好的命名规则是com.android.soundrecorder.overlay,就是包名+overlay,这样更容易理解。为了简单,就不提换了。
关键词:overlay便签 是标识这个应用支持overlay
priority : 配置overlay.apk的优先级,值越大,优先级越高。如果有多个overlay.apk, 系统就会根据这个值从大到小的顺序获取资源。
targetPackage:被替换的包名,这里要替换的目标是录音机
我们想要替换录音机界面的背景(蓝色区域)。
2. 如果是有源码的话就找到这个背景设置资源的id,没有源码就反编译apk(把原apk 改名为zip格式,直接解压出来,在res中查找),再找到这个id。 id为statusbar_color_blue。
这里是用颜色值来填充的,所以在res/colors.xml 中配置:
<resources> <!-- The color tints to apply to the text and drag view when hovering over the delete target or the info target --> <color name="statusbar_color_blue">#000000</color> </resources>
把蓝色背景替换为黑色背景。
到现在为止就完成这个overlay.apk的配置。
汇总一下就是第一步只要配置androidManifast.xml,增加overlay标签。 第二步获取资源id,并在相应的xml中(colors.xml、strings.xml ...)中声明这个id,并赋值为我们需要的资源。
3.现在编译这个apk。
4. 编译完成后把这个apk push到 vendor/overlay/中,重启手机,打开原apk,你会发现这个背景变成黑色的了。
RRO原理:
在资源编译打包后会在R.java中生成对应的id, 这个id 遵循如下原则:
0xppttiiii
其中,
pp:01表示是系统资源,7f表示是应用资源
tt:用于表示资源类型,如string、array、图片资源等
iiii:用于表示相同类型的不同资源
当应用使用getDrawable 或getString调用图片或字串时,会调用系统的getResource方法,该方法会根据资源id及设备配置信息(语言、像素密度等)来查找并返回合适的图片资源。
如果id表示的是系统资源,会从framework-res.apk中获取; 如果是表示的是应用资源,会从应用或overlay中获取对应的资源。
这个时候,overlay的优先级会高于app,所以优先overlay中的资源。
如果多个overlay.apk, 会根据定义的priority 属性的值来获取。
比如有两个,一个android:priority="1" 另一个是android:priority="2", 会优先priority为2的overlay apk中获取,如果没有在priority为1中获取,如果没有,则中原app中获取。
谢谢!
参考:https://www.jianshu.com/p/9304089c513d