首先下载下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目录下的。
分享到:
相关推荐
4、装置完成后配置Android SDK,将Android SDK装置目次中的tools文件夹途径添加到环境变量中,更改系统变量中的"Path"项,添 加途径: 5、装置和配置ADT,参照Android应用开辟秘笈,启动Eclipse,点击"Help"菜单,依...
的 Android SDK 提供了在 Android 平台上使用 JaVa 语言进行 Android 应用开发必须的工具和 API 接口。 特性 • 应用程序框架 支持组件的重用与替换 • Dalvik Dalvik Dalvik Dalvik 虚拟机 专为移动设备优化 • ...
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 ...
4、安装完成后配置Android SDK,将Android SDK安装目录中的tools文件夹路径添加到环境变量中,更改系统变量中的"Path"项,添 加路径: 5、安装和配置ADT,参照Android应用开发秘籍,启动Eclipse,点击"Help"菜单,按...
4、安装完成后配置Android SDK,将Android SDK安装目录中的tools文件夹路径添加到环境变量中,更改系统变量中的"Path"项,添 加路径: 5、安装和配置ADT,参照Android应用开发秘籍,启动Eclipse,点击"Help"菜单,按...
4、安装完成后配置Android SDK,将Android SDK安装目录中的tools文件夹路径添加到环境变量中,更改系统变量中的"Path"项,添 加路径: 5、安装和配置ADT,参照Android应用开发秘籍,启动Eclipse,点击"Help"菜单,按...
4、安装完成后配置Android SDK,将Android SDK安装目录中的tools文件夹路径添加到环境变量中,更改系统变量中的"Path"项,添加 路径: 5、安装和配置ADT,参照Android应用开发秘籍,启动Eclipse,点击"Help"菜单,按...
Android Unsplash(非官方) 用于Android的非官方Unsplash API库 ... 您可以调用authorize()方法以您需要访问的作用域启动该过程。 确保已在“ Unsplash”项目仪表板中打开了这些作用域。 val scopes = listOf(Sco
2)填写project name(helloword),然后选择选择build target(Android 2.1),填写Application name(helloword),Package name(your.helloword)完成创建。 3)运行结果如下图: (2)设置生命周期的Log日志,分别执行...
目录前言官网的Demo和Sample代码体验1 开发准备1.1 android studio 安装1.2 在项目级gradle里添加华为maven仓1.3 在应用级的build.gradle里面加上SDK依赖1.4 加一下混淆配置1.5 Manifest申请静态权限和扫码页面声明...
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 ...
该库提供了可以用来启动对MRZ,条形码和卡的扫描的方法,而不是手动创建和调用意图的方法。 注意:在达到v1.0之前,库的API可能会不断发展,因此在这些v1.0之前的版本之间进行升级时请务必小心。 从v1.0开始,我们...
它的目标是简化和自动化构建内核的过程,以适应内核构建方案的新手。 几乎与所有使用POSIX SH的设备兼容。 这保证了与大多数Linux发行版之间的广泛和广泛的兼容性,甚至与那些非Linux发行版但可以使用POSIX SH的...
完成构建过程后,开发人员可以获得可在Android Studio项目中使用的.aar文件。 首先安装Docker 如果您的系统中已经有Docker,则可以跳过此部分。 如果没有进入官方页面,请下载Docker并将Docker安装在您的系统中。 ...
七牛APM SDK 通过虚拟机技术在应用打包编译过程中对应用采样点(Http 标准协议和 Https 标准协议)进行嵌码操作,该操作会在协议库方法前后部署 SDK 探针,该过程不会影响用户代码逻辑; 每当 App 启动时,七牛 ...
完成SMS还原过程后,但默认的SMS应用程序中未显示消息,请尝试重新启动设备。 功能: –将应用程序备份到SD卡 –备份已安装应用程序的Google Play下载链接 –备份和还原应用程序的数据(需要根) –从SD卡...
在接下来的八十天中,由于课业、其他事情和速度瓶颈,实现过程有所减慢。但是,应用的细节功能和界面交互都正在不断地被实现和优化。代码量达到了 14000 行,同时为此应用而写作的多个开源库的数千行代码并没有被...
AI伴侣启动过程中,会打开一个命令窗口,第一行显示的“错误:没有找到进程aicompanion*”是批处理文件中的提示信息,不影响伴侣的启动和使用,不必介意它。 图片 【链接开发环境与AI伴侣】 在开发环境中点击菜单...
3、支持最新的Android 30 API和最新的计费API,并迁移到使用AndroidX库 4、Android支持多个classes.dex文件,简化了对外部Android依赖的整合 四、Platforms 1、Delphi macOS 64位ARM编译器和工具链,包括为Intel/Arm...
尽管Google进行了很好的穿戴式活动来回复通知,但他们并没有很好的Intent在运行Android Wear 2.0的应用程序中撰写文本。 该库旨在简化通过语音,键盘或罐装响应在应用程序中输入文本的过程。 Google确实应该从一开始...