简述android移植流程,android移植详解

本文详细介绍了Android系统的移植过程,包括Linux内核启动、挂载Android根文件系统,以及Android源代码中涉及的目录结构。重点讨论了init.c文件在Android文件系统初始化中的关键作用,如安装信号处理、创建必要目录、解析配置文件等。同时,文章还剖析了.init.rc文件在系统启动过程中的功能,阐述了Android初始化语言的基本结构和解析机制。
摘要由CSDN通过智能技术生成

主要介绍linux 内核启动过程以及挂载android 根文件系统的过程,以及介绍android 源代码中文件系统部分的浅析。

主要源代码目录介绍

Makefile (全局的Makefile)

bionic (Bionic 含义为仿生,这里面是一些基础的库的源代码)

bootable (引导加载器)

build (build 目录中的内容不是目标所用的代码,而是编译和配置所需要的脚本和工具)

dalvik (JAVA 虚拟机)

development (程序开发所需要的模板和工 具)                                                                                     external (目标机器使用的一些库)

frameworks (应用程序的框架层)

hardware (与硬件相关的库)

packages (Android 的各种应用程序)

prebuilt (Android 在各种平台下编译的预置脚本)

recovery (与目标的恢复功能相关)

system (Android 的底层的一些库)

out (编译完成后产生的目录,也就是我们移植文件系统需要的目录)

host 目录的结构如下所示:

out/host/

|-- common

| `-- obj (JAVA 库)

`-- linux-x86

|-- bin (??瞥绦颍?br> |-- framework (JAVA 库,*.jar 文件)

|-- lib (共享库*.so)

`-- obj (中间生成的目标文件)

host 目录是一些在主机上用的工具,有一些是二进制程序,有一些是JAVA 的程序。

target 目录的结构如下所示:

out/target/

|-- common

| |-- R (资源文件)

| |-- docs

| `-- obj (目标文件)

`-- product

`-- generic

其中common 目录表示通用的内容,product 中则是针对产品的内容。

在common 目录的obj 中,包含两个重要的目录:

APPS 中包含了JAVA 应用程序生成的目标,每个应用程序对应其中一个子目录,将结合每个应用程序的原始文件生成Android 应用程序的APK 包。                                                                                       JAVA_LIBRARIES 中包含了JAVA 的库,每个库对应其中一个子目录。

所以,我们提取文件系统主要是在/out/target/product/generic 目录下,我们可以看到里面有obj 目录,进入obj 目录看看,里面是android 文件系统非常重要的内容:

/obj

APPS (文件系统下/system/apps 目录下的各种应用程序)

SHARED_LIBRARIES (存放所有动态库)

STATIC_LIBRARIES(存放所有静态库)

EXECUTABLES (存放各种可执行文件)

Linux 内核启动挂载android根文件系统过程分析

顺便罗列一下内核启动流程:

/arch/arm/boot/compressed/head.S:

Start:

Decompressed_kernel()             //在/arch/arm/boot/compressed/misc.c 中

Call_kernel()

Stext:

/init/main.c

Start_kernel()

Setup_arch()

Rest_init()

Init()

Do_basic_setup()

Prepare_namespace()

看到了这里,我已激动得说不出话了,因为来到我与挂载根文件系统最重要的接口函数。

/* This is a non __init function. Force it to be noinline otherwise gcc

* makes it inline to init() and it becomes part of init.text section

*/

static int noinline init_post(void)

{

free_initmem();

unlock_kernel();

mark_rodata_ro();

system_state = SYSTEM_RUNNING;

numa_default_policy();

if (sys_open((const char __user *) "/dev/console", O_RDWR, 0) < 0)

printk(KERN_WARNING "Warning: unable to open an initial console.\n");

(void) sys_dup(0);

(void) sys_dup(0);

current->signal->flags |= SIGNAL_UNKILLABLE;

if (ramdisk_execute_command) {

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值