最近找别人开发一款智能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/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 添加开机自启动脚本相关推荐

  1. rcs开机启动mysql_linux添加开机自启动脚本示例详解-阿里云开发者社区

    linux添加开机自启动脚本示例详解 double2li 2017-04-14 1652浏览量 简介: linux下(以RedHat为范本)添加开机自启动脚本有两种方法,先来简单的;一.在/etc/r ...

  2. linux添加开机自启动脚本示例详解

    linux下(以RedHat为范本)添加开机自启动脚本有两种方法,先来简单的; 一.在/etc/rc.local中添加 如果不想将脚本粘来粘去,或创建链接什么的, 则: step1. 先修改好脚本,使 ...

  3. Android系统学习(四)------关于init进程及开机自启动

    你好!这里是风筝的博客, 欢迎和我一起交流. 初入Android,本篇文章不过是拾人牙慧,见笑了~ init进程,它是内核启动的第一个用户级进程,进程号为1.它通过解析init.rc脚本来构建出系统的 ...

  4. 最全解决方法:未解压的word文档修改保存后找不到

    今天在写毕业论文,没想到会碰到这个问题,遇到这种确实很崩溃,一天的努力白费(哭,但是看了很多经验,确定找不到以后也只能重写,所以打算写下来经验以免遇到同样问题的朋友浪费时间纠结于此. 1.首先要确定的 ...

  5. linux添加py自启动脚本_PyInstaller详解:将.py文件打包成exe文件

    1. 安装 本人系统是:Ubuntu16.04,python3.7. 安装的pyinstaller==3.5, UPX==upx-3.95-amd64_linux.tar.xz.不安装对应版本的pyi ...

  6. Ubuntu下开机自启动脚本 init supervisor systemd

    引言:在linux的使用过程中,我们经常会碰到需要将某个自定义的应用程序设置为开机自启动.批量管理.出错重启等,今天我们就Ubuntu下软件的自启动相关只是做一个汇总. 首先,Ubuntu下开机自启动 ...

  7. centos8 手动修改网络配置以及怎么重启网络,添加开机自启动

    vi /etc/sysconfig/network-scripts/ifcfg-ensxx 修改对应网卡ensXX(随机数字,通过ifconfig或者nmcli connection可以查看相关网卡信 ...

  8. 一键式解压tar, tar.gz. tar.bz2, tar.xv文件的shell脚本【转】

    (转自:https://www.cnblogs.com/xmlee/p/9142645.html) tar,  tar.gz. tar.bz2, tar.xv等文件的压缩和解压缩参数让人实在蛋疼, 本 ...

  9. Windows修改注册表实现开机自启动

    1.打开注册表 计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run 2.右键添加字符串值 3.添加想要开机自启动运 ...

最新文章

  1. STM32 基础系列教程 11 – ADC 轮询
  2. android 调用.h文件,[Android Studio / NDK] 如何使用javah生成.h文件
  3. 高等数学下-赵立军-北京大学出版社-题解-练习12.2
  4. 服务器怎么用光驱装系统教程,使用光驱重装系统详细教程
  5. 对象存储 OSS > SDK 示例 > C++ > 数据加密 > 服务器端加密
  6. iOS的GIF动画效果实现
  7. 大学毕业4年-回顾和总结(6)-技术研发-重构之法
  8. 优先级调度算法和高响应比优先调度算法
  9. 2021年智慧交通十大热点
  10. 热敏电阻温度计算 公式 程序
  11. 华三路由器RIP协议详细配置
  12. Lotus Symphony 正式版发布!
  13. word2013设置封面,摘要,正文不同的页码格式
  14. 倭黑猩猩机器人_倭黑猩猩会使用火柴生火做饭酷似人类(图)
  15. 解决电脑wlan被禁用无法再启动的办法.
  16. 苹果营收及增速分析,2022年营收达2055亿美元,增速为7%
  17. 电脑怎么录屏?推荐2款录制电脑屏幕的软件!
  18. Anaconda安装scikit-learn库报错 解决方案
  19. 蓝桥杯 手机尾号评分
  20. 最简单的将Ubuntu火狐浏览器默认搜索改为百度搜索的办法

热门文章

  1. 业界 | 5个步骤开启你的数据科学职业生涯!(附链接)
  2. 多线程:并发实现方法之J.U.C
  3. Linux什么是文件IO,linux中文件IO
  4. 四部门发文!坚决避免数据中心盲目无序发展
  5. 1000亿,行业巨头纷纷押宝的数据中心
  6. 弱电工程室内外光纤敷设有哪些技术要求
  7. 使鼠标保持按住状态_MouseInc 鼠标手势工具
  8. eigrp配置实验_路由器 OSPF 动态路由配置
  9. 成功解决在excel表格中仅在某列内插入一个空白单元格,使其下部的数据整体下移一格
  10. ML之FE:对人类性别相关属性数据集进行数据特征分布可视化分析与挖掘