Android开发 System Ramdisk相关

2024-04-18 10:58

本文主要是介绍Android开发 System Ramdisk相关,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Andoird7 上 Ramdisk挂载为根文件系统

在android7 上文件系统的root是挂载 ramdisk; ramdisk镜像是被打包在boot.img上。

可以通过unpack_bootimg 工具对boot.img镜像拆解:

unpack_bootimg需要执行android编译的环境设置后,make unpack_bootimg;

执行过程及结果:

yujixuan@yujixuan:~/prj/code/out/target/product/msm8953_64/bootout$ unpack_bootimg --boot_img boot.img --out ./
boot_magic: ANDROID!
kernel_size: 15636495
kernel load address: 2147516416
ramdisk size: 1350215
ramdisk load address: 2164260864
second bootloader size: 0
second bootloader load address: 2163212288
kernel tags load address: 2147483904
page size: 2048
boot image header version: 0
os version and patch level: 235147554
product name: 
command line args: console=ttyHSL0,115200,n8 androidboot.console=ttyHSL0 androidboot.hardware=qcom msm_rtb.filter=0x237 ehci-hcd.park=3 androidboot.bootdevice=7824900.sdhci lpm_levels.sleep_disabled=1 earlyprintk buildvariant=userdebug
additional command line args: 
yujixuan@yujixuan:~/prj/code/out/target/product/msm8953_64/bootout$ ls
boot.img  kernel  ramdisk  second
yujixuan@yujixuan:~/prj/code/out/target/product/msm8953_64/bootout$ file *
boot.img: Android bootimg, kernel, ramdisk, page size: 2048, cmdline (console=ttyHSL0,115200,n8 androidboot.console=ttyHSL0 androidboot.hardware=qcom msm_rtb.filter=)
kernel:   Linux kernel ARM boot executable zImage (little-endian)
ramdisk:  gzip compressed data, from Unix
second:   empty

通过File命令可知,ramdisk是个gzip文件;

修改为.gz 后缀文件后,通过gunzip解压它可得到ramdisk归档后的文件,接着再用 cpio命令进行解档,过程如下:

yujixuan@yujixuan:~/prj/code/out/target/product/msm8953_64/bootout$ mv ramdisk ramdisk.gz 
yujixuan@yujixuan:~/prj/code/out/target/product/msm8953_64/bootout$ ls
boot.img  kernel  ramdisk.gz  second
yujixuan@yujixuan:~/prj/code/out/target/product/msm8953_64/bootout$ gunzip ramdisk.gz 
yujixuan@yujixuan:~/prj/code/out/target/product/msm8953_64/bootout$ ls
boot.img  kernel  ramdisk  second
yujixuan@yujixuan:~/prj/code/out/target/product/msm8953_64/bootout$ cpio -i -F ramdisk 
5493 块
yujixuan@yujixuan:~/prj/code/out/target/product/msm8953_64/bootout$ ls
acct        config        etc                init.class_main.sh       init.qcom.early_boot.sh     init.qcom.usb.rc      init.usb.rc       proc               sdcard           service_contexts  ueventd.rc
boot.img    d             file_contexts.bin  init.environ.rc          init.qcom.factory.rc        init.qcom.usb.sh      init.zygote32.rc  property_contexts  seapp_contexts   storage           vendor
bugreports  data          fstab.qcom         init.mdm.sh              init.qcom.rc                init.rc               kernel            ramdisk            second           sys               verity_key
cache       default.prop  init               init.qcom.bms.sh         init.qcom.sh                init.target.rc        mnt               res                selinux_version  system
charger     dev           init.carrier.rc    init.qcom.class_core.sh  init.qcom.syspart_fixup.sh  init.usb.configfs.rc  oem               sbin               sepolicy         ueventd.qcom.rc

即可得到 系统启动后的根文件系统中的文件; 系统启动过程中会将system,vendor等img挂载到相应的路径上; 也可以看出这里的一些初始化文件,如init.rc uevent.rc 就是在boot.img中生效的;

在编译目录out下,对应的是root目录:

Android9及以上 system as root

在android9 及以上,根文件系统不是通过boot。img中的ramdisk直接来挂载根文件系统;而编译的ramdisk.img被打包到system.img中; 系统启动过程中,会将根目录切换到system目录下;

同样执行上面的步骤解析boot.img; 可以看到虽然ramdisk还有;但是是空文件;

yujixuan@yujixuan:~/prj/code/out/target/product/msm8953_64/bootout2$ unpack_bootimg --boot_img boot.img --out ./
boot_magic: ANDROID!
kernel_size: 16609898
kernel load address: 2147516416
ramdisk size: 0
ramdisk load address: 2164260864
second bootloader size: 0
second bootloader load address: 2163212288
kernel tags load address: 2147483904
page size: 2048
boot image header version: 1
os version and patch level: 301990199
product name: 
command line args: console=ttyHSL0,115200,n8 androidboot.console=ttyHSL0 androidboot.hardware=qcom msm_rtb.filter=0x237 ehci-hcd.park=3 lpm_levels.sleep_disabled=1 androidboot.bootdevice=7824900.sdhci earlycon=msm_serial_dm,0x78af000 firmware_class.path=/vendor/firmware_mnt/image androidboot.usbconfigfs=true loop.max_part=7 buildvariant=userdebug
additional command line args: 
recovery dtbo size: 0
recovery dtbo offset: 0
boot header size: 1648
yujixuan@yujixuan:~/prj/code/out/target/product/msm8953_64/bootout2$ ls
boot.img  kernel  ramdisk  second
yujixuan@yujixuan:~/prj/code/out/target/product/msm8953_64/bootout2$ file *
boot.img: Android bootimg, kernel, page size: 2048, cmdline (console=ttyHSL0,115200,n8 androidboot.console=ttyHSL0 androidboot.hardware=qcom msm_rtb.filter=)
kernel:   gzip compressed data, max compression, from Unix
ramdisk:  empty
second:   empty

想要修改一些初始化文件,则需要更新system.img;

动态分区super.img

android10上,则需要烧录包含system.img的super.img简单来看 是将system.img 和vendor.img打包在一起;它们的大小并非固定的;是由编译时决定的,更合理的使用内存空间;

这篇关于Android开发 System Ramdisk相关的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/914587

相关文章

Spring Boot集成/输出/日志级别控制/持久化开发实践

《SpringBoot集成/输出/日志级别控制/持久化开发实践》SpringBoot默认集成Logback,支持灵活日志级别配置(INFO/DEBUG等),输出包含时间戳、级别、类名等信息,并可通过... 目录一、日志概述1.1、Spring Boot日志简介1.2、日志框架与默认配置1.3、日志的核心作用

Android Paging 分页加载库使用实践

《AndroidPaging分页加载库使用实践》AndroidPaging库是Jetpack组件的一部分,它提供了一套完整的解决方案来处理大型数据集的分页加载,本文将深入探讨Paging库... 目录前言一、Paging 库概述二、Paging 3 核心组件1. PagingSource2. Pager3.

PyQt5 GUI 开发的基础知识

《PyQt5GUI开发的基础知识》Qt是一个跨平台的C++图形用户界面开发框架,支持GUI和非GUI程序开发,本文介绍了使用PyQt5进行界面开发的基础知识,包括创建简单窗口、常用控件、窗口属性设... 目录简介第一个PyQt程序最常用的三个功能模块控件QPushButton(按钮)控件QLable(纯文本

基于Python开发一个图像水印批量添加工具

《基于Python开发一个图像水印批量添加工具》在当今数字化内容爆炸式增长的时代,图像版权保护已成为创作者和企业的核心需求,本方案将详细介绍一个基于PythonPIL库的工业级图像水印解决方案,有需要... 目录一、系统架构设计1.1 整体处理流程1.2 类结构设计(扩展版本)二、核心算法深入解析2.1 自

Android kotlin中 Channel 和 Flow 的区别和选择使用场景分析

《Androidkotlin中Channel和Flow的区别和选择使用场景分析》Kotlin协程中,Flow是冷数据流,按需触发,适合响应式数据处理;Channel是热数据流,持续发送,支持... 目录一、基本概念界定FlowChannel二、核心特性对比数据生产触发条件生产与消费的关系背压处理机制生命周期

Android ClassLoader加载机制详解

《AndroidClassLoader加载机制详解》Android的ClassLoader负责加载.dex文件,基于双亲委派模型,支持热修复和插件化,需注意类冲突、内存泄漏和兼容性问题,本文给大家介... 目录一、ClassLoader概述1.1 类加载的基本概念1.2 android与Java Class

SpringBoot开发中十大常见陷阱深度解析与避坑指南

《SpringBoot开发中十大常见陷阱深度解析与避坑指南》在SpringBoot的开发过程中,即使是经验丰富的开发者也难免会遇到各种棘手的问题,本文将针对SpringBoot开发中十大常见的“坑... 目录引言一、配置总出错?是不是同时用了.properties和.yml?二、换个位置配置就失效?搞清楚加

Android DataBinding 与 MVVM使用详解

《AndroidDataBinding与MVVM使用详解》本文介绍AndroidDataBinding库,其通过绑定UI组件与数据源实现自动更新,支持双向绑定和逻辑运算,减少模板代码,结合MV... 目录一、DataBinding 核心概念二、配置与基础使用1. 启用 DataBinding 2. 基础布局

Python中对FFmpeg封装开发库FFmpy详解

《Python中对FFmpeg封装开发库FFmpy详解》:本文主要介绍Python中对FFmpeg封装开发库FFmpy,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录一、FFmpy简介与安装1.1 FFmpy概述1.2 安装方法二、FFmpy核心类与方法2.1 FF

Android ViewBinding使用流程

《AndroidViewBinding使用流程》AndroidViewBinding是Jetpack组件,替代findViewById,提供类型安全、空安全和编译时检查,代码简洁且性能优化,相比Da... 目录一、核心概念二、ViewBinding优点三、使用流程1. 启用 ViewBinding (模块级