IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Android实训(四):OverlayManagerServer浅析、SRO/RRO流程和调试 -> 正文阅读

[移动开发]Android实训(四):OverlayManagerServer浅析、SRO/RRO流程和调试

OverlayManagerServer

1. 基础知识

Android Overlay是一种资源替换机制,在不需要打包apk的情况下,替换res目录,通常用来为不同厂商或者主题做的定制化定制

1.1 基础理论

Overlay分为静态的和运行时的Overlay

  • Static Resource Overlay简称SRO需要在安卓的源码环境中配置,而且需要对应的apk源码才能完成,一般第三方应用不提供源码
  • Runtime Resource Overlay简称RRO,由sonny贡献,从M版本开始支持,不需要提供源码,只需要提供资源路径和名称,RRO不能替换清单文件和引用文件,比如layout、xml目录中的xml文件

1.2 原理

  1. SRO原理

    在通过AAPT打包成APK时,通过-S命令多加了一个资源目录也就是overlay目录,将这个额外的目录替换为了原来的资源重名文件

    打包过程:

    一般情况下,先把res下的java文件编译成class文件打包成dex,运行的时候进行load。lib目录下的静态jar文件加动态的so文件以及res目录下的资源文件加上清单一起打包成apk文件

  2. RRO原理

    资源文件在打包之后会生成一个R.java文件,平时在应用层调用各种资源也是通过R.XXX.XXX来调用,R.java中会生成一个对应的int类型的资源id,实际上平时调用的资源都是这个int,这个id有如下规则:

    0xppttiiiii

    pp:01为系统资源,7f为应用资源

    tt:用于 表示资源类型,比如string、array等

    iiii:用于区分同类型不同文件

    如果是系统资源,会在framework-res.apk中查找并返回资源,一般位于/system/framework目录下;如果是应用资源,则会在overlay和app中查找并返回(如果overlay有明确指出资源则具有优先级)

2. OMS

主要研究ROO,也就是android的动态资源查找

在这里插入图片描述

OMS和Android通过AIDL进行通信,它有一个实现类,实现类有两个辅助类

OMS是由system_server进程拉起的,且必然存在跨进程通信,需要借助AIDL接口

在接口IOverlayManager.setEnabledExclusive接口中,设置targetpackage的overlayPackage是否为enable,如果有多个op,也就是多套主题,只有设置了其中一个为enable,那其余的所有都是disable,

3.配置方案

3.1 SRO流程

一般在AndroidProducts.mk中定义了哪些APP会被编译打包,其他的mk文件规则是APP的配置文件

PRODUCT_PACKAGE_OVERLAYS := device/sample/overlays/backup

一般厂商为了定制都会参照device目录新建一个vendor目录,overlay需要在这个vendor目录下进行修改,包名路径一定要和源项目保持一致

3.2 RRO流程

通过一个新的apk来个更改原来apk中的资源文件

例如,原来apk的包名为com.ford.sync.controllerlauncher

则新包名为com.ford.sync.controllerlauncher.overlay1,包名随意

  1. 如果是mk版本,则需要在包下创建AndroidManifest.xml和Android.mk以及要替换的res包下的文件

  2. 如果是AndroidStudio版本,更新了资源文件后,只需要在build.gradle中修改打包位置,修改为只打包Manifest和res目录

    sourceSets {
    	main{
    		manifest.srcFile 'src/main/AndroidManifest.xml'
    		resources.srcDirs = ['src/main/res']
    		res.srcDirs = ['src/main/res']
    	}
    }
    
  3. 修改overlay的清单文件

    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
    	package="com.ford.sync.controllerlauncher.overlay1">
        <!-- 
    		1.package为overlay包路径,targetPackage为目标路径
    		2.priority为优先级,int型,值越大优先级越高
    		3.isStatic必须设置才能RRO,true表示生效,如果是动态切换不能设置true
    		4.hasCode表明此工程是否有源码
    	-->
    	<overlay android:targetPackage="com.ford.sync.controllerlauncher"
    			 android:priority="1"
    			 android:isStatic="false"/>
    	<application android:hasCode="false"/>
    </manifest>
    
  4. 添加overlay资源文件

    在相同路径下res包下相同资源位置名称相同地点写不同的值,如果是硬编码资源是无法替换的

  5. 编译打包

    如果是mk编译,编写Android.mk文件

    LOCAL _PATH := $(call my-dir)
    include $(CLEAR_ VARS)
    LOCAL_ MODULE_ TAGS := optional
    #平台签名
    LOCAL_ CERTIFICATE := platform
    #调用本目录res文件夹资源
    LOCAL_ RESOURCE DIR := $(LOCAL _PATH)/res
    # overlay. apk输出路径,必须在vendor/overlay/ 目录下,否则不生效
    LOCAL MODULE_ PATH := $(PRODUCT_ OUT)/vendor/overlay
    LOCAL_ SDK_ _VERSION = current
    LOCAL_ PACKAGE_ NAME := Launcher0verlay1
    include $(BUILD_ PACKAGE)
    
  6. 安装apk

    编译生成的apk需要push到vendor/overlay,如果isStatic不为true,需要activate,默认是disable的

4.调试方式

4.1 SRO调试

需要整编系统

4.2 RRO调试

如果isStatic为true就可以,这个时候只能设置一套主题

如果不为true,则需要adb命令实现切换

启用该overlay如下

adb exec-out cmd overlay enable com.ford.sync.controllerlauncher.overlay1

禁用如下

adb exec-out cmd overlay disenable com.ford.sync.controllerlauncher.overlay1
  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-05-09 12:51:06  更:2022-05-09 12:51:08 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 0:00:46-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码