• Android ROM包定制(解包,增删模块,打包)


    以前刚用手机的时候,经常可以在玩机论坛上看到很多发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目录下根据自己的需求增删文件了

    system_files

    增删文件需要注意:

    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命令确认它的格式,看情况将它转成原始镜像格式并挂载,就可以修改了,修改后又转回它原来的格式,最后替换刷机包中原有的镜像

  • 相关阅读:
    关于UITapGestureRecognizer的一些问题
    自定义导航栏返回按钮
    mousewheel滚轮事件 浏览器的写法
    Apache日志不记录图片文件设置方法和来源日志的配置
    redis持久化配置
    haproxy实现负载均衡
    Keepalived高可用软件的安装与配置
    Sublime text2用户自定义配置
    判断各版本的最简写法
    Ubuntu防火墙 UFW 设置
  • 原文地址:https://www.cnblogs.com/luoyesiqiu/p/10791511.html
Copyright © 2020-2023  润新知