`

android 启动过程和 build 过程

 
阅读更多

首先下载下android源码并编译,网上的资料特别多,可以参考一下这个网站http://blog.csdn.net/liaoshengjiong/archive/2009/03/04/3957749.aspx

按照网站上的步骤,将android内核编译成功,如果不出意外的话,在out/target/product/generic目录下会生成三个文件,分别是ramdisk.img、sytem.img、userdata.img。这三个文件到底有什么用呢?下面开始分析一下。

首先在linux终端下使用命令file ramdisk.img,打印出如下字符ramdisk.img: gzip compressed data, from Unix,可以看出,它是一个gzip压缩的格式,下面对其进行解压,使用fedora自带的工具进行解压,或者使用gunzip进行解压(可能需要将扩展名改为.gz),可以看到解压出一个新的ramdisk.img,这个ramdisk.img是使用cpio压缩的,可以使用cpio命令对其进行解压,cpio –i –F ramdisk.img,解压后可以看到生成了一些文件夹和文件。看到这些文件就会明白,它和root目录下的内容完全一样。说明了ramdisk.img其实是对root目录的打包和压缩。

下面分析system.img的来源。在build/core/Makefile里的629行,可以看到这么一段文字

# The installed image, which may be optimized or unoptimized.

#

INSTALLED_SYSTEMIMAGE := $(PRODUCT_OUT)/system.img

从这里可以看出,系统应该会在$(PRODUCT_OUT)目录下生成system.img

再继续往下看,在662行有一个copy-file-to-target,这实现了将system.img从一个中间目录复制到/generic目录。

BUILD_SYSTEM的定义在636行。

这里的system.img不是/generic目录下面我们看到的那个 system.img,而是另一个中间目录下的,但是是同一个文件。一开始看到的复制就是把out /target/product/generic/obj/PACKAGING/systemimage_unopt_intermediates目录下面的system.img复制到/generic目录下。

现在,知道了system.img的来历,然后要分析它是一个什么东西,里面包含什么??

Makefile line624

$(BUILT_SYSTEMIMAGE_UNOPT): $(INTERNAL_SYSTEMIMAGE_FILES) $(INTERNAL_MKUSERFS)

$(call build-systemimage-target,$@)

这里调用了build-systemimg-target Makefile line605

ifeq ($(TARGET_USERIMAGES_USE_EXT2),true)

## generate an ext2 image

# $(1): output file

define build-systemimage-target

@echo "Target system fs image: $(1)"

$(call build-userimage-ext2-target,$(TARGET_OUT),$(1),system,)

endef

else # TARGET_USERIMAGES_USE_EXT2 != true

## generate a yaffs2 image

# $(1): output file

define build-systemimage-target

@echo "Target system fs image: $(1)"

@mkdir -p $(dir $(1))

*$(hide) $(MKYAFFS2) -f $(TARGET_OUT) $(1)*

endef

endif # TARGET_USERIMAGES_USE_EXT2

找不到TARGET_USERIMAGES_USE_EXT2的定义!!!不过从上面的分析可以推断出应该是yaffs2文件系统。

其中MKYAFFS2:(core/config.mk line161)

MKYAFFS2 := $(HOST_OUT_EXECUTABLES)/mkyaffs2image$(HOST_EXECUTABLE_SUFFIX)

定义MKYAFFS2是目录/media/disk/mydroid /out/host/linux-x86/bin下的一个可执行文件mkyaffs2image,运行这个程序可得到如下信息:

lzj@lzj-laptop:/media/disk/mydroid/out/host/linux-x86/bin$ ./mkyaffs2image

mkyaffs2image: image building tool for YAFFS2 built Nov 13 2009

usage: mkyaffs2image [-f] dir image_file [convert]

-f fix file stat (mods, user, group) for device

dir the directory tree to be converted

image_file the output file to hold the image

'convert' produce a big-endian image from a little-endian machine

得知这个程序可以生成yaffs2的文件系统映像。并且也清楚了上面*$(hide) $(MKYAFFS2) -f $(TARGET_OUT) $(1)*的功能,把TARGET_OUT目录转变成yaffs2格式并输出成/media/disk/mydroid/out/target /product/generic/obj/PACKAGING/systemimage_unopt_intermediates /system.img(也就是我们最终在/generic目录下看到的那个system.img)。

到现在已经差不多知道system.img的产生过程,要弄清楚 system.img里面的内容,就要分析TARGET_OUT目录的内容了。 (想用mount把system.img挂载到linux下面看看里面什么东西,却不支持yaffs和yaffs2文件系统!!!)

下一步:分析TARGET_OUT 在build/core/envsetup.sh文件(line205)中找到了TARGET_OUT的定义:

TARGET_OUT := $(PRODUCT_OUT)/system

也就是/media/disk/mydroid/out/target /product/generic目录下的system目录。

lzj@lzj-laptop:/media/disk/mydroid/out/target/product/generic/system$ tree -L 1

.

|-- app

|-- bin

|-- build.prop

|-- etc

|-- fonts

|-- framework

|-- lib

|-- usr

`-- xbin

现在一切都明白了,我们最终看到的system.img文件是该目录下的 system目录的一个映像,类似于linux的根文件系统的映像,放着android的应用程序,配置文件,字体等。

Userdata.img来来自于data目录,默认里面是没有文件的。

Android启动过程

Android在启动的时候,会由UBOOT传入一个init参数,这个init参数指定了开机的时候第一个运行的程序,默认就是init程序,这个程序在ramdisk.img中。可以分析一下它的代码,看看在其中到底做了一些什么样的初始化任务,它的源文件在system/core/init/init.c中。

它会调用到init.rc初始化文件,这个文件在out/target/product/generic/root下,我们在启动以后,会发现根目录是只读属性的,而且sdcard的owner是system,就是在这个文件中做了些手脚,可以将它改过来,实现根目录的可读写。

通过分析这几个文件,还可以发现,android启动时首先加载ramdisk.img镜像,并挂载到/目录下,并进行了一系列的初始化动作,包括创建各种需要的目录,初始化console,开启服务等。System.img是在init.rc中指定一些脚本命令,通过init.c进行解析并挂载到根目录下的/system目录下的。

分享到:
评论

相关推荐

    Android开发环境搭建实验报告(1).doc

    4、装置完成后配置Android SDK,将Android SDK装置目次中的tools文件夹途径添加到环境变量中,更改系统变量中的"Path"项,添 加途径: 5、装置和配置ADT,参照Android应用开辟秘笈,启动Eclipse,点击"Help"菜单,依...

    新版Android开发教程.rar

    的 Android SDK 提供了在 Android 平台上使用 JaVa 语言进行 Android 应用开发必须的工具和 API 接口。 特性 • 应用程序框架 支持组件的重用与替换 • Dalvik Dalvik Dalvik Dalvik 虚拟机 专为移动设备优化 • ...

    Android 代码分析

    1 Android build system 4 1.1 Basic 4 1.2 Executable 6 1.3 Shared Library 9 2 Android Initialization Process 11 3 Android JAVA AIDL Analysis 15 4 Android JAVA Binder IPC System 20 5 Android Media ...

    Android开发环境搭建实验报告之欧阳科创编.doc

    4、安装完成后配置Android SDK,将Android SDK安装目录中的tools文件夹路径添加到环境变量中,更改系统变量中的"Path"项,添 加路径: 5、安装和配置ADT,参照Android应用开发秘籍,启动Eclipse,点击"Help"菜单,按...

    Android开发环境搭建实验报告(4).doc

    4、安装完成后配置Android SDK,将Android SDK安装目录中的tools文件夹路径添加到环境变量中,更改系统变量中的"Path"项,添 加路径: 5、安装和配置ADT,参照Android应用开发秘籍,启动Eclipse,点击"Help"菜单,按...

    Android开发环境搭建实验报告(3).doc

    4、安装完成后配置Android SDK,将Android SDK安装目录中的tools文件夹路径添加到环境变量中,更改系统变量中的"Path"项,添 加路径: 5、安装和配置ADT,参照Android应用开发秘籍,启动Eclipse,点击"Help"菜单,按...

    (最新整理)Android开发环境搭建实验报告.doc

    4、安装完成后配置Android SDK,将Android SDK安装目录中的tools文件夹路径添加到环境变量中,更改系统变量中的"Path"项,添加 路径: 5、安装和配置ADT,参照Android应用开发秘籍,启动Eclipse,点击"Help"菜单,按...

    AndroidUnplash:用于Android的非官方Unsplash API库

    Android Unsplash(非官方) 用于Android的非官方Unsplash API库 ... 您可以调用authorize()方法以您需要访问的作用域启动该过程。 确保已在“ Unsplash”项目仪表板中打开了这些作用域。 val scopes = listOf(Sco

    实验一Android环境构建与Activity生命周期.doc

    2)填写project name(helloword),然后选择选择build target(Android 2.1),填写Application name(helloword),Package name(your.helloword)完成创建。 3)运行结果如下图: (2)设置生命周期的Log日志,分别执行...

    Android | 教你如何开发扫二维码功能

    目录前言官网的Demo和Sample代码体验1 开发准备1.1 android studio 安装1.2 在项目级gradle里添加华为maven仓1.3 在应用级的build.gradle里面加上SDK依赖1.4 加一下混淆配置1.5 Manifest申请静态权限和扫码页面声明...

    Android C++高级编程:使用NDK_Onur Cinar, 于红PDF电子书下载 带书签目录 完整版

    4.3.3 将SWIG集成到Android构建过程中 90 4.3.4 更新Activity 92 4.3.5 执行应用程序 93 4.3.6 剖析生成的代码 93 4.4 封装C语言代码 94 4.4.1 全局变量 94 4.4.2 常量 95 4.4.3 只读变量 96 4.4.4 枚举 97 ...

    smartscanner-android-api:ID PASS SmartScanner的便捷API,可简化Intent调用过程

    该库提供了可以用来启动对MRZ,条形码和卡的扫描的方法,而不是手动创建和调用意图的方法。 注意:在达到v1.0之前,库的API可能会不断发展,因此在这些v1.0之前的版本之间进行升级时请务必小心。 从v1.0开始,我们...

    dynbw:适用于Android的内核源代码的Dynamic Build Wrapper

    它的目标是简化和自动化构建内核的过程,以适应内核构建方案的新手。 几乎与所有使用POSIX SH的设备兼容。 这保证了与大多数Linux发行版之间的广泛和广泛的兼容性,甚至与那些非Linux发行版但可以使用POSIX SH的...

    Build_TensorFlow_Lite_Support_Library_With_Docker

    完成构建过程后,开发人员可以获得可在Android Studio项目中使用的.aar文件。 首先安装Docker 如果您的系统中已经有Docker,则可以跳过此部分。 如果没有进入官方页面,请下载Docker并将Docker安装在您的系统中。 ...

    pre-dem-android

    七牛APM SDK 通过虚拟机技术在应用打包编译过程中对应用采样点(Http 标准协议和 Https 标准协议)进行嵌码操作,该操作会在协议库方法前后部署 SDK 探针,该过程不会影响用户代码逻辑; 每当 App 启动时,七牛 ...

    Super_Backup_Restore_Premium_v2.2.70_build_140.apk

    完成SMS还原过程后,但默认的SMS应用程序中未显示消息,请尝试重新启动设备。 功能: –将应用程序备份到SD卡 –备份已安装应用程序的Google Play下载链接 –备份和还原应用程序的数据(需要根) –从SD卡...

    Android项目源码开源的 Material Design 豆瓣客户端.zip

    在接下来的八十天中,由于课业、其他事情和速度瓶颈,实现过程有所减慢。但是,应用的细节功能和界面交互都正在不断地被实现和优化。代码量达到了 14000 行,同时为此应用而写作的多个开源库的数千行代码并没有被...

    AppInventor2-2018版.rar

    AI伴侣启动过程中,会打开一个命令窗口,第一行显示的“错误:没有找到进程aicompanion*”是批处理文件中的提示信息,不影响伴侣的启动和使用,不必介意它。 图片 【链接开发环境与AI伴侣】 在开发环境中点击菜单...

    delphi11(实际上是delphi10.5)补丁

    3、支持最新的Android 30 API和最新的计费API,并迁移到使用AndroidX库 4、Android支持多个classes.dex文件,简化了对外部Android依赖的整合 四、Platforms 1、Delphi macOS 64位ARM编译器和工具链,包括为Intel/Arm...

    Wearable-Reply:通过语音,键盘或罐装响应简化Android Wear 2.0的文本输入

    尽管Google进行了很好的穿戴式活动来回复通知,但他们并没有很好的Intent在运行Android Wear 2.0的应用程序中撰写文本。 该库旨在简化通过语音,键盘或罐装响应在应用程序中输入文本的过程。 Google确实应该从一开始...

Global site tag (gtag.js) - Google Analytics