【Android源码 栏目提醒】:网学会员Android源码 为您提供Android 文件系统的移植 - 网络与通信参考,解决您在Android 文件系统的移植 - 网络与通信学习中工作中的难题,参考学习。
Android 文件系统的移植 作者:汕头大学—黄珠唐 时间:2009 年 10 月 29 日文章摘要 主要介绍 linux 内核启动过程以及挂载
android 根文件系统的过程,以及介绍
android 源代码中文件系统部分的浅析。
目录 部分介绍 源代码文 系统部分1)
android 源代码文件系统部分介绍 启动挂
android 根文件系 过程分析2)Linux 内核启动挂载
android 根文件系统过程分析 文件系统初始化核心 nit.c 系统初始化3)
Android 文件系统初始化核心 Init.c 文件分析 初始化核心的 init.rc 文件分4)初始化核心的核心 init.rc 文件分析 核心 源代码文 系统部分 部分介绍1)
android 源代码文件系统部分介绍从 google 获得源代码后,在 platform 目录下 make 编译后我们可以看到生成了out 目录。
主要源代码目录介绍Makefile (全局的Makefile)bionic (Bionic 含义为仿生,这里面是一些基础的库的源代码)bootable (引导加载器)build (build 目录中的内容不是目标所用的代码,而是编译和配置所需要的脚本和工具)dalvik (JAVA 虚拟机)development (程序开发所需要的模板和工具)external (目标机器使用的一些库)frameworks (应用程序的框架层)hardware (与硬件相关的库)packages (
Android 的各种应用程序)prebuilt (
Android 在各种平台下编译的预置脚本)recovery (与目标的恢复功能相关)system (
Android 的底层的一些库)out 编译完成后产生的目录,也就是我们移植文件系统需要的目录让我们打开 out 目录看看里面有什么东西,out/-- CaseCheck.txt-- casecheck.txt-- host -- common -- linux-x86-- target -- common -- product主要的两个目录为 host 和 target,前者表示在主机(x86)生成的工具,后者表示目标机(模认为 ARMv5)运行的内容。
host 目录的结构如下所示:out/host/-- common -- obj (JAVA 库)-- linux-x86 -- bin (二进制程序) -- 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 文件系统非常重要的内容,/objAPPS 文件系统下/system/apps 目录下的各种应用程序SHARED_LIBRARIES (存放所有动态库)STATIC_LIBRARIES(存放所有静态库)EXECUTABLES (存放各种可执行文件)还有其他需要的文件都是在/out/target/product/generic 目录下我们可以从中提取我们需要的内容。
启动挂
android 根文件系 过程分析2)Linux 内核启动挂载
android 根文件系统过程分析 要分析 linux 启动过程,一切要从内核/arch/arm/boot/compressed/head.S说起不过我们不介绍得那么详细,我们只看和根文件系统有关的部分。
顺便罗列一下内核启动流程:UBOOT/arch/arm/boot/compressed/head.S:Start:Decompressed_kernel//在/arch/arm/boot/compressed/misc.c 中Call_kernelStext:/init/main.cStart_kernelSetup_arch…Rest_initInitDo_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_postvoidfree_initmemunlock_kernelmark_rodata_rosystem_state SYSTEM_RUNNINGnuma_default_policyif sys_openconst char __user quot/dev/consolequot O_RDWR 0 lt 0printkKERN_WARNING quotWarning: unable to open an initial console.nquotvoid sys_dup0void sys_dup0current-gtsignal-gtflags SIGNAL_UNKILLABLEif ramdisk_execute_command run_init_processramdisk_execute_commandprintkKERN_WARNING quotFailed to execute snquotramdisk_execute_command / We try each of these until one succeeds. The Bourne shell can be used instead of init if we are trying to recover a really broken machine./if execute_command run_init_processexecute_commandprintkKERN_WARNING quotFailed to execute s. Attempting quotquotdefaults...nquotexecute_command run_init_processquot/sbin/initquotrun_init_processquot/etc/initquotrun_init_processquot/bin/initquotrun_init_processquot/bin/shquotpanicquotNo init found. Try passing init option to kernel.quot其中,我们看到行代码 run_init_processexecute_commandexecute_command 是从 UBOOT 传递过来的参数,一般为/init,也就是调用文件系 统 里 的 init 初 始 化 进 程 。
如 果 找 不 到 init 文 件 就 会 在run_init_processquot/sbin/initquotrun_init_processquot/etc/initquotrun_init_processquot/bin/initquotrun_init_processquot/bin/shquot中找,否则报错。
在这里由于我们的根文件系统是从/linuxrc 开始的,所以我硬性把它改为if execute_command run_init_processquot/linuxrcquot printkKERN_WARNING quotFailed to execute s. Attempting quot quotdefaults...nquot execute_command 文件系统初始化核心 nit.c 系统初始化3)
Android 文件系统初始化核心 Init.c 文件分析 上面我们说的 init 这个文件是由
android 源代码编译来的,编译后在/out/target/product/generic/root/initRoot 目录下产生了一个文件系统的雏形。
其
源码在 m/system/core/init/init.cInit.c 主要做了什么呢?我们看看下面这个比较详细的分析,为网上资料整理而来。
1)安装 SIGCHLD 信号。
(如果父进程不等待子进程结束,子进程将成为僵尸 进程(zombie)从而占用系统资源。
因此需要对 SIGCHLD 信号做出处理,回 收僵尸进程的资源,避免造成不必要的资源浪费。
) (2)对 umask 进行清零。
何为 umask,请看 http://www.szstudy.cn/showArticle/53978.shtml (3)为 rootfs 建立必要的文件夹,并挂载适当的分区。
/dev (tmpfs) /dev/pts devpts /dev/socket /proc proc /sys sysfs4创建/dev/null 和/dev/kmsg 节点。
(5)解析/init.rc,将所有服务和操作信息加入链表。
6从/proc/cmdline 中提取信息内核启动参数并保存到全局变量。
(7)先从上一步获得的全局变量中获取信息硬件信息和版本号,如果没有则从/proc/cpuinfo 中提取并保存到全局变量。
(8)根据硬件信息选择一个/init.硬件.rc,并解析,将服务和操作信息加入链表。
在 G1 的 ramdisk 根目录下有两个/init.硬件.rc:init.goldfish.rc 和init.trout.rc,init 程序会根据上一步获得的硬件信息选择一个解析。
(9)执行链表中带有“early-init”触发的的命令。
(10)遍历/sys 文件夹,是内核产生设备添加事件(为了自动产生设备节点。
(11)初始化属性系统,并导入初始化属性文件。
(12)从属性系统中得到 ro.debuggable,若为 1,则初始化 keychord 监听。
(13)打开 console如果 cmdline 中没有指定 console 则打开默认的/dev/console(14)读取/initlogo.rle(一张 565 rle 压缩的位图) ,如果成功则在/dev/graphics/fb0 显示 Logo如果失败则将/dev/tty0 设为 TEXT 模式并打开/dev/tty0输出文本“
ANDROID”字样。
(15)判断 cmdline 中的参数,并设置属性系统中的参数:1、 如果 bootmode 为- factory设置 ro.factorytest 值为 1- factory2设置 ro.factorytest 值为 2- 其他的设 ro.factorytest 值为 02、如果有 serialno 参数,则设置 ro.serialno,否则为quotquot3、如果有 bootmod 参数,则设置 ro.bootmod,否则为quotunknownquot4、如果有 baseband 参数,则设置 ro.baseband,否则为quotunknownquot5、如果有 carrier 参数,则设置 ro.carrier,否则为quotunknownquot6、如果有 bootloader 参数,则设置 ro.bootloader,否则为quotunknownquot7、通过全局变量(前面从/proc/cpuinfo 中提取的)设置 ro.hardware 和ro.version。
(16)执行所有触发标识为 init 的 action。
(17)开始 property 服务,读取一些 property 文件,这一动作必须在前面那些 ro.foo 设置后做,以便/data/local.prop 不能干预到他们。
- /system/build.prop- /system/default.prop- /data/local.prop- 在读取默认的 property 后读取 presistent propertie,在/data/property中(18)为 sigchld handler 创建信号机制(19)确认所有初始化工作完成:device_fddevice init 完成property_set_fdproperty server start 完成signal_recv_fd 信号机制建立(20) 执行所有触发标识为 early-boot 的 action (21) 执行所有触发标识为 boot 的 action (22)基于当前 property 状态,执行所有触发标识为 property 的 action (23)注册轮询事件: - device_fd - property_set_fd -signal_recv_fd -如果有 keychord,则注册 keychord_fd (24)如果支持 BOOTCHART则初始化 BOOTCHART (25)进入主进程循环: - 重置轮询事件的接受状态,revents 为 0 - 查询 action 队列,并执行。
- 重启需要重启的服务 - 轮询注册的事件 - 如果 signal_recv_fd 的 revents 为 POLLIN,则得到一个信号,获取并处 理 - 如果 device_fd 的 revents 为 POLLIN调用 handle_device_fd - 如果 property_fd 的 revents 为 POLLIN调用 handle_property_set_fd - 如果 keychord_fd 的 revents 为 POLLIN调用 handle_keychord到了这里,整个
android 文件系统已经起来了。
初始化核心的 init.rc 文件分4)初始化核心的核心 init.rc 文件分析 核心在上面红色那一行(5)解析/init.rc,将所有服务和操作信息加入链表。
parse_config_filequot/init.rcquot//在 init.c 中代码贴出 init.rc 脚本on initsysclktz 0loglevel 3 setup the global environment export PATH /bin:/sbin:/system/sbin:/system/bin:/system/xbin export LD_LIBRARY_PATH /lib:/system/lib export
ANDROID_BOOTLOGO 1 export
ANDROID_ROOT /system export
ANDROID_ASSETS /system/app export
ANDROID_DATA /data export EXTERNAL_STORAGE /sdcard export BOOTCLASSPATH/system/framework/core.jar:/system/framework/ext.jar:/system/framework/framework.jar:/system/framework/
android.policy.jar:/system/framework/services.jar symlink /dev/snd/audio /dev/eac Backward compatibility symlink /system/etc /etc create mountpoints and mount tmpfs on sqlite_stmt_journals mkdir /sdcard 0000 system system mkdir /system mkdir /data 0771 system system mkdir /cache 0770 system cache mkdir /sqlite_stmt_journals 01777 root root mount tmpfs tmpfs /sqlite_stmt_journals size4m mount rootfs rootfs / ro remount write /proc/sys/kernel/panic_on_oops 1 write /proc/sys/kernel/hung_task_timeout_secs 0 write /proc/cpu/alignment 4 write /proc/sys/kernel/sched_latency_ns 10000000 write /proc/sys/kernel/sched_wakeup_granularity_ns 2000000 mount mtd partitions Mount /system rw first to give the filesystem a chance to save acheckpoint mount yaffs2 mtdsystem /system mount yaffs2 mtdsystem /system ro remount We chown/chmod /data again so because mount is run as root defaults mount ext3 /dev/block/mmcblk0p2 /data nosuid nodev chown system system /data chmod 0771 /data Same reason as /data above mount yaffs2 mtdcache /cache nosuid nodev chown system cache /cache chmod 0770 /cache This may have been created by the recovery system with oddpermissions chown system system /cache/recovery chmod 0770 /cache/recovery create basic filesystem structure mkdir /data/misc 01771 system misc mkdir /data/misc/hcid 0770 bluetooth bluetooth mkdir /data/local 0771 shell shell mkdir /data/local/tmp 0771 shell shell mkdir /data/data 0771 system system mkdir /data/app-private 0771 system system mkdir /data/app 0771 system system mkdir /data/property 0700 root root create dalvik-cache and double-check the perms mkdir /data/dalvik-cache 0771 system system chown system system /data/dalvik-cache chmod 0771 /data/dalvik-cache create the lostfound directories so as to enforce our permissions mkdir /data/lostfound 0770 mkdir /cache/lostfound 0770 double check the perms in case lostfound already exists and setowner chown root root /data/lostfound chmod 0770 /data/lostfound chown root root /cache/lostfound chmod 0770 /cache/lostfoundon boot basic network init ifup lo hostname localhost domainname localdomain set RLIMIT_NICE to allow priorities from 19 to -20 setrlimit 13 40 40 Define the oom_adj values for the classes of processes that can be killed by the kernel. These are used in ActivityManagerService. setprop ro.FOREGROUND_APP_ADJ 0 setprop ro.VISIBLE_APP_ADJ 1 setprop ro.SECONDARY_SERVER_ADJ 2 setprop ro.HIDDEN_APP_MIN_ADJ 7 setprop ro.CONTENT_PROVIDER_ADJ 14 setprop ro.EMPTY_APP_ADJ 15 Define the memory thresholds at which the above process classes will be killed. These numbers are in pages 4k. setprop ro.FOREGROUND_APP_MEM 1536 setprop ro.VISIBLE_APP_MEM 2048 setprop ro.SECONDARY_SERVER_MEM 4096 setprop ro.HIDDEN_APP_MEM 5120 setprop ro.CONTENT_PROVIDER_MEM 5632 setprop ro.EMPTY_APP_MEM 6144 Write value must be consistent with the above properties. write /sys/module/lowmemorykiller/parameters/adj 01271415 write /proc/sys/vm/overcommit_memory 1 write /sys/module/lowmemorykiller/parameters/minfree12056326144 Set init its forked childrens oom_adj. write /proc/1/oom_adj -16 Permissions for System Server and daemons. chown radio system /sys/
android_power/state chown radio system /sys/
android_power/request_state chown radio system /sys/
android_power/acquire_full_wake_lock chown radio system /sys/
android_power/acquire_partial_wake_lock chown radio system /sys/
android_power/release_wake_lock chown radio system /sys/power/state chown radio system /sys/power/wake_lock chown radio system /sys/power/wake_unlock chmod 0660 /sys/power/state chmod 0660 /sys/power/wake_lock chmod 0660 /sys/power/wake_unlock chown system system /sys/class/timed_output/vibrator/enable chown system system /sys/class/leds/keyboard-backlight/brightness chown system system /sys/class/leds/lcd-backlight/brightness chown system system /sys/class/leds/button-backlight/brightness chown system system /sys/class/leds/red/brightness chown system system /sys/class/leds/green/brightness chown system system /sys/class/leds/blue/brightness chown system system /sys/class/leds/red/device/grpfreq chown system system /sys/class/leds/red/device/grppwm chown system system /sys/class/leds/red/device/blink chown system system /sys/class/leds/red/brightness chown system system /sys/class/leds/green/brightness chown system system /sys/class/leds/blue/brightness chown system system /sys/class/leds/red/device/grpfreq chown system system /sys/class/leds/red/device/grppwm chown system system /sys/class/leds/red/device/blink chown system system /sys/class/timed_output/vibrator/enable chown system system /sys/module/sco/parameters/disable_esco chown system system /sys/kernel/ipv4/tcp_wmem_min chown system system /sys/kernel/ipv4/tcp_wmem_def chown system system /sys/kernel/ipv4/tcp_wmem_max chown system system /sys/kernel/ipv4/tcp_rmem_min chown system system /sys/kernel/ipv4/tcp_rmem_def chown system system /sys/kernel/ipv4/tcp_rmem_max chown root radio /proc/cmdline Define TCP buffer sizes for various networks ReadMin ReadInitial ReadMax WriteMin WriteInitial WriteMax setprop net.tcp.buffersize.default4096873801102084096 setprop net.tcp.buffersize.wifi4095873801102084096 setprop net.tcp.buffersize.umts4094873801102084096 setprop net.tcp.buffersize.edge4093262803504040961638435040 setprop net.tcp.buffersize.gprs4092876011680 class_start default Daemon processes to be run by init.service console /system/bin/sh consoleservice console /bin/busybox sh consoleservice myInit /bin/busybox sh /system/etc/shine/myInit.rc oneshot adbd is controlled by the persist.service.adb.enable system propertyservice adbd /sbin/adbd disabled adbd on at boot in emulatoron property:ro.kernel.qemu1 start adbdon property:persist.service.adb.enable1 start adbdon property:persist.service.adb.enable0 stop adbdservice servicemanager /system/bin/servicemanager user system critical onrestart restart zygote onrestart restart mediaservice mountd /system/bin/mountd socket mountd stream 0660 root mountservice debuggerd /system/bin/debuggerdservice ril-daemon /system/bin/rild socket rild stream 660 root radio socke.
上一篇:
安卓航班Android开发经典教程大总结2
下一篇:
Function GetIp(IP) 获得ip asp