美文网首页Android Other
剖析 android getResource 过程,以及系统换肤

剖析 android getResource 过程,以及系统换肤

作者: MickCaptain | 来源:发表于2019-09-25 20:00 被阅读0次

一. activity 启动后resource 初始化流程

init.png
  • 该图描述了activity 启动一些列资源初始化的过程
  • 红色字体处是获取apk内部资源的过程

二. activity 根据id获得资源的流程

demo.png
  • 该图描述了获取resource id 的过程,在初始化启动流程结束后, 会缓存一个resource table ,从本地缓存中取出资源id

以上resource图片摘抄自网络(https://www.jianshu.com/p/c978cd21d5f9)


三. android 换肤流程

换肤流程

  1. 类似于framework-res.apk 建立一个只有资源的apk
  2. 该资源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)

  1. 打包签名成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编译

  1. 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

相关文章

网友评论

    本文标题:剖析 android getResource 过程,以及系统换肤

    本文链接:https://www.haomeiwen.com/subject/bcuiyctx.html