一. activity 启动后resource 初始化流程
init.png- 该图描述了activity 启动一些列资源初始化的过程
- 红色字体处是获取apk内部资源的过程
二. activity 根据id获得资源的流程
demo.png- 该图描述了获取resource id 的过程,在初始化启动流程结束后, 会缓存一个resource table ,从本地缓存中取出资源id
以上resource图片摘抄自网络(https://www.jianshu.com/p/c978cd21d5f9)
三. android 换肤流程
换肤流程
- 类似于framework-res.apk 建立一个只有资源的apk
- 该资源apk内部设置
2.1 资源文件替换, 需要和要替换皮肤apk的resource 名称保持一致
2.2 ActivityManifest.xml 文件修改
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.jiangyu.rrodemooverlay" >
<overlay
android:priority="1"
android:targetPackage="com.jiangyu.rrodemo" />
</manifest>
2.3 Android.mk 文件的书写
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
#include files in src directory
LOCAL_SRC_FILES := $(call all-subdir-java-files)
#include files in res diretory
LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
LOCAL_SDK_VERSION = current
#the name of target apk
LOCAL_PACKAGE_NAME := RRODemoOverlay
include $(BUILD_PACKAGE)
- 打包签名成apk
3.1生成未签名apk
aapt package -M AndroidManifest.xml -S res/ -I ~/Android/Sdk/platforms/android-27/android.jar -F sample-overlay-1.0.apk.u -f
3.2 使用target.apk 相同的keystore签名
jarsigner -keystore ~/.android/debug.keystore sample-overlay-1.0.apk.u androiddebugkey
3.3 优化apk文件
zipalign 4 sample-overlay-1.0.apk.u sample-overlay-1.0.apk
以上过程如果只是做实验可以直接使用debug 签名或者默认系统签名, 将项目放置在aosp代码树下进行mm编译
- Runtime Resource Overlay 实现流程
4.1 adb 新建 /system/vendor/overlay
4.2 将生成的overlay.apk放置在/system/vendor/overlay
换肤原理
Runtime Resource Overlay 是在android 5.0后被引入,原理其实是应用调用资源getString/getDrawable 其实是将resource id 传到framework, 有该层判断资源的具体位置, framework 取资源的顺序先overlay 在原生apk目录
RuntimeResourceOverlay.jpg
网友评论