以前刚用手机的时候,经常可以在玩机论坛上看到很多发ROM包的帖子,譬如什么大深度定制ROM,什么大深度深度精简纯净版ROM...相信很多喜欢搞机的都有见过这类帖子。后来自己不满每次刷机后都要手动设置一大堆东西,遂按照论坛上的教程改了Defy+的cm11的ROM,集成了绿色守护,默认允许安装未知来源的应用,默认电池百分号显示等等。时隔4年,又玩起了ROM包定制,感慨颇多

1. 解包

假设有一个名为update.zip的ROM包,我们要在Ubuntu下对它进行定制。首先把system.transfer.listsystem.new.dat.br(有些旧版的系统的镜像可能是system.new.dat)从update.zip解压出来,转成system.img(原始镜像格式),修改完后又按步骤打包回原来的格式。本文只写了system分区的定制方法,但是对于其他分区也是类似的,都要转成原始镜像格式后才能对它修改。如果使用file system.img命令来查看system.img文件信息,会得到类似下面的信息:

system.img: Linux rev 1.0 ext4 filesystem data, UUID=da594c53-9beb-f85c-85c5-cedf76546f7a, volume name "system" (extents) (large files)

1.1 system.new.dat.br转换为system.new.dat

brotli -d system.new.dat.br

注:如果镜像就是system.new.dat格式,就跳过这步

1.2 system.new.dat转成system.img

git clone https://github.com/xpirt/sdat2img
cd sdat2img
python sdat2img.py ../system.transfer.list ../system.new.dat

1.3 挂载system.img

sudo mkdir -p /mnt/system
sudo mount -o loop system.img /mnt/system

1.4 扩容(可选)

挂载后可以通过df -h来查看挂载点/mnt/system剩余空间有多少,如果没有剩余,就要对它进行扩容,下面的例子是给它增加128M的空间,扩容之前要先取消挂载

dd if=/dev/zero bs=1M count=128 >> system.img
e2fsck -f system.img
resize2fs system.img

2. 修改

现在,可以在/mnt/system目录下根据自己的需求增删文件了

增删文件需要注意:

  1. 对/mnt/system进行写操作需要root权限
  2. 如果需要往/system/app目录或者/system/priv-app目录下加入自己的apk,需要注意除了把apk复制进去外,还要把apk里面的so文件复制进去(如果有的话),复制进去时注意apk和so文件的路径,可以参考其他系统App是怎么存放的
  3. 对于非Apk文件,复制进去后,还要使用chmod,chown等命令给它们合理的权限才能生效

3. 打包

打包其实就是解包的逆过程

3.1 生成system.img

sudo make_ext4fs -T 0 -S file_contexts -l 1024M -a system system_new.img /mnt/system
  • -T 代表对镜像中的unix文件时间戳进行设置,这里设置为0,表示1970-1-1
  • -S 指定file_contexts
  • -l 表示目标镜像的大小。如果不懂得写多少可以使用df -h命令查看挂载点/mnt/system的总大小,然后取整数(512M,1024M,2048M...),比如查得挂载点空间大小是992M,你就得写1024M
  • -a 指定目标img文件在Android中的挂载点
  • system_new.img 表示生成的镜像
  • /mnt/system/ 表示源目录

注: file_contexts可以去这里获取,根据系统版本选择分支(Android7.0对应的是cm14.0分支,Android7.1对应的是cm14.1分支,Android8.0对应lineage-15.0分支,以此类推),下载后也可以根据自己的需求定制file_contexts

成功后会在当前目录下生成system_new.img。如果发生错误,根据错误进行调整参数,直到没有错误提示为止。

3.2 卸载system

sudo umount /mnt/system

3.3 把system.img转成system.new.dat

转换之前可以对之前解压出来的文件进行备份:

mv system.transfer.list system.transfer.list.bak
mv system.new.dat system.new.dat.bak

开始转换

git clone https://github.com/jazchen/rimg2sdat
cd rimg2sdat
python rimg2sdat.py system_new.img

成功后会在当前目录下生成system.transfer.list和system.new.dat

3.4 system.new.dat转成system.new.dat.br

brotli -0 system.new.dat

注:如果开始解压出来的镜像就是system.new.dat格式,就跳过这步

3.5 更新文件到刷机包

zip update.zip <system.new.dat.br或者system.new.dat> system.transfer.list

4. 扩展知识

在有些刷机包里,它里面包含的system.img镜像是sparse image格式的,如果用file命令查看它的信息,显示如下:

system.img: Android sparse image, version: 1.0, Total of 655360 4096-byte output blocks in 6009 input chunks.

对于这种格式的镜像,如果想把它挂载和修改,就要转成我们上面提到的raw image(原始镜像)格式,命令如下:

simg2img <sparse_image_files> <raw_image_file>

修改完成后,取消挂载,再使用下面的命令将raw image转成sparse image:

img2simg <raw_image_file> <sparse_image_file> [<block_size>]

5. 总结

相对于修改Android源码的方式,直接修改镜像的方法对PC配置要求低很多。如果我们只想增加一些现有的模块和删除不必要的模块,这是很好的方式。而且对于一些手机厂商,他们没有提供Android源码,我们就只能用直接修改镜像的方式来定制我们的ROM。修改ROM的方法是灵活的,总结下来就是,看见一个镜像,可以根据后缀名和file命令确认它的格式,看情况将它转成原始镜像格式并挂载,就可以修改了,修改后又转回它原来的格式,最后替换刷机包中原有的镜像

Android ROM包定制(解包,增删模块,打包)的更多相关文章

  1. Python—网络抓包与解包(pcap、dpkt)

    pcap安装 [root@localhost ~]# pip install pypcap 抓包与解包 # -*- coding:utf-8 -*- import pcap, dpkt import ...

  2. ISO8583组包、解包

    using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace POS. ...

  3. apk 解包 打包

    APK应用程序的解包.修改.编辑.汉化.打包及应用 前两讲主要讲玩机的最基本的知识,集中在如何刷机.本讲是进级的内容,来谈谈与apk应用程序有关的知识,内容包括akp文件的解包.打包.反编辑.解析.汉 ...

  4. Python序列解包

    元组的序列解包range对象的序列解包迭代对象的序列解包列表的序列解包字典的序列解包序列解包与遍历序列解包的其它用法 元组的序列解包 x,y,z = (1,2,3) print(x,y,z) 1 2 ...

  5. R1(上)—R关联规则分析之Arules包详解

    Arules包详解 包基本信息 发布日期:2014-12-07 题目:挖掘关联规则和频繁项集 描述:提供了一个表达.处理.分析事务数据和模式(频繁项集合关联规则)的基本框架. URL:http://R ...

  6. Python特色的序列解包、链式赋值、链式比较

    一.序列解包 序列解包(或可迭代对象解包):解包就是从序列中取出其中的元素的过程,将一个序列(或任何可迭代对象)解包,并将得到的值存储到一系列变量中. 一般情况下要解包的序列包含的元素个数必须与你在等 ...

  7. linux 配置网卡、远程拷贝文件、建立软硬链接、打包/解包、压缩/解压缩、包操作、yum配置使用、root密码忘记

    目录 一.配置网卡 二.xshell连接 三.远程拷贝文件 四.建立软硬连接 五.打包/解包和压缩/解压缩 六.包操作 七.配置yum源 配置yum源 配置阿里云源 常用命令 yum其他命令 八.重置 ...

  8. python高级特性之封包与解包

    前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:kwsy PS:如有需要Python学习资料的小伙伴可以加点击下方链接 ...

  9. 第4.7节 Python特色的序列解包、链式赋值、链式比较

    一.序列解包 序列解包(或可迭代对象解包):解包就是从序列中取出其中的元素的过程,将一个序列(或任何可迭代对象)解包,并将得到的值存储到一系列变量中. 一般情况下要解包的序列包含的元素个数必须与你在等 ...

随机推荐

  1. 做双网卡绑定_______物理机在双网卡的情况下做多IP绑定

    公司的环境是这样的: 一台物理机需要做双网卡绑定,同时呢,在双网卡绑定的同时还要做多IP. 其实整个过程可以分为两个步骤: 第一个,物理机先做双网卡. 第二个,在bond上做多IP实例. 双网卡绑定的 ...

  2. 关于国际化时报org.springframework.context.NoSuchMessageException错,具体到No message found under code '你的键名' for locale 'zh_CN'.的解决方案

    使用IntelliJ IDEA开发工具解决方案: 总结原因,解决方案: 1,在使用messageSource.getMessage方法时,参数1的键名跟属性文件中键名不一致,比如Controller中 ...

  3. flash builder 4.6与myecilpse 10.7集成

    一.在flash builder 4.0以后就没有单独提供插件版的flash builder了,因此必须先安装完整版的flash builder,再进行插件集成. 二.集成过程比较简单但也有几个要注意 ...

  4. 程序中编写log日志

    public string logFile; ; private Stream s = null; StreamWriter sw = null; /// <summary> /// 用l ...

  5. NGINX按天生成日志文件的简易配置

    NGINX按天生成日志文件的简易配置 0x01 最近后端童鞋遇到一个小需求,拆分nginx生成的log文件,最好是按天生成,看着她还有很多bug待改的状态,我说这个简单啊,我来吧.曾经搞node后端的 ...

  6. CSS 静态进度条效果

    今天学习到了实现一个静态进度条的方法,固写一篇笔记稳固一下自己的知识. 最终的效果如下,进度条放在一个框里,水平宽自适应. 现在就开始,首先写一个进度条先. .progress-bar{ /* 进度条 ...

  7. 高性能网络通信框架 HP-Socket

      HP-Socket 详细介绍 HP-Socket 是一套通用的高性能 TCP/UDP/HTTP 通信框架,包含服务端组件.客户端组件和Agent组件,广泛适用于各种不同应用场景的 TCP/UDP/ ...

  8. 【转】利用 three.js 开发微信小游戏的尝试

    前言 这是一次利用 three.js 开发微信小游戏的尝试,并不能算作是教程,只能算是一篇笔记吧. 微信 WeChat 6.6.1 开始引入了微信小游戏,初期上线了一批质量相当不错的小游戏.我在查阅各 ...

  9. Sequel自动生成Select语句

    Sequel 是 Mac 上的一款不错的 mysql 可视化编辑, 它有一个非常好的功能是可以定制自己的插件, 这就是Bundles. 利用这个功能可以写出自己常用的一些sql. 查询语句是最常用的, ...

  10. 开启irqbalance提升服务器性能

    操作系统 性能调休   公司有次压测存在一个问题:CPU资源压不上去,一直在40%已达到了性能瓶颈,后定位到原因,所在的服务器在压测过程中产生的中断都落在CPU0上处理,这种中断并没有均衡到各个CPU ...