精华内容
下载资源
问答
  • 如何编辑system.img

    千次阅读 2012-04-11 17:21:35
      如何编辑system.img,可以参考上面的链接的内容。   SYSTEM.IMG #uncompress  %./out/host/linux-x86/bin/simg2img system.img system.img.raw #mou

    http://omappedia.org/wiki/Android_eMMC_Booting#Modifying_.IMG_Files

     

    如何编辑system.img,可以参考上面的链接的内容。

     

    SYSTEM.IMG

     #uncompress
     %./out/host/linux-x86/bin/simg2img system.img system.img.raw
     #mount to directory mnt-point/
     %mkdir mnt-point
     %sudo mount -t ext4 -o loop system.img.raw mnt-point/
     #modify any .so or apk in the mnt-point/ directory
     #rezip
     %sudo out/host/linux-x86/bin/make_ext4fs -s -l 512M -a system system.img.new mnt-point/
     %sudo umount mnt-point/
     Output: system.img.new
    

     

    展开全文
  • 目录 1、背景知识 2、boot和recovery映像的文件结构 ...6、本文讲的内容与使用update.zip刷机包不是一码事 正文 1、背景知识 Android手机的文件系统有许多存储器组成,以下是在adb shell下面的
     
    目录
    1、背景知识
    2、boot和recovery映像的文件结构
    3、对映像文件进行解包、编辑、打包的常规方法
    3.1、另一种解包、编辑、打包的方法
    4、将新的映像刷回到手机
    5、解包、编辑、打包为我们带来了什么
    6、本文讲的内容与使用update.zip刷机包不是一码事

    正文
    1、背景知识

    Android手机的文件系统有许多存储器组成,以下是在adb shell下面的输出:
    #cat /proc/mtd
    dev:    size   erasesize  name
    mtd0: 
    00040000 00020000 "misc"
    mtd1: 
    00500000 00020000 "recovery"
    mtd2: 
    00280000 00020000 "boot"
    mtd3: 
    04380000 00020000 "system"
    mtd4: 
    04380000 00020000 "cache"
    mtd5: 04ac0000 
    00020000 "userdata"

     

    注意,不同的手机在上述存储设备的顺序可能会各不相同!一定要检查您的手机,确定在以下的操作中选择正确的设备号(mtdX,这个X的序号一定要检查清楚)。

    在本向导中,我们主要描述对"recovery"和"boot"的存储设备进行操作;"system"存储设备保存了android系统目录的所有数据(在系统启动后会挂载到“system/”目录);“userdata”存储设备将保存了android数据目录中的所有数据(在系统启动后会挂载到“data/”目录,里面是会有很多应用数据以及用户的preference之类的配置数据)。

    从上面的输出可以看出来,recovery和boot分区对应着/dev/mtd/mtd1和/dev/mtd/mtd2,在你您开始做任何修改之前一定要做两件事情,第一件事情,一定要先对这两个分区进行备份。
    可以使用如下命令进行备份:
    # cat /dev/mtd/mtd1 > /sdcard/recovery.img
    # cat 
    /dev/mtd/mtd2 > /sdcard/boot.img

     

    (注意added by lxros,只有手机获取了ROOT权限以后才能够执行上述的备份命令)

    第二件事情,你您应该把你您最喜欢的update.zip刷机包放置到你您的sd卡的根目录上面。如此一来,即使你您在后续的操作中出了问题,也可以启动到recovery模式进行恢复。

    另外一个你您需要知道的重要文件是在android系统目录下的/system/recovery.img,此文件是mtd1存储设备的完全拷贝。这个文件在每次关机的时候,会自动地被写回到mtd1存储设备里面。

    这会意味着两个事情:
    (1)任何对/dev/mtd/mtd1中数据的直接修改都会在下一次重启手机以后消失。
    (2)如果希望对/dev/mtd/mtd1进行修改,最简单的做法是用你您自己的recovery.img替换掉/system/recovery.img。当你您创建自己的update.zip刷机包的时候(特别是在做刷机包的适配的时候),如果你您忘记替换这个/system/recovery.img,这个recovery.img就会在关机的时候被烧写到mtd1里面去或许会变砖。一定要注意这一点!


    2、boot和recovery映像的文件结构
    boot和recovery映像并不是一个完整的文件系统,它们是一种android自定义的文件格式,该格式包括了2K的文件头,后面紧跟着是用gzip压缩过的内核,再后面是一个ramdisk内存盘,然后紧跟着第二阶段的载入器程序(这个载入器程序是可选的,在某些映像中或许没有这部分)。此类文件的定义可以从源代码android-src/system/core/mkbootimg找到一个叫做bootimg.h的文件。

    (译者的话,原文是一个叫做mkbootimg.h的文件,但从Android 2.1的代码来看,该文件名应该是改为bootimg.h了)。

    /*
    ** +-----------------+ 
    ** | boot header     | 1 page
    ** +-----------------+
    ** | kernel          | n pages  
    ** +-----------------+
    ** | ramdisk         | m pages  
    ** +-----------------+
    ** | second stage    | o pages
    ** +-----------------+
    **
    ** n = (kernel_size + page_size - 1) / page_size
    ** m = (ramdisk_size + page_size - 1) / page_size
    ** o = (second_size + page_size - 1) / page_size
    **
    ** 0. all entities are page_size aligned in flash
    ** 1. kernel and ramdisk are required (size != 0)
    ** 2. second is optional (second_size == 0 -> no second)
    ** 3. load each element (kernel, ramdisk, second) at
    **    the specified physical address (kernel_addr, etc)
    ** 4. prepare tags at tag_addr.  kernel_args[] is
    **    appended to the kernel commandline in the tags.
    ** 5. r0 = 0, r1 = MACHINE_TYPE, r2 = tags_addr
    ** 6. if second_size != 0: jump to second_addr
    **    else: jump to kernel_addr
    */

     


    ramdisk映像是一个最基础的小型文件系统,它包括了初始化系统所需要的全部核心文件,例如:初始化init进程以及init.rc(可以用于设置很多系统的参数)等文件。如果你您希望了解更多关于此文件的信息可以参考以下网址:
    http://git.source.android.com/?p=kernel/common.git;a=blob;f=Documentation/filesystems/ramfs-rootfs-initramfs.txt
    以下是一个典型的ramdisk中包含的文件列表:
    ./init.trout.rc
    .
    /default.prop
    .
    /proc
    .
    /dev
    .
    /init.rc
    .
    /init
    .
    /sys
    .
    /init.goldfish.rc
    .
    /sbin
    .
    /sbin/adbd
    .
    /system
    .
    /data

     


    recovery映像包含了一些额外的文件,例如一个叫做recovery的二进制程序,以及一些对该程序支持性的资源图片文件(当你您按下home+power组合键的时候就会运行这个recovery程序)。
    典型的文件列表如下:
    ./res
    .
    /res/images
    .
    /res/images/progress_bar_empty_left_round.bmp
    .
    /res/images/icon_firmware_install.bmp
    .
    /res/images/indeterminate3.bmp
    .
    /res/images/progress_bar_fill.bmp
    .
    /res/images/progress_bar_left_round.bmp
    .
    /res/images/icon_error.bmp
    .
    /res/images/indeterminate1.bmp
    .
    /res/images/progress_bar_empty_right_round.bmp
    .
    /res/images/icon_firmware_error.bmp
    .
    /res/images/progress_bar_right_round.bmp
    .
    /res/images/indeterminate4.bmp
    .
    /res/images/indeterminate5.bmp
    .
    /res/images/indeterminate6.bmp
    .
    /res/images/progress_bar_empty.bmp
    .
    /res/images/indeterminate2.bmp
    .
    /res/images/icon_unpacking.bmp
    .
    /res/images/icon_installing.bmp
    .
    /sbin/recovery

     


    3、对映像文件进行解包、编辑、打包的常规方法

    (注意,下面我给你您介绍的是手工命令行方式进行解包以及重新打包的方法,但是我仍然创建了两个perl脚本,这两个脚本可以让你您的解包和打包工作变得轻松许多。

    可以参考本文的附件

    unpack-bootimg.zip  http://android-dls.com/files/apps/unpack-bootimg.zip

    repack-bootimg.zip  http://android-dls.com/files/apps/repack-bootimg.zip


    如果你您很擅长使用16进制编辑器的话,你您可以打开boot.img或者recovery.img,然后跳过开始的2K的头数据,然后寻找一大堆0的数据,在这一堆0的数据后面,紧跟着1F 8B这两个数字(1F 8B是gzip格式的文件的结束标记)。从此文件开始的地方(跳过2K的头),一大堆0后面紧跟着到1F 8B这两个数字为止的全部数据,就是gzip压缩过的linux内核。从1F 8B后面紧跟着的数据一直到文件的结尾包含的全部数据,就是ramdisk内存盘的数据。你您可以把把内核和ramdisk两个文件分别保存下来,在进行分别的修改和处理。我们可以通过un-cpio和un-gzip操作来读取ramdisk文件中的数据,可以使用如下的命令来实现这个目的,以下操作会生成一个目录,直接cd进去就可以看到ramdisk中的数据了:

    gunzip -c ../your-ramdisk-file | cpio -i

     


    此命令可以将ramdisk中的所有的文件解包到当前的工作目录下面,然后就可以对它进行编辑了。

    当需要重新打包ramdisk的时候,就需要re-cpio然后re-gzip这些数据和目录,可以通过如下命令来实现:(cpio会把所有当前目录下面的文件都打包进去,因此,在进行此步骤之前,请把不需要的文件都清除掉。)

    find . | cpio --H newc | gzip > ../newramdisk.cpio.gz

     


    最后一步就是通过mkbootimg这个工具,把kernel和ramdisk打包在一起,生成一个boot.img:

    mkbootimg --cmdline 'no_console_suspend=1 console=null' --kernel your-kernel-file --ramdisk newramdisk.cpio.gz -o mynewimage.img

     


    这里的mkbootimg工具会在编译android的源代码的时候会在~/android-src/out/host/linux-x86/bin目录下面自动生成。
    下载地址:
    http://git.source.android.com/?p=platform/system/core.git;a=tree;f=mkbootimg

    现在,如果不想背这些复杂的命令或者摆弄那个让人眩晕的16进制编辑器的话,可以尝试使用我编写的用于解包和打包的perl脚本了。希望这些脚本能够节约各位的键盘。

    3.1、另一种解包、编辑、打包的方法
    下载split_bootimg.zip文件,在此zip文件中包含一个perl文件,split_bootimg.pl脚本,该脚本可以读取boot.img头(根据Android源码中的bootimg.h读取)将kernel和ramdisk读取出来,此脚本也会输出内核命令行和板子名字。http://android-dls.com/files/linux/split_bootimg.zip

    (注意,不要使用从/dev/mtd/mtd2直接拷贝出来的boot.img,此映像可能在读取过程遭到损坏。)
    下面是一个从TC4-RC28更新中提取出来的boot.img进行解包操作:
    % ./split_bootimg.pl boot.img 
    Page size: 2048 (0x00000800)
    Kernel size: 1388548 (0x00153004)
    Ramdisk size: 141518 (0x000228ce)
    Second size: 0 (0x00000000)
    Board name: 
    Command line: no_console_suspend=1
    Writing boot.img-kernel ... complete.
    Writing boot.img-ramdisk.gz ... complete.

     


    解包ramdisk的命令如下:
    % mkdir ramdisk
    % cd ramdisk
    % gzip -dc ../boot.img-ramdisk.gz | cpio -i
    % cd ..

     


    解码完毕后,就可以修改了(例如,在default.prop设置ro.secure=0等等)

    使用mkbootfs工具(mkbootfs工具是编译完毕Android源代码以后,就会在~/android-src/out/host/linux-x86/bin自动生成)来重新创建ramdisk,可以使用如下命令来操作:
    % mkbootfs ./ramdisk | gzip > ramdisk-new.gz

     


    使用mkbootimg来重新创建boot.img,mkbootimg也可以在~/android-src/out/host/linux-x86/bin目录中可以找到:
    % mkbootimg --cmdline 'no_console_suspend=1 console=null' --kernel boot.img-kernel --ramdisk ramdisk-new.gz -o boot-new.img

     

    (注意:console=null的命令行选现是从TC4-RC30的boot.img引入的,用以去掉root shell)

    4、将新的映像刷回到手机
    可以将recovery.img拷贝到/system目录下面,然后重新启动手机,让手机自动为你您刷写到mtd里面(工作原理在上面已经提过了)。对于boot.img可以通过将其拷贝到sd卡的根目录,然后通过手机内的刷写工具将此映像写入到手机中。

    例如,使用adb工具Android SDK中的一个工具)将boot.img拷贝到手机的sd卡的根目录:
    adb push ./mynewimage.img /sdcard

     

    然后通过adb shell登录手机(获取过ROOT的)的shell交互模式,利用命令行进行交互:
    # cat /dev/zero > /dev/mtd/mtd2
       write: No space left on device [this is ok, you can ignore]
    # flash_image boot /sdcard/mynewimage.img

     

    然后重启手机。

    如果手机能够正常启动,那么祝贺你您,你您的修改和替换已经成功了;如果不能够顺利启动,则需要重新启动进入recovery模式,并且使用update.zip来恢复。

    5、解包、编辑、打包为我们带来了什么
    可以修改手机开机启动时候的画面,具体的操作的地址为:
    http://forum.xda-developers.com/showthread.php?t=443431

    6、本文讲的内容与使用update.zip刷机包不是一码事

    您可以很容易地在其他论坛上看到关于如何自制update.zip刷机包的方法,也可以下载到很多在网络上共享的自制刷机包。例如:近期的多数刷机包都来自对rc30包的修改和调整。在update.zip刷机包里面会包括新的boot.img,recovery.img以及整个system/目录下的若干文件的替换和更新。如果您希望自己自制boot.img以及recovery.img,建议您选取相对较新的更新和版本。(选用较老的映像的话,或许会出现兼容性问题)。 

     

     

    对Gphone文件系统镜像的制作做一个简单的记录。

    一、镜像的制作

    前两天对镜像进行了解包和简单的分析。然后把解包后的文件又压缩成了镜像刷会了我的G1手机。在这里我简单记录一下如何压缩镜像。

    压缩镜像其实比解压简单得多。只要将ramdisk的文件夹和内核的zImage放在同一个文件夹下。然后将以下工具也放入同个文件夹:mkbootimgrepack-bootimg.pl 。(此处的mkbootimg并不适合HTC版本的 G2  boot.img的制作、如需创建HTC版本的 G2  boot.img则要修改mkbootimg的源码,具体的修改方法我会在日后放出)

    之后就打开shell,进入这个文件夹,然后执行:

    ./repack-bootimg.pl zImage ramdisk boot.img

    很快的,最后在文件夹下产生的 boot.img就是boot.img镜像。其实repack-bootimg.pl在这行过程中会调用同目录下的mkbootimg。而repack-bootimg.pl的使用格式是

    repack-bootimg.pl <kernel> <ramdisk-directory> <outfile>

    repack-bootimg.pl具体的原理你可以看看这个脚本的代码。recovery.img的镜像制作也是一样的。

     

    二、简单的刷机


    在有了镜像之后,就可以刷机了。具体方法如下:

    (1)先在G1上插入SD卡,然后把G1和电脑通过USB相连。下载SDK,解包后,通过shell在tools目录下运行:

                sudo ./adb kill-server

                sudo./adb push (你的boot.img镜像路径) /sdcard


    这样,你的boot.img镜像就在Gphone的SD卡中了

    (2)然后,执行:

        sudo ./adb kill-server

        sudo ./adb shell
        * daemon not running. starting it now *
        * daemon started successfully *

        #cat /dev/zero > /dev/mtd/mtd2
        write: No space left on device
        #flash_image boot /sdcard/(你的boot.img镜像名称)



    这样,你就将新的boot.img镜像刷进了Gphone!可以启动看看了.

     

    展开全文
  • 首先声明这是转帖,LINUX环境大家可以用VMWARE来虚拟,可以下载UBUNTU 目录 1、背景知识 2、boot和recovery映像的文件结构 3、对映像...5、解包、编辑、打包为我们带来了什么 6、本文讲的内容与使用update.zip刷机...

    首先声明这是转帖,LINUX环境大家可以用VMWARE来虚拟,可以下载UBUNTU
    目录
    1、背景知识
    2、boot和recovery映像的文件结构
    3、对映像文件进行解包、编辑、打包的常规方法
    3.1、另一种解包、编辑、打包的方法
    4、将新的映像刷回到手机
    5、解包、编辑、打包为我们带来了什么
    6、本文讲的内容与使用update.zip刷机包不是一码事
    正文
    1、背景知识
    Android手机的文件系统有许多存储器组成,以下是在adb shell下面的输出:
    #cat/proc/mtd
    dev:         size         erasesize     name
    mtd0:   00040000    00020000     "misc"
    mtd1:   00500000    00020000     "recovery"
    mtd2:   00280000    00020000     "boot"
    mtd3:   04380000    00020000     "system"
    mtd4:   04380000    00020000     "cache"
    mtd5:   04ac0000    00020000      "userdata"
    注意,不同的手机在上述存储设备的顺序可能会各不相同!一定要检查您的手机,确定在以下的操作中选择正确的设备号(mtdX,这个X的序号一定要检查清楚)。
    在本向导中,我们主要描述对"recovery"和"boot"的存储设备进行操作;"system"存储设备保存了android系统目录的所有数据(在系统启动后会挂载到“system/”目录);“userdata”存储设备将保存了android数据目录中的所有数据(在系统启动后会挂载到“data/”目录,里面是会有很多应用数据以及用户的preference之类的配置数据)。
    从上面的输出可以看出来,recovery和boot分区对应着/dev/mtd/mtd1和/dev/mtd/mtd2,在你您开始做任何修改之前一定要做两件事情,第一件事情,一定要先对这两个分区进行备份。
    可以使用如下命令进行备份:
    # cat/dev/mtd/mtd1>/sdcard/recovery.img
    # cat/dev/mtd/mtd2>/sdcard/boot.img
    (注意,只有手机获取了ROOT权限以后才能够执行上述的备份命令)
    第二件事情,你您应该把你您最喜欢的update.zip刷机包放置到你您的sd卡的根目录上面。如此一来,即使你您在后续的操作中出了问题,也可以启动到recovery模式进行恢复。
    另外一个你您需要知道的重要文件是在android系统目录下的/system/recovery.img,此文件是mtd1存储设备的完全拷贝。这个文件在每次关机的时候,会自动地被写回到mtd1存储设备里面。
    这会意味着两个事情:
    (1)任何对/dev/mtd/mtd1中数据的直接修改都会在下一次重启手机以后消失。
    (2)如果希望对/dev/mtd/mtd1进行修改,最简单的做法是用你您自己的recovery.img替换掉/system/recovery.img。当你您创建自己的update.zip刷机包的时候(特别是在做刷机包的适配的时候),如果你您忘记替换这个/system/recovery.img,这个recovery.img就会在关机的时候被烧写到mtd1里面去或许会变砖。一定要注意这一点!
    (译者的话,关于这个/system/recovery.img文件,在2.1的android的平台里面并没有找到,或许这个机制已经out了?!或者偶本人对这段话的理解不够深入?!希望明白的朋友不吝斧正)
    2、boot和recovery映像的文件结构
    boot和recovery映像并不是一个完整的文件系统,它们是一种android自定义的文件格式,该格式包括了2K的文件头,后面紧跟着是用gzip压缩过的内核,再后面是一个ramdisk内存盘,然后紧跟着第二阶段的载入器程序(这个载入器程序是可选的,在某些映像中或许没有这部分)。此类文件的定义可以从源代码android-src/system/core/mkbootimg找到一个叫做notice.pngbootimg.h的文件。
    (译者的话,原文是一个叫做mkbootimg.h的文件,但从Android 2.1的代码来看,该文件名应该是改为bootimg.h了)。
    /*
    ** +-----------------+
    ** | boot header     | 1 page
    ** +-----------------+
    ** | kernel              | n pages  
    ** +-----------------+
    ** | ramdisk           | m pages  
    ** +-----------------+
    ** | second stage    | o pages
    ** +-----------------+
    **
    ** n = (kernel_size + page_size - 1) / page_size
    ** m = (ramdisk_size + page_size - 1) / page_size
    ** o = (second_size + page_size - 1) / page_size
    **
    ** 0. all entities are page_size aligned in flash
    ** 1. kernel and ramdisk are required (size != 0)
    ** 2. second is optional (second_size == 0 -> no second)
    ** 3. load each element (kernel, ramdisk, second) at
    **    the specified physical address (kernel_addr, etc)
    ** 4. prepare tags at tag_addr.  kernel_args[] is
    **    appended to the kernel commandline in the tags.
    ** 5. r0 = 0, r1 = MACHINE_TYPE, r2 = tags_addr
    ** 6. if second_size != 0: jump to second_addr
    **    else: jump to kernel_addr
    */
    ramdisk映像是一个最基础的小型文件系统,它包括了初始化系统所需要的全部核心文件,例如:初始化init进程以及init.rc(可以用于设置很多系统的参数)等文件。如果你您希望了解更多关于此文件的信息可以参考以下网址:
    notice.pnghttp://git.source.android.com/?p=kernel/common.git;a=blob;f=Documentation/filesystems/ramfs-rootfs-initramfs.txt
    以下是一个典型的ramdisk中包含的文件列表:
    ./init.trout.rc
    ./default.prop
    ./proc
    ./dev
    ./init.rc
    ./init
    ./sys
    ./init.goldfish.rc
    ./sbin
    ./sbin/adbd
    ./system
    ./data
    recovery映像包含了一些额外的文件,例如一个叫做recovery的二进制程序,以及一些对该程序支持性的资源图片文件(当你您按下home+power组合键的时候就会运行这个recovery程序)。
    典型的文件列表如下:
    ./res
    ./res/images
    ./res/images/progress_bar_empty_left_round.bmp
    ./res/images/icon_firmware_install.bmp
    ./res/images/indeterminate3.bmp
    ./res/images/progress_bar_fill.bmp
    ./res/images/progress_bar_left_round.bmp
    ./res/images/icon_error.bmp
    ./res/images/indeterminate1.bmp
    ./res/images/progress_bar_empty_right_round.bmp
    ./res/images/icon_firmware_error.bmp
    ./res/images/progress_bar_right_round.bmp
    ./res/images/indeterminate4.bmp
    ./res/images/indeterminate5.bmp
    ./res/images/indeterminate6.bmp
    ./res/images/progress_bar_empty.bmp
    ./res/images/indeterminate2.bmp
    ./res/images/icon_unpacking.bmp
    ./res/images/icon_installing.bmp
    ./sbin/recovery
    3、对映像文件进行解包、编辑、打包的常规方法

    (注意,下面我给你您介绍的是手工命令行方式进行解包以及重新打包的方法,但是我仍然创建了两个perl脚本,这两个脚本可以让你您的解包和打包工作变得轻松许多。
    可以参考本文的附件
    unpack-bootimg.zip   http://android-dls.com/files/apps/unpack-bootimg.zip
    repack-bootimg.zip   http://android-dls.com/files/apps/repack-bootimg.zip
    如果你您很擅长使用16进制编辑器的话,你您可以打开boot.img或者recovery.img,然后跳过开始的2K的头数据,然后寻找一大堆0的数据,在这一堆0的数据后面,紧跟着1F 8B这两个数字(1F 8B是gzip格式的文件的结束标记)。从此文件开始的地方(跳过2K的头),一大堆0后面紧跟着到1F 8B这两个数字为止的全部数据(不包括1F 8B),就是gzip压缩过的linux内核。从1F 8B开始一直到文件的结尾包含的全部数据,就是ramdisk内存盘的数据。你您可以把把内核和ramdisk两个文件分别保存下来,在进行分别的修改和处理。我们可以通过un-cpio和un-gzip操作来读取ramdisk文件中的数据,可以使用如下的命令来实现这个目的,以下操作会生成一个目录,直接cd进去就可以看到ramdisk中的数据了:
    gunzip -c ../your-ramdisk-file | cpio -i
    此命令可以将ramdisk中的所有的文件解包到当前的工作目录下面,然后就可以对它进行编辑了。
    当需要重新打包ramdisk的时候,就需要re-cpio然后re-gzip这些数据和目录,可以通过如下命令来实现:(cpio会把所有当前目录下面的文件都打包进去,因此,在进行此步骤之前,请把不需要的文件都清除掉。)
    find . | cpio -o -H newc | gzip > ../newramdisk.cpio.gz
    最后一步就是通过 mkbootimg这个工具,把kernel和ramdisk打包在一起,生成一个boot.img:
    mkbootimg --cmdline 'no_console_suspend=1 console=null'
    --kernel your-kernel-file --ramdisk newramdisk.cpio.gz -o mynewimage.img
    这里的mkbootimg工具会在编译android的源代码的时候会在~/android-src/out/host/linux-x86/bin目录下面自动生成。
    下载地址:
    http://git.source.android.com/?p=platform/system/core.git;a=tree;f=mkbootimg
    现在,如果不想背这些复杂的命令或者摆弄那个让人眩晕的16进制编辑器的话,可以尝试使用我编写的用于解包和打包的perl脚本了。希望这些脚本能够节约各位的键盘。
    3.1、另一种解包、编辑、打包的方法
    下载 split_bootimg.zip文件,在此zip文件中包含一个perl文件,split_bootimg.pl脚本,该脚本可以读取boot.img头(根据 Android源码中的bootimg.h读取)将kernel和ramdisk读取出来,此脚本也会输出内核命令行和板子名字。 http://android-dls.com/files/linux/split_bootimg.zip
    (注意,不要使用从/dev/mtd/mtd2直接拷贝出来的boot.img,此映像可能在读取过程遭到损坏。)
    下面是一个从TC4-RC28更新中提取出来的boot.img进行解包操作:
    % ./split_bootimg.pl boot.img
    Page size: 2048 (0x00000800)
    Kernel size: 1388548 (0x00153004)
    Ramdisk size: 141518 (0x000228ce)
    Second size: 0 (0x00000000)
    Board name:
    Command line: no_console_suspend=1
    Writing boot.img-kernel ... complete.
    Writing boot.img-ramdisk.gz ... complete.
    解包ramdisk的命令如下:
    % mkdir ramdisk
    % cd ramdisk
    % gzip -dc ../boot.img-ramdisk.gz | cpio -i
    % cd ..
    解码完毕后,就可以修改了(例如,在default.prop设置ro.secure=0等等)
    使用mkbootfs工具(mkbootfs工具是编译完毕Android源代码以后,就会在~/android-src/out/host/linux-x86/bin自动生成)来重新创建ramdisk,可以使用如下命令来操作:
    % mkbootfs ./ramdisk | gzip > ramdisk-new.gz
    使用mkbootimg来重新创建boot.img,mkbootimg也可以在~/android-src/out/host/linux-x86/bin目录中可以找到:
    % mkbootimg --cmdline 'no_console_suspend=1 console=null'
    --kernel boot.img-kernel --ramdisk ramdisk-new.gz -o boot-new.img
    (注意:console=null的命令行选现是从TC4-RC30的boot.img引入的,用以去掉root shell)
    4、将新的映像刷回到手机
    可以将recovery.img拷贝到/system目录下面,然后重新启动手机,让手机自动为你您刷写到mtd里面(工作原理在上面已经提过了)。对于boot.img可以通过将其拷贝到sd卡的根目录,然后通过手机内的刷写工具将此映像写入到手机中。
    例如,使用 adb工具( Android SDK中的一个工具)将boot.img拷贝到手机的sd卡的根目录:
    adb push ./mynewimage.img /sdcard
    然后通过adb shell登录手机(获取过 ROOT的)的shell交互模式,利用命令行进行交互:
    # cat /dev/zero >/dev/mtd/mtd2
       write: No space left on device [this is ok, you can ignore]
    # flash_image boot /sdcard/mynewimage.img
    然后重启手机。
    如果手机能够正常启动,那么祝贺你您,你您的修改和替换已经成功了;如果不能够顺利启动,则需要重新启动进入recovery模式,并且使用update.zip来恢复。
    5、解包、编辑、打包为我们带来了什么
    可以修改手机开机启动时候的画面,具体的操作的地址为:
    http://forum.xda-developers.com/showthread.php?t=443431
    nitlogo.rle: display an image on boot

    You can display a "splash" screen of sorts upon boot. You just have to have a file named initlogo.rle in your root directory. The trick is that the root directory is overwritten each time you boot with the contents of your boot image (mtd2). There are instructions elsewhere on the forums for updating this image.
    You can prove to yourself that this works by just copying logo.rle to initlogo.rle in your updated boot image and you will see the "G1" screen twice.
    The hurdle I'm running into is generating my own images. There is a program called to565 that takes in an image and spits out the resulting image in the appropriate format (give it the -r flag to generate an rle) [edit, correct flag is -rle]. However, everything I generate with this just looks like random colored bars when I boot up (and sometimes at the bottom of the screen I see part of whatever was left in the framebuffer when I shut down). Supposedly to565 takes in a raw rgb888 file, and perhaps I'm not generating those properly. I tried saving to "raw image" from gimp but so far everything is just different variations on colored bars.
    I may give up at this point, but I thought others might be interesting in picking up where I left off.

    6、本文讲的内容与使用update.zip刷机包不是一码事
    您可以很容易地在其他论坛上看到关于如何自制update.zip刷机包的方法,也可以下载到很多在网络上共享的自制刷机包。例如:近期的多数刷机包都来自对rc30包的修改和调整。在update.zip刷机包里面会包括新的boot.img,recovery.img以及整个system/目录下的若干文件的替换和更新。如果您希望自己自制boot.img以及recovery.img,建议您选取相对较新的更新和版本。(选用较老的映像的话,或许会出现兼容性问题)。

    转载于:https://www.cnblogs.com/AlexCheng/archive/2011/03/22/2120056.html

    展开全文
  • 目录 1、背景知识 2、boot和recovery映像的文件结构 ...6、本文讲的内容与使用update.zip刷机包不是一码事 正文 1、背景知识 Android手机的文件系统有许多存储器组成,以下是在adb shell下面的
    目录
    1、背景知识
    2、boot和recovery映像的文件结构
    3、对映像文件进行解包、编辑、打包的常规方法
    3.1、另一种解包、编辑、打包的方法
    4、将新的映像刷回到手机
    5、解包、编辑、打包为我们带来了什么
    6、本文讲的内容与使用update.zip刷机包不是一码事

    正文
    1、背景知识

    Android手机的文件系统有许多存储器组成,以下是在adb shell下面的输出:
    #cat/proc/
    mtd
    dev:         size         erasesize     name
    mtd0:   
    00040000    00020000     "misc"

    mtd1:   
    00500000    00020000     "recovery"
    mtd2:   
    00280000    00020000     "boot"
    mtd3:   
    04380000    00020000     "system"
    mtd4:   
    04380000    00020000     "cache"
    mtd5:
      04ac0000    00020000      "userdata"



    注意,不同的手机在上述存储设备的顺序可能会各不相同!一定要检查您的手机,确定在以下的操作中选择正确的设备号(mtdX,这个X的序号一定要检查清楚)。

    在本向导中,我们主要描述对"recovery"和"boot"的存储设备进行操作;"system"存储设备保存了android系统目录的所有数据(在系统启动后会挂载到“system/”目录);“userdata”存储设备将保存了android数据目录中的所有数据(在系统启动后会挂载到“data/”目录,里面是会有很多应用数据以及用户的preference之类的配置数据)。

    从上面的输出可以看出来,recovery和boot分区对应着/dev/mtd/mtd1和/dev/mtd/mtd2,在你您开始做任何修改之前一定要做两件事情,第一件事情,一定要先对这两个分区进行备份。
    可以使用如下命令进行备份:
    # cat/dev/mtd/mtd1>/sdcard/recovery.img
    # cat
    /dev/mtd/mtd2>/sdcard/boot.img


    (注意,只有手机获取了ROOT权限以后才能够执行上述的备份命令)

    第二件事情,你您应该把你您最喜欢的update.zip刷机包放置到你您的sd卡的根目录上面。如此一来,即使你您在后续的操作中出了问题,也可以启动到recovery模式进行恢复。

    另外一个你您需要知道的重要文件是在android系统目录下的/system/recovery.img,此文件是mtd1存储设备的完全拷贝。这个文件在每次关机的时候,会自动地被写回到mtd1存储设备里面。

    这会意味着两个事情:
    (1)任何对/dev/mtd/mtd1中数据的直接修改都会在下一次重启手机以后消失。
    (2)如果希望对/dev/mtd/mtd1进行修改,最简单的做法是用你您自己的recovery.img替换掉/system/recovery.img。当你您创建自己的update.zip刷机包的时候(特别是在做刷机包的适配的时候),如果你您忘记替换这个/system/recovery.img,这个recovery.img就会在关机的时候被烧写到mtd1里面去或许会变砖。一定要注意这一点!

    (译者的话,关于这个/system/recovery.img文件,在2.1的android的平台里面并没有找到,或许这个机制已经out了?!或者偶本人对这段话的理解不够深入?!希望明白的朋友不吝斧正)

    2、boot和recovery映像的文件结构
    boot和recovery映像并不是一个完整的文件系统,它们是一种android自定义的文件格式,该格式包括了2K的文件头,后面紧跟着是用gzip压缩过的内核,再后面是一个ramdisk内存盘,然后紧跟着第二阶段的载入器程序(这个载入器程序是可选的,在某些映像中或许没有这部分)。此类文件的定义可以从源代码android-src/system/core/mkbootimg找到一个叫做

    bootimg.h的文件。

    (译者的话,原文是一个叫做mkbootimg.h的文件,但从Android 2.1的代码来看,该文件名应该是改为bootimg.h了)。

    /*
    ** +-----------------+
    ** | boot header     | 1 page
    ** +-----------------+
    ** | kernel              | n pages  
    ** +-----------------+
    ** | ramdisk           | m pages  
    ** +-----------------+
    ** | second stage    | o pages
    ** +-----------------+
    **
    ** n = (kernel_size + page_size - 1) / page_size
    ** m = (ramdisk_size + page_size - 1) / page_size
    ** o = (second_size + page_size - 1) / page_size
    **
    ** 0. all entities are page_size aligned in flash
    ** 1. kernel and ramdisk are required (size != 0)
    ** 2. second is optional (second_size == 0 -> no second)
    ** 3. load each element (kernel, ramdisk, second) at
    **    the specified physical address (kernel_addr, etc)
    ** 4. prepare tags at tag_addr.  kernel_args[] is
    **    appended to the kernel commandline in the tags.
    ** 5. r0 = 0, r1 = MACHINE_TYPE, r2 = tags_addr
    ** 6. if second_size != 0: jump to second_addr
    **    else: jump to kernel_addr
    */



    ramdisk映像是一个最基础的小型文件系统,它包括了初始化系统所需要的全部核心文件,例如:初始化init进程以及init.rc(可以用于设置很多系统的参数)等文件。

    以下是一个典型的ramdisk中包含的文件列表:
    ./init.trout.rc
    .
    /default
    .prop
    .
    /
    proc
    .
    /
    dev
    .
    /
    init.rc
    .
    /
    init
    .
    /
    sys
    .
    /
    init.goldfish.rc
    .
    /
    sbin
    .
    /sbin/
    adbd
    .
    /
    system
    .
    /data




    recovery映像包含了一些额外的文件,例如一个叫做recovery的二进制程序,以及一些对该程序支持性的资源图片文件(当你您按下home+power组合键的时候就会运行这个recovery程序)。
    典型的文件列表如下:

    ./res
    .
    /res/
    images
    .
    /res/images/
    progress_bar_empty_left_round.bmp
    .
    /res/images/
    icon_firmware_install.bmp
    .
    /res/images/
    indeterminate3.bmp
    .
    /res/images/
    progress_bar_fill.bmp
    .
    /res/images/
    progress_bar_left_round.bmp
    .
    /res/images/
    icon_error.bmp
    .
    /res/images/
    indeterminate1.bmp
    .
    /res/images/
    progress_bar_empty_right_round.bmp
    .
    /res/images/
    icon_firmware_error.bmp
    .
    /res/images/
    progress_bar_right_round.bmp
    .
    /res/images/
    indeterminate4.bmp
    .
    /res/images/
    indeterminate5.bmp
    .
    /res/images/
    indeterminate6.bmp
    .
    /res/images/
    progress_bar_empty.bmp
    .
    /res/images/
    indeterminate2.bmp
    .
    /res/images/
    icon_unpacking.bmp
    .
    /res/images/
    icon_installing.bmp
    .
    /sbin/recovery




    3、对映像文件进行解包、编辑、打包的常规方法

    (注意,下面我给你您介绍的是手工命令行方式进行解包以及重新打包的方法,但是我仍然创建了两个perl脚本,这两个脚本可以让你您的解包和打包工作变得轻松许多。

    如果你您很擅长使用16进制编辑器的话,你您可以打开boot.img或者recovery.img,然后跳过开始的2K的头数据,然后寻找一大堆0的数据,在这一堆0的数据后面,紧跟着1F 8B这两个数字(1F 8B是gzip格式的文件的结束标记)。从此文件开始的地方(跳过2K的头),一大堆0后面紧跟着到1F 8B这两个数字为止的全部数据(不包括1F 8B),就是gzip压缩过的linux内核。从1F 8B开始一直到文件的结尾包含的全部数据,就是ramdisk内存盘的数据。你您可以把把内核和ramdisk两个文件分别保存下来,在进行分别的修改和处理。我们可以通过un-cpio和un-gzip操作来读取ramdisk文件中的数据,可以使用如下的命令来实现这个目的,以下操作会生成一个目录,直接cd进去就可以看到ramdisk中的数据了:

    gunzip -c ../your-ramdisk-file | cpio -i

    此命令可以将ramdisk中的所有的文件解包到当前的工作目录下面,然后就可以对它进行编辑了。

    当需要重新打包ramdisk的时候,就需要re-cpio然后re-gzip这些数据和目录,可以通过如下命令来实现:(cpio会把所有当前目录下面的文件都打包进去,因此,在进行此步骤之前,请把不需要的文件都清除掉。)

    find . | cpio -o -H newc | gzip > ../newramdisk.cpio.gz

    最后一步就是通过 mkbootimg这个工具,把kernel和ramdisk打包在一起,生成一个boot.img:

    mkbootimg --cmdline 'no_console_suspend=1 console=null'
    --kernel your-kernel-file --ramdisk newramdisk.cpio.gz -o mynewimage.img

    这里的mkbootimg工具会在编译android的源代码的时候会在~/android-src/out/host/linux-x86/bin目录下面自动生成。

    现在,如果不想背这些复杂的命令或者摆弄那个让人眩晕的16进制编辑器的话,可以尝试使用我编写的用于解包和打包的perl脚本了。希望这些脚本能够节约各位的键盘。

    3.1、另一种解包、编辑、打包的方法
    下载 split_bootimg.zip文件,在此zip文件中包含一个perl文件,split_bootimg.pl脚本,该脚本可以读取boot.img头(根据 Android源码中的bootimg.h读取)将kernel和ramdisk读取出来,此脚本也会输出内核命令行和板子名字。

    (注意,不要使用从/dev/mtd/mtd2直接拷贝出来的boot.img,此映像可能在读取过程遭到损坏。)
    下面是一个从TC4-RC28更新中提取出来的boot.img进行解包操作:
    % ./split_bootimg.pl boot.img
    Page size: 2048 (0x00000800)
    Kernel size: 1388548 (0x00153004)
    Ramdisk size: 141518 (0x000228ce)
    Second size: 0 (0x00000000)
    Board name:
    Command line: no_console_suspend=1
    Writing boot.img-kernel ... complete.
    Writing boot.img-ramdisk.gz ... complete.


    解包ramdisk的命令如下:
    % mkdir ramdisk
    % cd ramdisk
    % gzip -dc ../boot.img-ramdisk.gz | cpio -i
    % cd ..

    解码完毕后,就可以修改了(例如,在default.prop设置ro.secure=0等等)

    使用mkbootfs工具(mkbootfs工具是编译完毕Android源代码以后,就会在~/android-src/out/host/linux-x86/bin自动生成)来重新创建ramdisk,可以使用如下命令来操作:
    % mkbootfs ./ramdisk | gzip > ramdisk-new.gz

    使用mkbootimg来重新创建boot.img,mkbootimg也可以在~/android-src/out/host/linux-x86/bin目录中可以找到:
    % mkbootimg --cmdline 'no_console_suspend=1 console=null'
    --kernel boot.img-kernel --ramdisk ramdisk-new.gz -o boot-new.img

    (注意:console=null的命令行选现是从TC4-RC30的boot.img引入的,用以去掉root shell)

    4、将新的映像刷回到手机
    可以将recovery.img拷贝到/system目录下面,然后重新启动手机,让手机自动为你您刷写到mtd里面(工作原理在上面已经提过了)。对于boot.img可以通过将其拷贝到sd卡的根目录,然后通过手机内的刷写工具将此映像写入到手机中。

    例如,使用 adb工具( Android SDK中的一个工具)将boot.img拷贝到手机的sd卡的根目录:
    adb push ./mynewimage.img /sdcard

    然后通过adb shell登录手机(获取过 ROOT的)的shell交互模式,利用命令行进行交互:
    # cat /dev/zero >/dev/mtd/mtd2
       write: No space left on device [this is ok, you can ignore]
    # flash_image boot /sdcard/mynewimage.img

    然后重启手机。

    如果手机能够正常启动,那么祝贺你您,你您的修改和替换已经成功了;如果不能够顺利启动,则需要重新启动进入recovery模式,并且使用update.zip来恢复。

    5、解包、编辑、打包为我们带来了什么
    可以修改手机开机启动时候的画面

    You can display a "splash" screen of sorts upon boot. You just have to have a file named initlogo.rle in your root directory. The trick is that the root directory is overwritten each time you boot with the contents of your boot image (mtd2). There are instructions elsewhere on the forums for updating this image.

    You can prove to yourself that this works by just copying logo.rle to initlogo.rle in your updated boot image and you will see the "G1" screen twice.

    The hurdle I'm running into is generating my own images. There is a program called [url=]to565[/url] that takes in an image and spits out the resulting image in the appropriate format (give it the -r flag to generate an rle) [edit, correct flag is -rle]. However, everything I generate with this just looks like random colored bars when I boot up (and sometimes at the bottom of the screen I see part of whatever was left in the framebuffer when I shut down). Supposedly to565 takes in a raw rgb888 file, and perhaps I'm not generating those properly. I tried saving to "raw image" from gimp but so far everything is just different variations on colored bars.

    I may give up at this point, but I thought others might be interesting in picking up where I left off.



    6、本文讲的内容与使用update.zip刷机包不是一码事

    您可以很容易地在其他论坛上看到关于如何自制update.zip刷机包的方法,也可以下载到很多在网络上共享的自制刷机包。例如:近期的多数刷机包都来自对rc30包的修改和调整。在update.zip刷机包里面会包括新的boot.img,recovery.img以及整个system/目录下的若干文件的替换和更新。如果您希望自己自制boot.img以及recovery.img,建议您选取相对较新的更新和版本。(选用较老的映像的话,或许会出现兼容性问题)。

    展开全文
  • 首先声明这是转帖,LINUX环境大家可以用VMWARE来虚拟,可以下载UBUNTU 目录 1、背景知识 2、boot和recovery映像的文件结构 ...6、本文讲的内容与使用update.zip刷机包不是一码事 正文 1、背景知识
  • 下载并打开工程: ...图片全部使用img标签统一。传输进度条的效果也不错。 文档图片被放置在哪了: 存放地址:D:\apache-tomcat-6.0.29\webapps\WordPaster2UEditor1x\upload\2019\04\16...
  • 我用sharepoint设计了一个网站,在邀请外部人员进来后,外部人员向我申请编辑的权限,我同意了。 但是现在显示他们有编辑每个网页的权限,怎么更改呢?![图片说明]...
  • 有没有代码能让一个可编辑元素在被创建时自动选中?如图 <p><img alt="图片出问题了,反正是自动选中" height="64" src="https://img-ask.csdnimg.cn/upload/1610455200421.PNG" width="122" /></p> ...
  • ![图片说明](https://img-ask.csdn.net/upload/201706/15/1497519570_131861.png)
  • Ueditor编辑器在上传图片后,所插入的img标签中,title、alt属性设置的值可能不是我们希望的值,同时,当鼠标移到图片上时会出现title属性值的内容。此时,可通过修改ueditor.all.js文件中这几个属性的赋值内容,...
  • 这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、...
  • ![图片说明](https://img-ask.csdn.net/upload/201905/26/1558847976_545597.png) 如题:
  • 这篇文章主要介绍了js获取UEditor富文本编辑器中的图片地址,最简单的思路应该是先获取UEditor中的内容再将获取到的字符串转换成jquery对象,选择器找到img元素,获取src值 写之前在网上找了很多方法,最简单的思路...
  • 本篇文章给大家带来的内容是关于富文本中如何选择一个img插入编辑器(附代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。我在是在编辑器上调用一个弹出层,请求到图片数据之后,如何把选择的...
  • 我正在用HTML编辑文档,并希望专注于本文档的内容.因此,我宁愿避免在img元素周围添加任何额外的div元素,至少在源文档中是这样.是否有任何简单的javascript模块,我可以插入为此目的?澄清.简单:img:hover {height: ...
  • 我在点插入是,弹出的编辑框了 的内容是整个Model的属性,我想只显示部分(即Model里部分属性才可编辑),求大神指点!! ![图片说明](https://img-ask.csdn.net/upload/201508/27/1440645687_775861.png)
  • 自己在网上查找代码凑了一个小程序,功能是:**把编辑框的内容保存到文件中** 具体相关函数如下: ``` //保存文件 void savefile(string b,string c) { string the_end = ""; the_end = the_end + c +"\n"+...
  • 想实现根据拖拽的最后位置,获取右侧内容区域拖拽位置以上的文字内容放在一个单独的字段里存起来. 富文本的输入域是 可编辑div实现的, 不需要完整做出来,帮我提供一个可实现的思路就可以 谢谢    </p>
  • **最近在浏览帖子时看到了关于在Eclipse中设置代码区背景图片的一些内容,基于好奇,我也按照介绍实现了一下,在eclipse\plugins\org.eclipse.ui.themes_1.2.700.v20190826-0816\css路径下,对e4-dark_win.css进行了...
  • csdn头像点击进入创作中心,进去栏目设置。可以新增栏目,然后点击写入标题,下面内容可是实现html,这就非常好办了,用一个img标签,再写一个草稿把你的图片的url复制贴到img标签中,点击编辑栏目。即可。 ...
  • // 将编辑器保存起来,用来随时获取编辑器中的内容等,执行一些操作 this.editor.setData(this.articleData.content) }) .catch(error => { console.error(error); }); ``` 但无论如何都是无法显示。...
  • 如何编辑器的内容保存? 2.数据库表改如何设计?字段给多大合适 3.最好有整个流程的事例参考一下 补充:jsp + ssh +oracle 这种效果难道是保存了多个HTML? 诉我是一个小白 ...
  • 写之前在网上找了很多方法,最简单的思路应该是1.获取UEditor中的内容;2.将获取到的字符串转换成jquery对象;...//获取编辑内容var$p=document.createElement("p");//创建一个p元素对象$p.innerHTML...
  • 这里写线刷包img文件怎么解压自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个...
  • 1 环境:vs C# winform开发 2 前提:已经导入了文件到控件textbox上, 3 想法:用正则表达式对题目进行判断,当点击radiobutten选择...[图片说明](https://img-ask.csdn.net/upload/201704/13/1492068201_553370.png)
  • labelimg在conda下的安装

    2021-04-09 12:57:29
    这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、...

空空如也

空空如也

1 2 3 4 5 ... 9
收藏数 172
精华内容 68
关键字:

如何编辑img内容