关于android系统img结构和作用,下面这篇文章,讲的非常详尽了,copy几个关键点过来。

参考  https://my.oschina.net/u/2360415/blog/798578

ramdisk.img:Android根文件系统,在android编译系统生成的out/target/product/root目录中,打包方式 mkbootimgfs $root_dir | gzip > ramdisk.img
结构:
./init.trout.rc
./default.prop     保存一些调试参数,对于开发者相当重要
./proc
./dev
./init.rc                一些启动参数
./init
./sys
./init.goldfish.rc
./sbin            
./sbin/adbd
./system            system.img挂载点
./data                userdata.img挂载点

userdata.img    保存用户、应用信息。
结构:
/data/app          所有安装后的app会移至此处,apk被拆成dex和apk,dex为目标文件,apk为资源包
/data/data         应用程序内部存储信息,sharepreference、database,etc

system.img       包含整个android系统
结构:
system/app                    android出厂内置应用在此,同时,在这里的app可以获得一些特别的权限。
system/framework         android框架在此,不宜乱动,开发者可以使用adb push + 拔电池开关机可以快速验证问题。(前提是eng版本)
Special App:
SystemUI.apk 状态栏藏在里面。
framework-res.apk包含整个系统res文件夹 including 系统UI、一些配置参数、theme、style、animation

boot.img 包含一个Linux kernel (maybe named as zImage)和一个ramdisk。img文件结构在源码system/core/mkbootimg/bootimg.h中声明
打包:mkbootimg --kernel $kernelimg --ramdisk $ramdiskimg --kernel_base $kernel_base --page_size $page_size --cmd_line $cmd -o $out_image
--kernel --ramdisk 指定kernel ramdisk镜像
--kernel_base --page_size 【可选】指定kernel基址和页大小,如果有源码可以查看BoardConfig.mk
--cmd_line 指定一条命令,可以在开机的时候执行。
-o 输出镜像名字

uboot.img android启动时第一个加载的镜像,初始化硬件和基本输入出系统。

android开机过程:
上电,加载uboot,初始化硬件
加载boot.img,加载linux内核,建立文件系统。
根据启动模式,决定是正常启动、recovery_mode factory_mode。
加载recovery.img或者system.img

基本上,完全照抄。。。。

制作编译脚本:还是参考,或者说引用 https://blog.csdn.net/jklinux/article/details/82257841
顺便记录一下,source的时候,脚本中的函数,不能是 extract-bsp 这种连接符的形式,改为extract_bsp下划线是可以的。

编译流程:

1,source ./build/envsetup.sh     //添加 vendorsetup,可以通过hmm查看添加了哪些命令。env查看有哪些变量。

2,lunch                                         //在build/envsetup.sh

3,extract_bsp                              //android/device/softwinner/common/vendorsetup.sh,改成了下划线

4,make                                        //编译Android源码 //主要执行build/core/main.mk

5,pack                                        //  ./pack -c sun7i -p android -b wing-k10x6  -d uart0 -s none

pack的步骤,首先打包ramdisk.img。然后是boot.img。最后是完整系统包。

打包的过程,可以参照pack目录下的内容。

mk_rootfs.sh mk_bootimg.sh  mk_img_pack.sh

制作ramdisk.img和boot.img。然后进行pack

sudo ./tools/make_ext4fs -s -l 671088640 rootfs.img rootfs/

首先制作根文件系统,

确认分区
[mbr] size = 16384
bootloader
env
boot
rootfs
system
data
UDISK(这个不一定需要吧,虽然android写的是这个盘是最后一个)

 

各自的来历。

fsbuild boot-resource.ini split_xxxx.fex
mv boot-resource.fex bootloader.fex  //bootloader

u_boot_env_gen env.cfg env.fex  //生成env.fex

ln -s $CRANE_IMAGE_OUT/boot.img boot.fex
ln -s $CRANE_IMAGE_OUT/rootfs.img rootfs.fex

ln -s $CRANE_IMAGE_OUT/system.img system.fex

现在想要知道的,其实就两点,

1,怎么打包system.img

2,怎么把system.img打包到android.img中。

对于1的解释。

标准的 system.img: Android sparse image, version: 1.0, Total of 163840 4096-byte output blocks in 1539 input chunks.

编译的过程不太好跟踪。

直接尝试把目录打包吧,

sudo ./tools/make_ext4fs -s -l 671088640 rootfs.img rootfs/

哦,还发现一个问题,

/dev/mmcblk0p9 on /mnt/data/android/data type ext4 (rw,noatime,nodiratime,data=ordered)
/dev/mmcblk0p9 on /mnt/data/android/cache type ext4 (rw,noatime,nodiratime,data=ordered)
/dev/mmcblk0p9 on /mnt/data/android/misc type ext4 (rw,noatime,nodiratime,data=ordered)
看起来一样,实际目录里面的内容完全不同。。。为啥?
制作完整包的方法,有两种,
一个是在/data/分区中加入android_rootfs的内容。
另一个是把/data/android的内容加入到rootfs中。然后在第一次启动的时候,解压到/data/android目录。
建议先选择第二种,这样系统可以进行备份。并且已经有了先例,方便操作。
重新进行一次完整的T2编译,
在最后打包的时候,把android加入到 /目录下。然后修改rc.local脚本,安装android。

 

完整的回忆一下,需要做的事情,以W12为例。

1,首先,编译T2的boot.img。

      这一步,容易达成,没啥问题。

2,使用T2的rootfs以及相关的pack环境,sys_partition,sys_config.fex等。     

3,使用android的系统包,打包到 rootfs 下。然后通过修改 rc.local将其解压。

其中第二步,还不是很明确,继续查看git tool的内容,对这点进行确认。

build_icar.sh-》build_img-》./git-tool/script/sys/A20/check_img_arg.sh ~/code;mv ~/code/T2/icar-os-platform/A20C/tools/pack/sun* ~/code;

path_3="~/code/T2/icar-os-platform/"
path_2="~/code/T2/icar-os-platform/A20C"

cp -f ~/code/tdGUI-A20.ini $path_2/buildroot/target/dragonboard/rootfs  
cp -f
~/code/tdGUI-A20.tgz $path_2/buildroot/target/dragonboard/rootfs  

imgType="A20C";imgSize="W12-02";touchScreen="ctp";path_3="~/code/T2/icar-os-platform/"

./git-tool/script/sys/A20/imgmake.sh $imgType $imgSize $touchScreen $path_3 #执行制作镜像脚本,传递三个参数

cp -f ~/code/T2/icar-os-platform/kernel/$imgSize/boot.img ~/code/T2/icar-os-platform/A20C/out/dragonboard/common/boot.img

cd ~/code/T2/icar-os-platform/A20C/

~/code/T2/icar-os-platform/A20C/build.sh -p sun7i_dragonboard -m rootfs

buildroot/scripts/mkcommon.sh $@   mkrootfs  mkcmd.sh 

cp -f $path1/$imgType/T1buildroot/target/dragonboard/rootfs.ext4 $path1/$imgType/buildroot/target/dragonboard 
cp -f $path1/$imgType/T1buildroot/target/dragonboard/rootfs.ext4 $path1/$imgType/out/dragonboard/common 
$path1/$imgType/build.sh pack       ///看一下。

cd $PACK_ROOT  ~/code/T2/icar-os-platform/A20C/tools/pack
./pack -c $TARGET_CHIP -p $TARGET_PLATFORM -b $TARGET_BOARD       sun7i dragonboard rc-k10

#./pack -c sun7i -p dragonboard -b rc-k10
 

finish。

  rm -rf out/
  mkdir out/
  cp -v chips/$PACK_CHIP/configs/$PACK_PLATFORM/default/* out/
  cp -v chips/$PACK_CHIP/configs/$PACK_PLATFORM/$PACK_BOARD/*.fex out/ 2>/dev/null
  cp -v chips/$PACK_CHIP/configs/$PACK_PLATFORM/$PACK_BOARD/*.cfg out/ 2>/dev/null
  cp -rf chips/$PACK_CHIP/tools/split_xxxx.fex  chips/$PACK_CHIP/boot-resource/boot-resource chips/$PACK_CHIP/boot-resource/boot-resource.ini \
        out/
  cp -rf chips/$PACK_CHIP/tools/usbtool.fex chips/$PACK_CHIP/tools/cardtool.fex chips/$PACK_CHIP/tools/cardscript.fex \
        out/
  cp -rf chips/$PACK_CHIP/tools/aultls32.fex chips/$PACK_CHIP/tools/aultools.fex \
        out/
  cp -v chips/$PACK_CHIP/bin/boot0_nand_$PACK_CHIP.bin   out/boot0_nand.fex
  cp -v chips/$PACK_CHIP/bin/boot0_sdcard_$PACK_CHIP.bin out/boot0_sdcard.fex
  cp -v chips/$PACK_CHIP/bin/fes1_$PACK_CHIP.bin            out/fes1.fex
  cp -v chips/$PACK_CHIP/bin/u-boot-$PACK_CHIP.bin        out/u-boot.fex
  cd out/

  sed -i 's/\\boot-resource/\/boot-resource/g' boot-resource.ini
  sed -i 's/\\\\/\//g' image.cfg
  sed -i 's/imagename/;imagename/g' image.cfg

busybox unix2dos sys_config.fex
        busybox unix2dos sys_partition.fex
        script sys_config.fex
        script sys_partition.fex

        cp sys_config.bin  config.fex

        cp test_config.fex boot-resource/test_config.fex
        busybox unix2dos test_config.fex
        script test_config.fex
        cp test_config.bin boot-resource/test_config.bin

        update_boot0 boot0_nand.fex   sys_config.bin NAND
        update_boot0 boot0_sdcard.fex sys_config.bin SDMMC_CARD

        update_uboot u-boot.fex  sys_config.bin

        update_fes1  fes1.fex  sys_config.bin
        
    update_mbr sys_partition.bin  4

    fsbuild boot-resource.ini split_xxxx.fex

    # get bootloader.fex
    mv boot-resource.fex bootloader.fex

    # get bootloader.fex
    # mv bootfs.fex bootloader.fex

    # get env.fex
    u_boot_env_gen env.cfg env.fex

    # get other images from dragonboard build
    ln -s /home/seth/code/T2/icar-os-platform/A20C/boot.img boot.fex
    ln -s /home/seth/code/T2/icar-os-platform/A20C/rootfs.ext4 rootfs.fex

    dragon image.cfg sys_partition.fex

好的,基本理清。单独提取一下rootfs的制作,
cp -f icar-os-platform/backup/rc.local.ctp  icar-os-platform/A20C/buildroot/target/dragonboard/rootfs/etc/init.d/rc.local   //选择触摸屏的时候cp的。需要改动这部分。
ln -sf A20C/T1buildroot A20C/buildroot
echo "正在替换系统包..."
cp -f code/tdGUI-A20.ini A20C/buildroot/target/dragonboard/rootfs  
cp -f code/tdGUI-A20.tgz A20C/buildroot/target/dragonboard/rootfs  
这里再加一点:cp -f code/android.tar.gz A20C/buildroot/target/dragonboard/rootfs  
code/android.ini A20C/buildroot/target/dragonboard/rootfs 

cp -f T2/kernel/$imgSize/boot.img A20C/out/dragonboard/common/boot.img
cd A20C
A20C/build.sh -p sun7i_dragonboard -m rootfs

内部展开:
cp A20C/linux-3.4/output/lib/modules 到 T1buildroot/target/dragonboard/rootfs/lib/modules/
cd rootfs/lib/modules/3.4.39
shopt -s extglob
rm -f !(nand.ko|mali.ko|ump.ko|sunxi-ts.ko|gslX680.ko|gt9xx_ts.ko|sw-keyboard.ko|sunxi_csi0.ko|camera.ko|ch7102a.ko|8188eu.ko|cp210x.ko|lt8612_drv.ko|ch341.ko|pl2303.ko)
NR_SIZE=`du -sm rootfs | awk '{print $1}'`
NEW_NR_SIZE=$(((($NR_SIZE+128)/32)*32))
TARGET_IMAGE=rootfs.ext4
echo "blocks: $NR_SIZE"M" -> $NEW_NR_SIZE"M""
make_ext4fs -l $NEW_NR_SIZE"M" -b 2048 $TARGET_IMAGE rootfs/
fsck.ext4 -y $TARGET_IMAGE > /dev/null

 

当系统包弄完后,下一步需要执行的

exec chroot $ANDROID_DIR /init

 

更多相关文章

  1. Android(安卓)7.1.2(Android(安卓)N) Multi-window-mode--多窗口
  2. Android--打包工具,100个渠道包只需要10秒钟
  3. Android(安卓)调用系统相机拍照并储存在本地
  4. android系统提供的常用命令行工具
  5. Android(安卓)Studio-2.3 打包运行App报错问题。
  6. Ubuntu 18.04 环境下编译Android(安卓)源码
  7. Android(安卓)差分包制作
  8. Android(安卓)有关java.lang.NoClassDefFoundError
  9. android 源码 编译

随机推荐

  1. android去除标题栏和状态栏
  2. Unity Android Callback
  3. Flutter——flutter版本升级到1.2.1后遇
  4. Error: Failed to find 'ANDROID_HOME' e
  5. Android中的onCreateOptionsMenu()方法和on
  6. 升级到 Android Studio 3.0 + Gradle 4.1
  7. 【android】RxJava原理简述
  8. so文件静态分析&&Android录屏技术
  9. Android MMS模块数据存取
  10. android ListView 使用