1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > 解压RK3288的boot.img修改init.rc 添加开机自启动脚本

解压RK3288的boot.img修改init.rc 添加开机自启动脚本

时间:2022-03-14 00:22:29

相关推荐

解压RK3288的boot.img修改init.rc 添加开机自启动脚本

最近找别人开发一款智能AI机器人,由于方案厂商现在代码还没有交付。每次只提供ROM。现在公司要求要开机启动系统检测脚本。我们都知道Android现在权限管理很严格。而且我的脚本是用shell脚本完成的。所以无法监听开机广播。只能修改init.rc文件。但是我们知道init.rc文件存在在文件Android boot.img的ramdisk文件系统中,你虽然每次可以通过adb remount 挂载system分区。然后adb pull init.rc修改后push回去。重启后你就会发现改动又恢复回去了。是因为 你adb remount 挂载的是system分区。而init.rc 存在在boot分区。system分区只是挂载到 ramdisk文件系统下的system。

所以你如果想改动init.rc只能重新烧录boot.img分区。所以自己研究了rk的bootimg生成过程。

在rk的Android源码根目录下有一个文件 mkimage.sh ,这个文件是rk用于生成文件系统的脚本。主要内容如下:

#!/bin/bashset -e. build/envsetup.sh >/dev/null && setpathsexport PATH=$ANDROID_BUILD_PATHS:$PATHTARGET_PRODUCT=`get_build_var TARGET_PRODUCT`TARGET_HARDWARE=`get_build_var TARGET_BOARD_HARDWARE`echo TARGET_PRODUCT=$TARGET_PRODUCTecho TARGET_HARDWARE=$TARGET_HARDWARETARGET="withoutkernel"if [ "$1"x != ""x ]; thenTARGET=$1fiIMAGE_PATH=rockdev/Image-$TARGET_PRODUCTrm -rf $IMAGE_PATHmkdir -p $IMAGE_PATHFSTYPE=ext4echo system filesysystem is $FSTYPEBOARD_CONFIG=device/rockchip/common/device.mkKERNEL_SRC_PATH=`grep TARGET_PREBUILT_KERNEL ${BOARD_CONFIG} |grep "^\s*TARGET_PREBUILT_KERNEL *:= *[\w]*\s" |awk '{print $3}'`[ $(id -u) -eq 0 ] || FAKEROOT=fakerootBOOT_OTA="ota"[ $TARGET != $BOOT_OTA -a $TARGET != "withoutkernel" ] && echo "unknow target[${TARGET}],exit!" && exit 0if [ ! -f $OUT/kernel ]thenecho "kernel image not fount![$OUT/kernel] "read -p "copy kernel from TARGET_PREBUILT_KERNEL[$KERNEL_SRC_PATH] (y/n) n to exit?"if [ "$REPLY" == "y" ]then[ -f $KERNEL_SRC_PATH ] || \echo -n "fatal! TARGET_PREBUILT_KERNEL not eixit! " || \echo -n "check you configuration in [${BOARD_CONFIG}] " || exit 0cp ${KERNEL_SRC_PATH} $OUT/kernelelseexit 0fifiif [ $TARGET == $BOOT_OTA ]thenecho "make ota images... "echo -n "create boot.img with kernel... "[ -d $OUT/root ] && \mkbootfs $OUT/root | minigzip > $OUT/ramdisk.img && \truncate -s "%4" $OUT/ramdisk.img && \mkbootimg --kernel $OUT/kernel --ramdisk $OUT/ramdisk.img --second kernel/resource.img --output $OUT/boot.img && \cp -a $OUT/boot.img $IMAGE_PATH/echo "done."elseecho -n "create boot.img without kernel... "[ -d $OUT/root ] && \mkbootfs $OUT/root | minigzip > $OUT/ramdisk.img && \truncate -s "%4" $OUT/ramdisk.img && \rkst/mkkrnlimg $OUT/ramdisk.img $IMAGE_PATH/boot.img >/dev/nullecho "done."fiif [ $TARGET == $BOOT_OTA ]thenecho -n "create recovery.img with kernel... "[ -d $OUT/recovery/root ] && \mkbootfs $OUT/recovery/root | minigzip > $OUT/ramdisk-recovery.img && \truncate -s "%4" $OUT/ramdisk-recovery.img && \mkbootimg --kernel $OUT/kernel --ramdisk $OUT/ramdisk-recovery.img --second kernel/resource.img --output $OUT/recovery.img && \cp -a $OUT/recovery.img $IMAGE_PATH/echo "done."elseecho -n "create recovery.img with kernel and with out resource... "[ -d $OUT/recovery/root ] && \mkbootfs $OUT/recovery/root | minigzip > $OUT/ramdisk-recovery.img && \truncate -s "%4" $OUT/ramdisk-recovery.img && \mkbootimg --kernel $OUT/kernel --ramdisk $OUT/ramdisk-recovery.img --output $OUT/recovery.img && \cp -a $OUT/recovery.img $IMAGE_PATH/echo "done."fiecho -n "create misc.img.... "cp -a rkst/Image/misc.img $IMAGE_PATH/misc.imgcp -a rkst/Image/pcba_small_misc.img $IMAGE_PATH/pcba_small_misc.imgcp -a rkst/Image/pcba_whole_misc.img $IMAGE_PATH/pcba_whole_misc.imgecho "done."if [ -d $OUT/system ]thenecho -n "create system.img... "if [ "$FSTYPE" = "cramfs" ]thenchmod -R 777 $OUT/system$FAKEROOT mkfs.cramfs $OUT/system $IMAGE_PATH/system.imgelif [ "$FSTYPE" = "squashfs" ]thenchmod -R 777 $OUT/systemmksquashfs $OUT/system $IMAGE_PATH/system.img -all-root >/dev/nullelif [ "$FSTYPE" = "ext3" ] || [ "$FSTYPE" = "ext4" ]thensystem_size=`ls -l $OUT/system.img | awk '{print $5;}'`[ $system_size -gt "0" ] || { echo "Please make first!!!" && exit 1; }MAKE_EXT4FS_ARGS=" -L system -S $OUT/root/file_contexts -a system $IMAGE_PATH/system.img $OUT/system"ok=0while [ "$ok" = "0" ]; domake_ext4fs -l $system_size $MAKE_EXT4FS_ARGS >/dev/null 2>&1 &&tune2fs -c -1 -i 0 $IMAGE_PATH/system.img >/dev/null 2>&1 &&ok=1 || system_size=$(($system_size + 5242880))donee2fsck -fyD $IMAGE_PATH/system.img >/dev/null 2>&1 || trueelsemkdir -p $IMAGE_PATH/2k $IMAGE_PATH/4kmkyaffs2image -c 2032 -s 16 -f $OUT/system $IMAGE_PATH/2k/system.imgmkyaffs2image -c 4080 -s 16 -f $OUT/system $IMAGE_PATH/4k/system.imgfiecho "done."fichmod a+r -R $IMAGE_PATH/

1234567891011121314151617181922232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811911122123124

我们注意到这一段适用于生成bootimg的代码

if [ $TARGET == $BOOT_OTA ]thenecho -n "create boot.img with kernel... "[ -d $OUT/root ] && \mkbootfs $OUT/root | minigzip > $OUT/ramdisk.img && \truncate -s "%4" $OUT/ramdisk.img && \mkbootimg --kernel $OUT/kernel --ramdisk $OUT/ramdisk.img --second kernel/resource.img --output $OUT/boot.img && \cp -a $OUT/boot.img $IMAGE_PATH/echo "done."elseecho -n "create boot.img without kernel... "[ -d $OUT/root ] && \mkbootfs $OUT/root | minigzip > $OUT/ramdisk.img && \truncate -s "%4" $OUT/ramdisk.img && \rkst/mkkrnlimg $OUT/ramdisk.img $IMAGE_PATH/boot.img >/dev/nullecho "done."fi

1234567891011121314151617

如果支持OTA升级就生成bootimg的时候添加kernel内核。使用标准的bootimg工具生成bootimg,否则就使用rkst/mkkrnlimg生成rk 格式的bootimg,不包含内核。这个bootimg 不能使用unpackbootimg解压。解压会报错。Android Magic not found

所以解压boot.img一定是使用mkimage.sh ota 生成带kernel的boot.img。

现在需要两个工具unpackbootimg 用于解压 bootimg。

mkbootfs 用于打包解压修改后的bootimg

所有这些操作都是在Ubuntu操作系统下完成,

将这两个工具和待修改的boot.img放在同一目录下。

相关解压打包工具地址

解压boot.img./unpackbootimg -i boot.img

12

解压后的文件内容如下:

新建ramdisk目录

mkdir ramdisk

进人ramdisk目录

cd ramdisk

解压boot.img-ramdisk.gz

gzip -dc ../boot.img-ramdisk.gz | cpio -i

生成的文件如下所示:

所以这里面的init.rc 我们就可以修改了。然后添加一些系统启动服务脚本

service mveGTouchA /system/bin/mveGTouchA.shclass mainuser rootgroup rootoneshot

12345

重新生成ramdisk

生成ramdisk.img./mkbootfs ./ramdisk | ./minigzip > ramdisk.img

12

重新生成boot.img

./mkbootimg --kernel boot.img-zImage --ramdisk ramdisk.img --second boot.img-second --output boot.img

1

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。