AB升级之odex文件首次开机处理

2023-05-16

开启AB升级方案的项目,因为很多需要升级的镜像都有两份,所以存储空间比较浪费。为缓解此问题,有个针对odex的优化方案。

编译版本会生成两个system镜像:system.img和system_other.img,其中,system_other.img中存储的就是odex文件,这样system.img就能小很多,意味着可以为system分区划分较小的空间。

在首次开机时,假设system.img镜像存储在A slot,那么此时的B slot是闲置的。所以可以把system.img刷入A slot的system分区,把system_other.img刷入B slot的system分区。在首次开机时,再把system_other.img中的odex文件拷贝到data分区。

https://source.android.com/devices/tech/dalvik/configure.html#other_odex

开机后copy odex文件的相关代码

/frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java

public PackageManagerService(Context context, Installer installer,
              boolean factoryTest, boolean onlyCore) {
    ...
    // 首次开机时才执行
    if (!mOnlyCore && mFirstBoot) {
        requestCopyPreoptedFiles();
    }
    ...
}

/**
 * Requests that files preopted on a secondary system partition be copied to the data partition
 * if possible.  Note that the actual copying of the files is accomplished by init for security
 * reasons. This simply requests that the copy takes place and awaits confirmation of its
 * completion. See platform/system/extras/cppreopt/ for the implementation of the actual copy.
 */
private static void requestCopyPreoptedFiles() {
    final int WAIT_TIME_MS = 100;
    final String CP_PREOPT_PROPERTY = "sys.cppreopt";
    if (SystemProperties.getInt("ro.cp_system_other_odex", 0) == 1) {
        SystemProperties.set(CP_PREOPT_PROPERTY, "requested");
        // We will wait for up to 100 seconds.
        final long timeStart = SystemClock.uptimeMillis();
        final long timeEnd = timeStart + 100 * 1000;
        long timeNow = timeStart;
        while (!SystemProperties.get(CP_PREOPT_PROPERTY).equals("finished")) {
            try {
                Thread.sleep(WAIT_TIME_MS);
            } catch (InterruptedException e) {
                // Do nothing
            }
            timeNow = SystemClock.uptimeMillis();
            if (timeNow > timeEnd) {
                SystemProperties.set(CP_PREOPT_PROPERTY, "timed-out");
                Slog.wtf(TAG, "cppreopt did not finish!");
                break;
            }
        }

        Slog.i(TAG, "cppreopts took " + (timeNow - timeStart) + " ms");
    }
}

这里是在PSM初始化时,PMS_scan_START之前进行copy动作,且只在首次开机执行。

有开关控制此功能:ro.cp_system_other_odex=1则打开,默认为0

如注释中提到的,PMS并不负责真正的copy,因为它没有相关权限,而是由init进程来执行。

PMS和init的交互是通过系统属性:sys.cppreopt

PMS将其设置为requested,来请求init去copy;每隔一段时间检测下是否已经变更为finished。

当sys.cppreopt=requested时,触发copy;结束后,设置为finished

如下是对应rc文件,相关操作会在init进程中执行。

这个代码给我们提供了一个普通进程和init进程交互的方法:透过property通信

/system/extras/cppreopts/cppreopts.rc
on property:sys.cppreopt=requested && property:ro.boot.slot_suffix=_a
    mount ext4 /dev/block/by-name/system_b /postinstall ro nosuid nodev noexec
    exec - root -- /system/bin/cppreopts.sh /postinstall
    # Optional script to copy additional preloaded content to data directory
    exec - system system -- /system/bin/preloads_copy.sh /postinstall
    umount /postinstall
    setprop sys.cppreopt finished

on property:sys.cppreopt=requested && property:ro.boot.slot_suffix=_b
    mount ext4 /dev/block/by-name/system_a /postinstall ro nosuid nodev noexec
    exec - root -- /system/bin/cppreopts.sh /postinstall
    # Optional script to copy additional preloaded content to data directory
    exec - system system -- /system/bin/preloads_copy.sh /postinstall
    umount /postinstall
    setprop sys.cppreopt finished

具体copy流程:

把system_other.img镜像mount到/postinstall,然后运行/system/bin/cppreopts.sh,之后umount。这个sh脚步在/system/extras/cppreopts/cppreopts.sh

在copy时,需要用到preopt2cachename来生成目标文件路径和名称:system/extras/preopt2cachename/,这个bin档会输出一个string

std::cout << output_file_location;

 

一般地,system/app和system/priv-app/目录下的odex文件会生成到system_other.img

/build/make/core/dex_preopt.mk

# The default filter for which files go into the system_other image (if it is
# being used). To bundle everything one should set this to '%'
SYSTEM_OTHER_ODEX_FILTER ?= app/% priv-app/%

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

AB升级之odex文件首次开机处理 的相关文章

  • 适配器模式C++实现

    本文共916个字 xff0c 预计阅读时间需要3分钟 简介 适配器模式 xff1a 将一个类的接口转换成客户希望的另一个接口 适配器模式让那些接口不兼容的类可以一起工作 适配器模式的别名为包装器 Wrapper 模式 xff0c 它既可以作
  • 装饰模式C++实现

    简介 动态地给一个对象添加一些额外的职责 就增加功能来说 xff0c 装饰模式比生成子类更为灵活 动机 有时我们希望给某个对象而不是整个类添加一些功能 使用继承机制是添加功能的一种有效途径 xff0c 但不够灵活 xff0c 用户不能控制对
  • 软件测试——测试计划

    完整版 xff08 包括表格和图片 xff09 请访问 xff1a http www omegaxyz com 2019 08 02 software testing 本文共6034个字 xff0c 预计阅读时间需要16分钟 文章目录 1简
  • 享元模式C++实现(flyweight)

    简介 动机 假设成立一个外包公司 xff0c 主要给一些私营业主建网站 商家客户都类似 xff0c 要求也就是信息发布 产品展示 博客留言 论坛等功能 各个客户要求差别不大 xff0c 但客户数量多 内部状态和外部状态 在享元对象内部并且不
  • mat格式数据集转换为arff与txt格式

    本文共239个字 xff0c 预计阅读时间需要1分钟 下面的代码给出了将mat格式数据集转换为arff与txt格式的matlab代码 注意 xff0c 每个 mat文件中只有一个数据集 xff0c 其中共有m 43 1列 xff0c 最后一
  • 给linux 增加软件图标

    文章目录 其实如果是自己用的软件 xff0c 没必要像wps 安装之后 图标的复杂性 xff0c 我这里更加简单1 复制一个稍微简单的 desktop 文件并重命名你安装的软件的名称2 改动里面的东西 xff0c 下面 是Typora 软件
  • 计算机组成原理--I/O系统

    大学峡谷秀 xff0c 机组未学溜 xff0c 如今涕泪流 xff0c 共勉之 近来学习netty零拷贝 xff0c 复习并笔记之 1 概念 以主机为中心 xff0c 将信息从外部设备读入或输出的操作称为IO xff0c 外部设备包括输入输
  • ae怎样设置gpu渲染

    1 方法 xff1a 在 编辑 首选项 常规 中 选择 预览 xff0c 旁边有个 GPU信息 光线追踪 选择GPU即可 2 对于 GPU 显示灰色 xff08 既不可选 xff09 的朋友 在AE插件目录下 xff08 Support F
  • conio.h头文件

    conio h conio h不是C标准库中的头文件 conio是Console Input Output xff08 控制台输入输出 xff09 的简写 xff0c 其中定义了通过控制台进行数据输入和数据输出的函数 xff0c 主要是一些
  • 企业微信如何关联小程序?

    我们在日常使用微信时 xff0c 经常会用到小程序功能 xff0c 直接从微信中打开第三方页面 xff0c 很是方便 xff0c 那么自从企业微信与微信打通之后 xff0c 我们该如何将小程序与企业微信联系起来使用呢 xff1f 其实 xf
  • 在 Mac OS X 上安装 TensorFlow

    在 Mac OS X 上安装 TensorFlow 原文地址 xff1a https www cnblogs com tensorflownews p 7298646 html 这个文档说明了如何在 Mac OS X 上安装 TensorF
  • linux /centos 中OpenSSL升级方法详解

    OpenSSL升级前段时间出现天大bug了 xff0c 这样导致大家都急着去升级OpenSSL来初安全了 xff0c 但是很多的朋友在家linux并不知道如何去升级OpenSSL了 xff0c 下面我整理了一文章大家一起参考一下 相关软件下
  • 【字符验证】java el正则表达式使用

    支持 xff1a 中文 英文 下划线 xff0c 单独或三者合一 xff1a String regex 61 34 u4E00 u9FA5A Za z0 9 43 34 if 34 Adsf 最大的 34 matches regex Sys
  • synchronized原理

    一 synchronized简介 1 java中的关键字 xff0c 在JVM层面上围绕着内部锁 intrinsic lock 或者监管锁 xff08 Monitor Lock xff09 的实体建立的 xff0c Java利用锁机制实现线
  • 11-JUC中的Condition对象

    文章目录 ConditionCondition常用方法总结参考 Condition 任何一个java对象都天然继承于Object类 xff0c 在线程间实现通信的往往会应用到Object的几个方法 xff0c 比如wait wait lon
  • 使用微软New Bing Chat GPT-4生成AI图像的技巧

    在聊天的创意模式中 xff0c 你现在可以要求Bing为你创建一个全新的图像 xff0c 只用你的话语 只需说 34 为我创建一个图像 34 或 34 为我绘制一个图像 34 xff0c 最后准确地说出你要找的东西 当你的描述性更强时 xf
  • 空间权重矩阵

    空间权重矩阵 前言一 空间权重矩阵是什么 xff1f 二 构建模型1 方法1 基于邻接关系构建2 基于距离构建3 复合型 三 总结 前言 随着学习的深入 xff0c 特别是在做空间统计分析的时候 xff0c 空间权重矩阵越来越频繁的出现在我
  • 时间序列模型——AR、MA、ARMA、ARIMA

    这里写目录标题 时间序列模型自回归模型差分与非平稳序列差分检验不平稳 移动平均模型移动平均法MA模型 ARMA模型ARIMA建模方法 时间序列模型 常用的时间序列模型有四种 xff1a 自回归模型 AR p 移动平均模型 MA q 自回归移
  • spring ioc容器中某个Class的bean对象是否只有一个,是否就是单例的[spring总结]

    package com xxx product web 64 program product 64 description 64 create 2021 05 12 17 28 public interface OrderService b
  • 记ftpClient.storeFile(name,inputStream)被挂起,一直没有回复226 transfer complete造成阻塞

    最近现场一个问题折磨了我好久 xff0c 问题是这样的 程序使用异步线程从装置上取文件 xff0c 通过http连接从设备上读取流之后保存到ftp服务器上 xff0c 开始都是正常的 xff0c 过了半个多小时线程会堵塞 xff0c 导致所

随机推荐

  • FtpClient.storeFile()函数总是返回false

    今天我在使用FTP上传图片到服务器时 xff0c 使用函数FtpClient storeFile filename inputFile 函数上传 我发现返回值总是false 但是明明图片已经上传成功 后来查阅资料在这之前加上一句话就好了 x
  • Mac 上实现便捷 Python 多版本共存和轻松切换

    1 安装Homebrew span class hljs operator style margin 0px padding 0px span span class hljs string style margin 0px padding
  • RHEL下修改VNC的分辨率

    在使用LINUX下的CAE设计软件时 xff0c 由于系统自带的VNC默认分辨绿为1024 768 xff0c 导致部分地区无法显示 经试验 xff0c 修改如下内容可以调整分辨率 xff1a 1 which vncserver 得到VNC
  • Docker与虚拟机的简介以及比较

    Docker与虚拟机 注意 本人的博客都迁移到本人自己搭建的博客地址 xff0c 通过此处可查看 Docker 什么是Docker Docker是一个集开发 打包 运行应用于一体的开放式平台 Docker可以用来快速交付应用 使用Docke
  • 教你如何拥有好看的CMD界面 如何美化Windows Terminal

    安装Windows Terminal 在Mircosoft Store可以安装 只有6M PowerShell 必备条件 使用 PowerShell xff0c 安装 Posh Git 和 Oh My Posh xff1a Install
  • CentOS 中 VNCServer 安装使用

    xfeff xfeff 参考 xff1a 1 http wiki centos org HowTos VNC Server 2 http www2 starcat ne jp kanocl shumi vnc htm 分割线 在centos
  • 程序员之歌:我是一个程序员

    工作一天 xff0c 来一起唱首歌缓解疲劳吧猿媛们
  • 如何准备校招技术面试+一只小菜鸟的面试之路

    校 招一路走来很幸运 xff0c 从最初的迷茫 xff0c 到偶尔的被否认 xff0c 然后慢慢调整心态 xff0c 有缺憾才能有进步 xff0c 正视的自己不足 xff0c 静下心努力提高 xff0c 勇敢尝试各种面试机会 xff0c 因
  • 9 个很酷的 CMD 命令

    开发者 xff08 KaiFaX xff09 面向全栈工程师的开发者 专注于前端 Java Python Go PHP的技术社区 大家好 xff0c 我是若飞 今天给大家推荐几个很酷的CMD命令 使用得当 xff0c 可以让你事半功倍 ip
  • MariaDB INSERT INTO SELECT 报错

    文章目录 1 错误描述2 原因3 例子参考文献 1 错误描述 MariaDB 10 5 9 在使用 INSERT INTO SELECT 时会报错 xff0c 错误如下 xff1a ERROR 1064 42000 You have an
  • 科班程序员逆袭为渗透测试工程师的坎坷路(第一篇)

    渗透测试工程师 1 什么是渗透测试 渗透测试 xff08 penetration test xff09 事实上并没有一个标准的定义 xff0c 在国外的大部分安全组织达成的统一说法是 xff1a 渗透测试是通过模拟恶意黑客的攻击方法 xff
  • XD基础操作演示

    基础操作演示 1 启动页面 xff0c 页面上展示了几种画板类型 xff0c 根据项目类型选择相应的画板 xff0c 或者自定义画板大小 在XD中是使用一倍图进行设计 xff0c 由于XD是矢量设计软件 xff0c 所以导出 64 2x 6
  • SQL中的注释语句(三种注释)

    一 单行注释 采用 34 34 双减号 进行单行注释 xff0c 注意 xff1a 34 34 与注释内容要用空格隔开才会生效 二 多行注释 采用 进行多行注释 三 xff0c xff08 单行 xff09 注释 在mysql数据库中就可使
  • Python内置库——http.client源码刨析

    看过了http client的文档 xff0c 趁热打铁 xff0c 今天继续研究一下http client的源码 xff08 一 xff09 你会怎么实现 开始之前先让我们回忆一下一个HTTP调用的完整流程 xff1a 看到这张图 xff
  • 端到端 个人理解

    什么是端到端 端到端是根据客户端提出的需求端 xff0c 到满足客户需求端的一个过程 xff0c 这个过程叫做端到端服务 举个栗子 xff1a 客户可以看做市场 xff0c 客户提出的需求可以看做输入端 xff0c 而我们满足客户需求的结果
  • @PathVariable注解的作用

    1 64 PathVariable注解的作用 在SpringMVC中可以使用占位符进行参数绑定 xff0c 地址 list 1 3可以写成 list page limit xff0c 占位符 page 和 limit 对应的值就是1和3 在
  • ssm配置

    web xml lt context param gt lt param name gt log4jConfigLocation lt param name gt lt param value gt classpath log4j prop
  • Ubuntu16.04安装hexo

    在Ubuntu16 04中安装hexo出现一系列的问题 xff0c 总结一下安装hexo的步骤 首先安装noejs xff0c Ubuntu源中的nodejs时旧版本 xff0c 所以需要在安装后更新nodejs span class hl
  • Power Manager之DisplayPowerState.PhotonicModulator

    Android4 4 DisplayPowerState java PhotonicModulator PhotonicModulator是DisplayPowerState的内部类 xff0c private final class xf
  • AB升级之odex文件首次开机处理

    开启AB升级方案的项目 xff0c 因为很多需要升级的镜像都有两份 xff0c 所以存储空间比较浪费 为缓解此问题 xff0c 有个针对odex的优化方案 编译版本会生成两个system镜像 xff1a system img和system