关于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