2012-03-19 65 views
33

我想更改android垫的init.rc文件。但是当我改变它并重新启动系统后,原来的init.rc又回来了。对init.rc进行持久更改

如何在不重建系统的情况下持续改变init.rc(因为我没有系统的源代码)?或者有什么办法可以解决?

+0

你是怎么做到的变化init.rc?通过与ADB拉文件??然后推到设备? – 2012-03-19 09:57:03

+0

是,亚行推拉 – user1278251 2012-03-19 10:06:49

+0

是设备有root权限? – 2012-03-19 10:07:49

回答

-3

在构建Android Pad文件系统之前,您必须编辑/更改init.rc。这是首选的方式,并始终有效。

+1

我没有垫的系统的源代码,如何建立呢?在没有重建系统的情况下是否有解决此问题的方法? – user1278251 2012-03-19 10:37:53

10

许多Android设备都包含防止对系统文件进行根修改的代码。这样做的方式是使用恢复分区。重启后,他们基本上使用恢复映像恢复系统分区。如果您的系统正在这样做,那么您无法进行持久性更改 - 您可以做的最好的做法是在重新启动后挂接某些内容以重新应用更改。在CyanogenMod中,如果找到它们,它们会在init.rc中挂接以运行SD卡脚本。也许你可以创建一个应用程序或小部件,然后启动一个脚本,使用来自数据分区的setuid root脚本来制作所需的mod。没有建立你自己的ROM,你在这方面受到很大限制。

可能您可以获取恢复映像并尝试解压缩,使您的更改和重新打包并刷新它。但在尝试此操作之前,请确保您可以使用fastboot进行恢复。

+0

感谢您的信息。看来这两个打击垫使用恢复分区方法。钩子方法是我想用init.rc做的,在系统启动时我可以用它来做一些控制。但恢复阻止它发生。如果存在恢复映像,它在哪里?我怎样才能找到它? – user1278251 2012-03-19 14:16:34

+0

如果您可以使用nandroid进行备份,这是获取恢复映像的一种方法。否则,您可以使用dd并将恢复分区复制到文件。一旦你有了恢复分区的映像,你应该可以使用unyaffs来解压它。您应该了解Android资源如何创建这些资源,以了解如何从文件树中重新创建一个资源。 – patthoyts 2012-03-19 14:48:15

+0

试图与提示从:HTTP://android-dls.com/wiki/index.php标题= HOWTO:_Unpack%2C_Edit%2C_and_Re-Pack_Boot_Images。但是通过“猫的/ dev/MTD/mtd1> mtd1.img”复苏中IMG与错误“破映像文件” unyaffs被打开失败。任何建议?谢谢! – user1278251 2012-03-19 16:06:13

9

当android系统启动,UBOOT将启动分区中名为'uRamdisk'的特殊压缩文件解包到RAM中,并将这些文件定义为构成系统的根目录。 uRamdisk通常包含一些目录(系统,数据,媒体等),作为包含进入其中的文件的分区的挂载点,但也有一些对您的系统至关重要的非常基本的文件,包括init二进制文件和启动像init.rc这样的脚本。

当您编辑init.rc时,您实际上只是编辑了驻留在RAM中的init.rc的未打包副本。要真正改变它,你必须复制你的uRamdisk,解压缩它,从那里编辑init.rc,重新打包uRamdisk,然后用/ boot中的旧文件替换新的。

尝试查找'xuramdisk'和'mkuramdisk'脚本,这些过程非常简单。

13

在主机PC(Linux)的

mkdir /tmp/initrc cd /tmp/initrd 
sudo mount /dev/sdb1 /mnt   

sdb1使用下面的命令解压uramdisk是partion其中uramdisk/uInitrd驻留。

dd bs=1 skip=64 if=/mnt/uInitrd of=initrd.gz 
gunzip initrd.gz 

在这一点上运行命令file initrd应显示:

mkdir fs 
cd fs 
cpio -id < ../initrd 

进行更改init.rc

包uramdisk使用下面的命令:

find ./ | cpio -H newc -o > ../newinitrd 
cd .. 
gzip newinitrd 
mkimage -A arm -O linux -C gzip -T ramdisk -n "My Android Ramdisk Image" -d newinitrd.gz uInitrd-new 
+1

你怎么知道的/ dev/sdb1的就是uramdisk/uInitrd?当我连接手机时,我只能看到/ dev/sdb下的sdcard比赛。我如何搜索uramdisk?我的设备上不存在 – melopsitaco 2012-08-22 15:58:49

+0

/dev/sdb1。您可能需要讨论如何确定启动映像所在的正确的块设备。 – 2014-03-26 07:53:25

+1

这取决于Android设备。如果您的设备已经生根,请尝试执行“adb shell mount”以获取已安装文件系统的列表。这会给你一些好的提示,看看在哪里。 – 2015-01-30 03:14:40

4

我不知道如果你仍然试图做到这一点,但不知道你确切的设备无人可以给你一个确切的答案。

尝试在您的所有内部分区中使用dd image,并在xda论坛中使用一些类似android kitchen的附带脚本。你的恢复和启动分区都会有一个RAM磁盘,但是你可能想要修改boot.img而不是恢复,除非你只想在恢复模式下出现更改。

unyaffs的东西并不适用于所有设备,大多数设备有不同的分区布局,所以你必须弄清楚哪个是引导以及它是什么类型的fs。也许如果你给你的设备规格,你可以得到更好的答案。

4

您的根分区(其中/init.rc位于其中)是一个ramdisk,它是从initrd文件解压缩并在您的设备每次引导时安装的。您所做的任何更改仅适用于虚拟硬盘,并且在下次重新引导时会丢失。

如果你能得到initrd文件,你可以将它挂载到你的Linux主机系统上,修改那里的文件,卸载它,然后把它写回你的Android。

initrd文件存在于设备自己的分区中。如果你能弄清楚它是哪个分区,你可以从设备上把它拿到你的主机上,挂载它,修改它,然后把它写回设备。这是三倍于上面谈论的。

一般来说,修改boot.img是只有系统开发者才能做到的。如果您正在构建整个Android系统,则可以访问必要的源代码。我对这个工作流程是这样的:

# Modify init.rc 
m -j8 bootimage_signed 
adb reboot bootloader 
fastboot flash boot $OUT/boot.img 
fastboot reboot 
+0

我试图在sdcard中创建init.rc的静态链接(ln -s /sdcard/init.rc init.rc),这样对init.rc的更改将变得更简单,但它不起作用。任何想法 ? – ransh 2016-12-26 10:15:49

+0

“静态链接”是否意味着硬链接?你不能在整个文件系统中创建这个文件系统,所以你必须链接到你的虚拟磁盘中的另一个文件。再次,这将在下次重启时丢失。如果你创建了一个符号链接,我认为这是另一个文件系统,当它需要的时候可能还没有安装。无论哪种方式,我认为这不会起作用。无论如何,你需要修改init.rd映像。 – 2016-12-29 20:21:04

+0

@爱德华他没有访问源代码。 – 2017-05-29 13:22:32

0

请注意,它可能会更容易让你使用像的编剧一个应用程序在启动时运行的脚本比修改此文件。

之前以下@三倍的说明书上面你需要一个叫做boot.img文件,该文件可以通过(运行植根Android设备,未经测试的无根)提取:

dd if=/dev/block/platform/<someplatform>/by-name/boot of=/sdcard/boot.img 

你的Android然后连接到您的电脑,并复制从那里的boot.img文件。

脚本:

http://linuxclues.blogspot.ca/2012/11/split-bootimg-python-android.html

下面是一个修改,比较容易看到的三倍频的指示版本(假设boot.img是TMP):

cd /tmp 
mkdir fs 
# Now use the linked script above to split the boot.img file into ramdisk.gz and kernel 
python split_boot_img.py -i boot.img -o parts 
cd fs 
gunzip -c ../parts/ramdisk.gz | cpio -id 
# make changes to init.rc 

在这一点上,你将不得不重建在重新刷新之前将boot.img重新组合在一起,这将是设备特定的。无法帮助你,对不起!