1

我知道在 Android 启动序列中,Linux 内核启动后,它会寻找init.

我替换init为我的自定义 C 应用程序myapp。在myapp中,我等待用户输入 5 秒。如果什么也没收到,我想运行原来init的,我将它重命名为init_original. 如果我收到用户输入,我想继续做我的事情。

我根据http://android-dls.com/wiki/index.php?title=HOWTO:_Unpack%2C_Edit%2C_and_Re-Pack_Boot_Images中的说明将我的自定义init和解压缩的 ramdisk 和 cpio-ed 和 gzip-edinit_original

init_original使用 execve() 从我的程序中成功调用。但是,我得到以下输出:

[    3.851928] cpuidle: initiated for CPU0.
[    3.857116] cpuidle: initiated for CPU1.
[    3.862579] Freeing init memory: 320K

===============================================================================


Application started
Press enter in 1 second to enter test tool...
1 second is up, starting normal init

[    4.883422] init: /init.rc: 865: ignored duplicate definition of service 'ril-daemon'
[    8.247894] av8100_hdmi av8100_hdmi.3: HDMI display probed
[    9.694915] init: Timed out waiting for /dev/.coldboot_done
[    9.839630] init: cannot find '/system/bin/logwrapper', disabling 'cspsa'
[    9.847137] init: cannot execve('/system/bin/logwrapper'): No such file or directory
[    9.855102] init: /system/bin/logwrapper terminated with status 127.
[    9.869934] init: cannot find '/system/xbin/watchdog-kicker', disabling 'watchdog-kicker'
[    9.887695] init: cannot find '/system/bin/ifconfig', disabling 'shrm-netdev'
[    9.894836] init: cannot find '/system/bin/sh', disabling 'modem'
[    9.907714] init: cannot find '/system/bin/modem-supervisor', disabling 'modem-supervisor'
[    9.916015] init: cannot find '/system/bin/copsdaemon', disabling 'copsd'
[    9.922851] init: cannot find '/system/bin/cn_server', disabling 'cn_server'
[    9.929931] init: cannot find '/system/bin/simd', disabling 'simd'
....

知道有什么问题吗?与我调用init_original的方式有关,或者与我重新打包 ramdisk.img 的方式有关,还是其他原因?

谢谢!

4

3 回答 3

0

您可以尝试一些非常基本的东西,例如指导 a 的输出 ls -l或类似于输出流或文件的东西。从您尝试执行您自己的应用程序的位置进行此调用,以查看它是否具有执行的适当文件权限。

Using umask(0)设置用户创建的文件的文件权限。这就像使用 chmod()但在文件实际创建之前执行。因此,在您的情况下,您使用 umask(0)的结果是 '777'文件权限,因此您的应用程序能够运行,因为它具有所需的文件权限。

于 2012-08-17T01:57:06.603 回答
0

好的,我找到了答案。

我是反过来做的,原来init.c的被编辑为调用。myapp

在android的 /system/core/init:init.c中,我myapp在行后调用

/* clear the umask */
umask(0);
// call program here

如果myapp在之前调用umask(0),则会发生与上述相同的错误。我不知道为什么它会这样工作。如果有人可以向我解释umask(0)正在做什么(设置权限或我认为的类似内容),我将不胜感激。

于 2012-08-15T06:11:56.930 回答
0

有同样的问题,在 /sbin 中,ueventd 和 watchdogd 是 ../init 的符号链接

所以改变那些: ln -s ../init_original 并让 myapp 调用 init_original 应该可以工作。=)

于 2013-06-12T17:24:05.090 回答