最近找別人開發(fā)一款智能AI機器人,由于方案廠商現(xiàn)在代碼還沒有交付。每次只提供ROM。現(xiàn)在公司要求要開機啟動系統(tǒng)檢測腳本。我們都知道Android現(xiàn)在權限管理很嚴格。而且我的腳本是用shell腳本完成的。所以無法監(jiān)聽開機廣播。只能修改init.rc文件。但是我們知道init.rc文件存在在文件Android boot.img的ramdisk文件系統(tǒng)中,你雖然每次可以通過adb remount 掛載system分區(qū)。然后adb pull init.rc修改后push回去。重啟后你就會發(fā)現(xiàn)改動又恢復回去了。是因為 你adb remount 掛載的是system分區(qū)。而init.rc 存在在boot分區(qū)。system分區(qū)只是掛載到 ramdisk文件系統(tǒng)下的system。?
所以你如果想改動init.rc只能重新燒錄boot.img分區(qū)。所以自己研究了rk的bootimg生成過程。?
在rk的Android源碼根目錄下有一個文件 mkimage.sh ,這個文件是rk用于生成文件系統(tǒng)的腳本。主要內(nèi)容如下:
#!/bin/bash
set -e. build/envsetup.sh >/dev/null && setpaths
export 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/kernel
elseexit 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/null
echo "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.img
echo "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.img
elif [
"$FSTYPE" =
"squashfs" ]
thenchmod -R
777 $OUT/systemmksquashfs
$OUT/system
$IMAGE_PATH/system.img -all-root >/dev/null
elif [
"$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.img
fiecho "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/null
echo "done."
fi- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
如果支持OTA升級就生成bootimg的時候添加kernel內(nèi)核。使用標準的bootimg工具生成bootimg,否則就使用rkst/mkkrnlimg生成rk 格式的bootimg,不包含內(nèi)核。這個bootimg 不能使用unpackbootimg解壓。解壓會報錯。Android Magic not found?
所以解壓boot.img一定是使用mkimage.sh ota 生成帶kernel的boot.img。?
現(xiàn)在需要兩個工具unpackbootimg 用于解壓 bootimg。?
mkbootfs 用于打包解壓修改后的bootimg?
所有這些操作都是在Ubuntu操作系統(tǒng)下完成,?
將這兩個工具和待修改的boot.img放在同一目錄下。?
相關解壓打包工具地址
解壓boot
.img
./unpackbootimg -i boot
.img解壓后的文件內(nèi)容如下:?
新建ramdisk目錄?
mkdir ramdisk
進人ramdisk目錄?
cd ramdisk?
解壓boot.img-ramdisk.gz?
gzip -dc ../boot.img-ramdisk.gz | cpio -i?
生成的文件如下所示:?
?
所以這里面的init.rc 我們就可以修改了。然后添加一些系統(tǒng)啟動服務腳本
service mveGTouchA /system/bin/mveGTouchA.sh
class mainuser rootgroup rootoneshot
重新生成ramdisk
生成ramdisk
.img
./mkbootfs ./ramdisk | ./minigzip > ramdisk
.img重新生成boot.img
. -- .- -- . -- .- -- .
總結(jié)
以上是生活随笔為你收集整理的解压RK3288的boot.img修改init.rc 添加开机自启动脚本的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。