日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2025/3/21 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 解压RK3288的boot.img修改init.rc 添加开机自启动脚本 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

最近找別人開發一款智能AI機器人,由于方案廠商現在代碼還沒有交付。每次只提供ROM?,F在公司要求要開機啟動系統檢測腳本。我們都知道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/bash set -e. build/envsetup.sh >/dev/null && setpathsexport PATH=$ANDROID_BUILD_PATHS:$PATH TARGET_PRODUCT=`get_build_var TARGET_PRODUCT` TARGET_HARDWARE=`get_build_var TARGET_BOARD_HARDWARE` echo TARGET_PRODUCT=$TARGET_PRODUCT echo TARGET_HARDWARE=$TARGET_HARDWARE TARGET="withoutkernel" if [ "$1"x != ""x ]; thenTARGET=$1 fiIMAGE_PATH=rockdev/Image-$TARGET_PRODUCTrm -rf $IMAGE_PATH mkdir -p $IMAGE_PATHFSTYPE=ext4 echo 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." fi if [ $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/
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124

我們注意到這一段適用于生成bootimg的代碼

if [ $TARGET == $BOOT_OTA ] then 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." fi
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

如果支持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
  • 1
  • 2

解壓后的文件內容如下:?

新建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
  • 1
  • 2
  • 3
  • 4
  • 5

重新生成ramdisk

生成ramdisk.img ./mkbootfs ./ramdisk | ./minigzip > ramdisk.img
  • 1
  • 2

重新生成boot.img

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

總結

以上是生活随笔為你收集整理的解压RK3288的boot.img修改init.rc 添加开机自启动脚本的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。