Chinaunix首页 | 论坛 | 博客
  • 博客访问: 84694
  • 博文数量: 22
  • 博客积分: 2200
  • 博客等级: 大尉
  • 技术积分: 640
  • 用 户 组: 普通用户
  • 注册时间: 2007-09-16 22:20
文章分类
文章存档

2011年(1)

2008年(21)

我的朋友

分类: LINUX

2008-04-07 00:07:35

对于关注Android底层的朋友来说,其具体的启动过程应该是比较吸引我们的。但是很多启动文件什么的,都得adb push到host上来看,挺不方便的,都怪Android自带的Toolbox太简略了。所以在深入了解Android的启动流程之前,我们来把 Busybox安装到Android上去,这样,就有很多工具供我们使用了。

首先去busybox主页 下载最新版本的源代码,然后用arm的交叉编译器编译出busybox的可执行程序,编译的时候需要注意一些设置选项,例如

Build Options  --->
    Build BusyBox as a static binary (no shared libs) 这个要选上,因上这样子编译出来的busyBox才是可以独立运行的。
          │ Do you want to build BusyBox with a Cross Compiler?              │ │
          │ │(/HOME/toolchains/gcc-4.0.2-glibc-2.3.5/arm-9tdmi-linux-gnu/bin/arm-9tdmi-linux-gnu│ 这是交叉编译器的路径,要根据具体的情况来设置。
    Installation Options  --->
         Don't use /usr
    这样子编译出来的busybox才不会安装到你主机的/usr目录下。一定要选上。

busybox的功能选项根据需要自选,但是不要太贪心.

OK,这里就不纠缠于编译busybox的东西了,网上资料无数。接下来,我们把busybox安装到模拟器上去。先在模拟器上随便建一个busybox的文件夹,然后进入busybox可执行文件目录,使用命令

    adb push busybox.asc /data/busybox/busybox

然后进入adb shell,chmod 777 ./busybox,就可以直接使用了。但现在还是不方便,总不能每用一个命令就输一次busybox吧?所以,我们可以先用./busybox --install将程序都安装到当前目录下,然后把当前目录添加到PATH变量中即可。暂时使用export来添加吧,如果想永久添加,往下看。

好了,准备工作完成,开始研究的工作了。既然是研究启动过程,那当然是先看看init.rc文件。去etc目录打开它,分析一下内容,首先是对env的定 义,也就是全局环境变量的定义,接下来的建立和初始化里面的内容目前还不清楚什么意思,紧接着就是系统启动时运行的初始进程信息,这个比较有意思,包括了 usbd-config和qemu,qemu自不用说,而usbd-config作为初始启动的进程,应该就是和上一篇文章猜的一样,用来调试或者usb 通信的。往下看,是在初始启动进程完成之后开始启动的服务进程,这些进程如果因故退出,会自动重启。这里面包括了console控制台,adbd监护进 程,usbd监护进程,debuggerd监护进程等.除去这些守护进程,能引起我们注意的,是runtime和zygote。这两个进程似乎掌管着其他 进程以及应用程序的启动。

现在,来让我们做一个实验吧,将自动调用的启动过程变成手动,看看启动流程具体是什么样的。想达到这个目的,首先就是要修改init.rc文件,当然不是 在模拟器的console中改,一是不能改,二是你改了也没用,下次加载就会给你覆盖了。所以,我们要从原始镜像ramdisk.img入手了。从2.6 标准Linux内核开始,initrd.img都采用cpio压缩,猜测ramdisk.img也一样,需要使用gunzip解压缩,然后再使用cpio 解包。好,进入tools/lib/images目录下,先用file命令看看ramdisk.img的类型,没错,系统提示

    ramdisk.img: gzip compressed data, from Unix

很好,然后将ramdisk.img复制一份到任何其他目录下,将其名称改为ramdisk.img.gz,并使用命令

    gunzip ramdisk.img.gz

然后新建一个文件夹,叫ramdisk吧,进入,输入命令

    cpio -i -F ../ramdisk.img

这下,你就能看见并操作ramdisk里面的内容了。当然你也可以直接在外面进行操作,但是还是建议把cpio解压缩出来的内容全部集中在一个文件夹里面,因为一会我们还要将其压缩成新的ramdisk.img。

OK,现在开始修改步骤吧。用任何一款编辑器打开init.rc,首先在PATH那里加上你的Busybox安装路径,然后注释内容,我们要手工启动他们。

    #    zygote {
    #        exec /system/bin/app_process
    #        args {
    #            0 -Xzygote
    #            1 /system/bin
    #            2 --zygote
    #        }
    #        autostart 1
    #    }

    #    runtime {
    #        exec /system/bin/runtime
    #        autostart 1
    #    }

在这里需要注意,不要同时把两者都注释了,注释某一个,再试验手工启动它,如果两者同时注释我这里有问题,无法启动。

好,接下来,使用下列命令重新打包成镜像

    cpio -i -t -F ../ramdisk.img > list
    cpio -o -H newc -O lk.img < list

当前目录下生成的lk.img就是我们的新镜像了。使用自己的镜像启动emulator;

    emulator -console -ramdisk lk.img

如果我们注释的是zygote,那么在#后输入

    app_process -Xzygote /system/bin --zygote

手工启动,命令行中输出的信息是

    Prepping: /system/app/AlarmProvider.apk:/system/app/Browser.apk:/system/app/Calendar.apk:/system/app/Camera.apk:/system/app/Contacts.apk:
    /system/app/Development.apk:/system/app/GDataFeedsProvider.apk:/system/app/Gmail.apk:/system/app/GmailProvider.apk:/system/app/GoogleApps.apk:
    /system/app/GoogleAppsProvider.apk:/system/app/Home.apk:/system/app/ImProvider.apk:/system/app/Maps.apk:/system/app/MediaPickerActivity.apk:
    /system/app/MediaProvider.apk:/system/app/Phone.apk:/system/app/PimProvider.apk:/system/app/ApiDemos.apk:/system/app/SettingsProvider.apk:
    /system/app/Sms.apk:/system/app/SyncProvider.apk:/system/app/TelephonyProvider.apk:/system/app/XmppService.apk:/system/app/YouTube.apk
    File not found: /system/app/AlarmProvider.apk
    File not found: /system/app/Calendar.apk
    File not found: /system/app/Camera.apk
    File not found: /system/app/GDataFeedsProvider.apk
    File not found: /system/app/Gmail.apk
    File not found: /system/app/GmailProvider.apk
    File not found: /system/app/MediaPickerActivity.apk
    File not found: /system/app/PimProvider.apk
    File not found: /system/app/ApiDemos.apk
    File not found: /system/app/Sms.apk
    File not found: /system/app/SyncProvider.apk
    File not found: /system/app/YouTube.apk
    Prep complete

嘿嘿,从File not found的信息中可以看到一些Google可能会即将推出的应用,比如Gmail什么的。

如果我们注释的是runtime,那么输出信息是:

    +++ post-zygote

老实说,没有明白这是啥意思,呵呵。

好了,今天就说到这,基本的方法就是这样,有兴趣的朋友可以进一步深入研究。我们下一篇文章见。
阅读(781) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~