Android程序启动过程源码分析

合集下载

Android之Activity启动流程详解(基于api28)

Android之Activity启动流程详解(基于api28)

Android之Activity启动流程详解(基于api28)前⾔Activity作为Android四⼤组件之⼀,他的启动绝对没有那么简单。

这⾥涉及到了系统服务进程,启动过程细节很多,这⾥我只展⽰主体流程。

activity的启动流程随着版本的更替,代码细节⼀直在进⾏更改,每次都会有很⼤的修改,如android5.0 android8.0。

我这⾥的版本是基于android api28,也是⽬前我可以查得到的最新源码了。

事实上⼤题的流程是相同的,掌握了⼀个版本,其他的版本通过源码也可以很快地掌握。

因为涉及到不同的进程之间的通信:系统服务进程和本地进程,在最新版本的android使⽤的是AIDL来跨进程通信。

所以需要对AIDL有⼀定的了解,会帮助理解整个启动流程。

源码部分的讲解涉及到很多的代码讲解,可能会有⼀点不适,但还是建议看完源码。

源码的关键代码处我都会加上注释,⽅便理解。

代码不会过分关注细节,只注重整体流程。

想知道具体细节可以去查看源码。

每份代码所在的路径我都会在代码前⾯标注出来,各位可以去查看相对应的源码。

每部分源码前我都会放流程图,⼀定要配合流程图⾷⽤,不然可能会乱。

整体流程概述这⼀部分侧重于对整个启动流程的概述,在⼼中有⼤体的概念,这样可以帮助对下⾯具体细节流程的理解。

普通Activity的创建普通Activity创建也就是平常我们在代码中采⽤startActivity(Intent intent)⽅法来创建Activity的⽅式。

总体流程如下图:启动过程设计到两个进程:本地进程和系统服务进程。

本地进程也就是我们的应⽤所在进程,系统服务进程为所有应⽤共⽤的服务进程。

整体思路是:1. activity向Instrumentation请求创建2. Instrumentation通过AMS在本地进程的IBinder接⼝,访问AMS,这⾥采⽤的跨进程技术是AIDL。

3. 然后AMS进程⼀系列的⼯作,如判断该activity是否存在,启动模式是什么,有没有进⾏注册等等。

ANDROID源码结构分析

ANDROID源码结构分析

ANDROID源码结构分析Android是一个开源的操作系统,其源代码以Apache License 2.0开源许可证的形式向公众发布。

它的源码结构非常庞大而复杂,涵盖了各种组件和功能,以支持不同形式的设备和应用。

本文将对Android源码的结构进行详细分析,让读者对Android系统的内部构建有更深入的理解。

Android源码主要分为四个部分:内核、硬件抽象层(HAL)、Android运行时环境(ART/Dalvik)和框架层。

这些部分协同工作,形成了Android完整的系统架构。

1. 内核部分:Android操作系统的底层是Linux内核,它提供了访问硬件设备、内存管理、进程管理、安全性等基本功能。

Android对Linux内核进行了一些定制,以适应移动设备的特性和需求,比如增加了对电池管理、相机功能、音频系统的支持等。

Android的内核代码位于kernel目录下,包括了Linux内核的源码以及Android特有的补丁。

2. 硬件抽象层(HAL):HAL层负责将底层硬件与操作系统之间的交互抽象出来,为上层应用提供统一的接口。

HAL层的代码位于硬件厂商提供的硬件抽象层的目录下,通常是在device或vendor目录下,有些库会放在硬件设备目录中。

3. Android运行时环境:Android系统采用了Java虚拟机(Dalvik 或ART)作为应用程序运行的环境。

Dalvik是Android4.4之前的默认虚拟机,而ART是Android5.0及之后的默认虚拟机。

Android运行时环境负责将应用程序的Java字节码翻译成机器码,执行应用程序代码。

运行时环境的代码位于art和dalvik目录下。

4. 框架层:框架层包括了各种系统服务、应用程序接口(API)和系统应用程序。

这些框架组件实现了Android系统的核心功能,比如窗口管理、通信服务、多媒体播放、数据存储等。

框架层的代码位于frameworks目录下,其中包括了各种子目录用于存放不同功能模块的代码,比如native相关的代码在native目录下,多媒体相关的代码在media目录下等。

Android应用程序绑定服务(bindService)的过程源代码分析

Android应用程序绑定服务(bindService)的过程源代码分析

Android应用程序组件Service与Activity一样,既可以在新的进程中启动,也可以在应用程序进程内部启动;前面我们已经分析了在新的进程中启动Service的过程,本文将要介绍在应用程序内部绑定Service的过程,这是一种在应用程序进程内部启动Service的方法。

在前面一篇文章Android进程间通信(IPC)机制Binder简要介绍和学习计划中,我们就曾经提到,在Android系统中,每一个应用程序都是由一些Activity和Service组成的,一般Service运行在独立的进程中,而Activity有可能运行在同一个进程中,也有可能运行在不同的进程中;在接下来的文章中,Android系统在新进程中启动自定义服务过程(startService)的原理分析一文介绍了在新的进程中启动Service的过程,Android应用程序启动过程源代码分析一文介绍了在新的进程中启动Activity的过程,而Android应用程序内部启动Activity 过程(startActivity)的源代码分析一文则介绍了在应用程序进程内部启动Activity的过程;本文接过最后一棒,继续介绍在应用程序进程内部启动Service的过程,这种过程又可以称在应用程序进程内部绑定服务(bindService)的过程,这样,读者应该就可以对Android应用程序启动Activity和Service有一个充分的认识了。

这里仍然是按照老规矩,通过具体的例子来分析Android应用程序绑定Service的过程,而所使用的例子便是前面我们在介绍Android 系统广播机制的一篇文章Android系统中的广播(Broadcast)机制简要介绍和学习计划中所开发的应用程序Broadcast了。

我们先简单回顾一下这个应用程序实例绑定Service的过程。

在这个应用程序的MainActivity的onCreate函数中,会调用bindService 来绑定一个计数器服务CounterService,这里绑定的意思其实就是在MainActivity内部获得CounterService的接口,所以,这个过程的第一步就是要把CounterService启动起来。

startactivityinner 源码 解析

startactivityinner 源码 解析

startactivityinner 源码解析摘要:1.Android 中的StartActivity 方法介绍2.StartActivity 的工作原理3.StartActivity 参数解析4.常见问题及解决方法5.实战案例分享正文:作为一名Android 开发者,熟练掌握StartActivity 方法对于实现应用程序的跳转功能至关重要。

本文将详细介绍Android 中的StartActivity 方法,解析其工作原理,并分析常见问题及解决方法。

最后,将通过实战案例分享,帮助大家更好地理解和应用StartActivity。

1.Android 中的StartActivity 方法介绍在Android 中,StartActivity 方法是Activity 类中的一个方法,用于启动另一个Activity。

通过调用这个方法,可以实现不同界面之间的跳转,使得应用程序的功能更加丰富。

StartActivity 方法的定义如下:```javapublic void startActivity(Intent intent)```参数:- Intent:表示要启动的Activity 的Intent 对象。

2.StartActivity 的工作原理StartActivity 方法启动另一个Activity 的过程可以分为以下几个步骤:- 创建一个Intent 对象,表示要启动的Activity。

- 调用startActivity 方法,将Intent 对象传递给目标Activity。

- 目标Activity 接收到Intent 对象,根据Intent 中的信息创建对应的实例。

- 目标Activity 实例启动,并设置界面布局。

- 源Activity 完成跳转,退出屏幕。

3.StartActivity 参数解析在StartActivity 方法中,Intent 对象包含了要启动的Activity 相关信息。

以下是Intent 对象中常用的参数:- action:表示Activity 启动的类型,例如ACTION_VIEW、ACTION_EDIT 等。

android7.x Launcher3源码解析(3)---workspace和allapps加载流程

android7.x Launcher3源码解析(3)---workspace和allapps加载流程

android7.x Launcher3源码解析(3)---workspace和allapps加载流程1、整体流程先上一张整体的流程图吧。

(图片看不清可以下载下来看或者右击新开个页面查看图片)先从Launcher.Java的onCreate方法开始,protected void onCreate(Bundle savedInstanceState) {......//建立LauncherAppState对象LauncherAppState.setApplicationContext(getApplicationContext());LauncherAppState app = LauncherAppState.getInstance();......//建立LauncherModel对象mModel = app.setLauncher(this);//一些其他对象初始化......setContentView(uncher);setupViews();if (!mRestoring) {if (DISABLE_SYNCHRONOUS_BINDING_CURRENT_PAGE) {// If the user leaves launcher, then we should just load items asynchronously when// they return.mModel.startLoader(PagedView.INV ALID_RESTORE_PAGE);} else {// We only load the page synchronously if the user rotates (or triggers a// configuration change) while launcher is in the foregroundmModel.startLoader(mWorkspace.getRestorePage());}}......}重点调用了LauncherModel的startLoader的方法,startLoader里面,最重要的就是启动了LoaderTask,mLoaderTask = new LoaderTask(mApp.getContext(), synchronousBindPage);我们接着分析LoaderTask的run方法。

Android 开机启动流程

Android 开机启动流程

Android的开机流程1. 系统引导bootloader1) 源码:bootable/bootloader/*2) 说明:加电后,CPU将先执行bootloader程序,此处有三种选择a) 开机按Camera+Power启动到fastboot,即命令或SD卡烧写模式,不加载内核及文件系统,此处可以进行工厂模式的烧写b) 开机按Home+Power启动到recovery模式,加载recovery.img,recovery.img包含内核,基本的文件系统,用于工程模式的烧写c) 开机按Power,正常启动系统,加载boot.img,boot.img包含内核,基本文件系统,用于正常启动手机(以下只分析正常启动的情况)2. 内核kernel1) 源码:kernel/*2) 说明:kernel由bootloader加载3. 文件系统及应用init1) 源码:system/core/init/*2) 配置文件:system/rootdir/init.rc,3) 说明:init是一个由内核启动的用户级进程,它按照init.rc中的设置执行:启动服务(这里的服务指linux底层服务,如adbd提供adb支持,vold提供SD卡挂载等),执行命令和按其中的配置语句执行相应功能4. 重要的后台程序zygote1) 源码:frameworks/base/cmds/app_main.cpp等2) 说明:zygote是一个在init.rc中被指定启动的服务,该服务对应的命令是/system/bin/app_processa) 建立Java Runtime,建立虚拟机b) 建立Socket接收ActivityManangerService的请求,用于Fork应用程序c) 启动System Server5. 系统服务system server1) 源码:frameworks/base/services/java/com/android/server/SystemServer.java2) 说明:被zygote启动,通过System Manager管理android的服务(这里的服务指frameworks/base/services下的服务,如卫星定位服务,剪切板服务等)6. 桌面launcher1) 源码:ActivityManagerService.java为入口,packages/apps/launcher*实现2) 说明:系统启动成功后SystemServer使用xxx.systemReady()通知各个服务,系统已经就绪,桌面程序Home就是在ActivityManagerService.systemReady()通知的过程中建立的,最终调用()启launcher7. 解锁1) 源码:frameworks/policies/base/phone/com/android/internal/policy/impl/*lock*2) 说明:系统启动成功后SystemServer调用wm.systemReady()通知WindowManagerService,进而调用PhoneWindowManager,最终通过LockPatternKeyguardView显示解锁界面,跟踪代码可以看到解锁界面并不是一个Activity,这是只是向特定层上绘图,其代码了存放在特殊的位置8. 开机自启动的第三方应用程序1) 源码:frameworks/base/services/java/com/android/server/am/ActivityManagerService.java2) 说明:系统启动成功后SystemServer调用ActivityManagerNative.getDefault().systemReady()通知ActivityManager启动成功,ActivityManager会通过置变量mBooting,通知它的另一线程,该线程会发送广播android.intent.action.BOOT_COMPLETED以告知已注册的第三方程序在开机时自动启动。

android系统从systemserver开始的launcher启动详细流程

android系统从systemserver开始的launcher启动详细流程

android系统启动流程——从systemserver开始的launcher目录1 概述: (2)2 systemserver工作内容分析 (4)2.1 SystemServer类简述 (4)2.2 ServerThread类简述 (4)3 ActivityManagerService工作内容分析 (6)3.1 ActivityManagerService之main (7)3.1.1创建ActivityManagerService实例 (7)3.1.2 创建ActivityThread实例,获取全局Context (8)3.1.3创建ActivityStackSupervisor实例 (10)3.1.4调用startRunning (10)3.2 ActivityManagerService之setSystemProcess (11)3.3. ActivityManagerService之setWindowManager (12)3.4 ActivityManagerService之systemready (12)3.4.1 启动所有Persistent属性的APK (13)3.4.2 启动launcher (14)4 ActivityStackSupervisor启动launcher (15)4.1首先回顾一下ActivityStackSupervisor实例的初始化 (15)4.2 进入ActivityStackSupervisor.resumeTopActivitiesLocked (16)4.3 进入ActivityStack.resumeTopActivityLocked (16)4.4 回到ActivityStackSupervisor.resumeHomeActivity。

(17)4.5 ActivityStackSupervisor.mProbeThread (17)4.6 ActivityStackSupervisor.mProbeHandler (18)4.7 回到ActivityManagerService.startHomeActivityLocked (18)4.8 ActivityStackSupervisor.startHomeActivity (19)4.9 ActivityStackSupervisor.startActivityUncheckedLocked (20)4.10 ActivityStack.startActivityLocked (21)4.11 ActivityStackSupervisor.resumeTopActivitiesLocked (22)4.12 ActivityStack.resumeTopActivityLocked (22)4.13 ActivityStackSupervisor.startSpecificActivityLocked (24)4.14 ActivityStackSupervisor.realStartActivityLocked (24)4.15 ActivityManagerService.startProcessLocked (25)5 Process类管理创建activity进程 (27)5.1 Process.start: (27)5.2Process.startViaZygote (28)5.3 zygoteSendArgsAndGetResult和openZygoteSocketIfNeeded (28)6 ActivityThread线程类分析 (30)6.1 ActivityThread.main分析 (30)6.1.1创建了looper对象和本线程绑定。

Android中使用am命令实现在命令行启动程序详解

Android中使用am命令实现在命令行启动程序详解

Android中使⽤am命令实现在命令⾏启动程序详解在Android中,除了从界⾯上启动程序之外,还可以从命令⾏启动程序,使⽤的是命令⾏⼯具am.复制代码代码如下:usage: am [subcommand] [options]start an Activity: am start [-D]-D: enable debuggingsend a broadcast Intent: am broadcaststart an Instrumentation: am instrument [flags]-r: print raw results (otherwise decode REPORT_KEY_STREAMRESULT)-e : set argument to-p : write profiling data to-w: wait for instrumentation to finish before returningstart profiling: am profile startstop profiling: am profile stopspecifications include these flags:[-a ] [-d ] [-t ][-c [-c ] ...][-e|--es ...][--ez ...][-e|--ei ...][-n ] [-f ] []启动的⽅法为复制代码代码如下:# am start -n 包(package)名/活动(activity)全路径查看包中每个activity的全路径的⽅法: 1、安装并启动“固件⼯具箱” 2、进⼊“App manager”,显⽰系统中所有安装程序,长按想通过命令⾏启动的程序。

3、弹出的窗⼝中选择"Advanced Freeze",该程序所有的activity就会全部显⽰出来 activity有两种显⽰格式,⼀种直接显⽰全路径,另⼀种在括号⾥显⽰相对路径,相对路径加上包名即是全路径。

Android 5.0 Camera系统源码分析(1):CameraService启动流程

Android 5.0 Camera系统源码分析(1):CameraService启动流程

Android 5.0 Camera系统源码分析(1):CameraService启动流程1. 前言本文将分析Android系统源码,从frameworks层到hal层,暂不涉及app层和kernel层。

由于某些函数比较复杂,在贴出代码时会适当对其进行简化。

本文属于自己对源码的总结,仅仅是贯穿代码流程,不会深入分析各个细节。

分析android系统源码,需要对android系统的某些知识点有所了解2. frameworks层Android的各个子模块的启动都是从它们的Service的启动开始的,所以我们将从CameraService的启动开始分析。

CameraService的启动就在MediaServer的main函数中,代码路径在:frameworks/av/media/mediaserver/main_mediaserver.cpp[cpp] view plain copyint main(int argc __unused, char** argv){......CameraService::instantiate();......}CameraService类定义如下:[cpp] view plain copyclass CameraService :public BinderService<CameraService>,public BnCameraService,public IBinder::DeathRecipient,public camera_module_callbacks_t{static char const* getServiceName() { return "media.camera"; }......}mediaserver的main函数中调用了CameraService的instantiate函数来创建实例,该函数的实现在其父类BinderService中实现[cpp] view plain copytemplate<typename SERVICE>class BinderService{static status_t publish(bool allowIsolated = false) {sp<IServiceManager> sm(defaultServiceManager());return sm->addService(String16(SERVICE::getServiceName()),new SERVICE(), allowIsolated);}static void instantiate() { publish(); }}1. instantiate函数只是简单的调用了publish函数2. publish函数先构造CameraService,再通过addService函数将它注册到ServiceManager当中,而getServiceName函数获取到的值为“media camera”。

Android 启动过程

Android 启动过程
restart_processes();
18) 基于 property_service 的事件句柄填充 poll event 结构体,用于后续 poll 操作。
if (!property_set_fd_init && get_property_set_fd() > 0) { ufds[fd_count].fd = get_property_set_fd(); ufds[fd_count].events = POLLIN; ufds[fd_count].revents = 0; fd_count++; property_set_fd_init = 1; }
7) 生成 “/dev/__null__” 虚拟设备(类似于 Linux 系统中的 /dev/null 设备)并将 stdin/stdout/stderr 三个文件重定向到 “/dev/__null__”
open_devnull_stdio();
8)
生成 ” /dev/__kmsg__” 虚拟设备用于记录 log。 Klog_init 实现文件: system/core//libcutils/klog.c
10) 从 “/proc/cmdline” 中读取内核命令行参数, 对应函数实现路径: platform/system/core/init/util.c
import_kernel_cmdline(0, import_kernel_nv);
11) 在第 10 步读取完 /proc/cmdline 中的参数后,修改此文件的权限,禁止非授权 用户操作此文件。
int main(int argc, char **argv) {
2) 基于 C 语言的风格,在函数入口处声明一些后续会使用的变量。

详解Android(安卓)手机系统启动过程

详解Android(安卓)手机系统启动过程

最近打算自己移植MIUI,所以自学了不少东西,分享一下,recovery刷机模式中启动到过程吧,一下所有内容均有我略读相关源码得到和总结得来,不一定完全正确,不对之处还望海涵:当我们只是按下电源键开机时,会进入正常启动模式。

Secondary stage bootloader 会从boot 分区开始启动。

Boot 分区的格式是固定的,首先是一个头部,然后是Linux 内核,最后是用作根文件系统的ramdisk。

当Linux 内核启动完毕后,就开始执行根文件系统中的init 程序,init 程序会读取启动脚本文件(init.rc 和init.goldfish)。

现在就来说一下,init.rc到底在做些什么,我会在附件上传有关init_rc脚本语法和自己阅读是坐下到笔记,希望对各位有所帮助。

1.on boot-pause2. exec sbin/chargerlogo #运行sbin/chargerlogo(此运行在内核目录下)3.4.on early-init5. start ueventd #调用sbin/uventd链接所指的可执行程序,其源码位于system/core/init/ueventd.c,为设备赋予权限6.7.on init #源码位于system/core/init/init.c8.#主要完成一下的工作9.#清空umask、创建并挂载一些基本的目录(/dev-设备、/proc-系统信息、/sys-系统信息、/dev/pts-终端控制字,用于执行adb、/dev/socket)10.11.sysclktz 0 #把硬件时钟当成本地时间(GMT时区)12.13.loglevel 3 #讲系统LOG设置成可见,0为(NONE)14.15. write /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor"performance"16.17.# setup the global environment 设置全局变量18. export PATH /sbin:/vendor/bin:/system/sbin:/system/bin:/system/xbin#PATH变量19. export LD_LIBRARY_PATH /vendor/lib:/system/lib #库20. export ANDROID_BOOTLOGO 121. export ANDROID_CACHE /cache #cache目录22. export ANDROID_ROOT /system #安卓系统root分区-->/system23. export ANDROID_ASSETS /system/app #安卓系统可访问到-->/system/app(这就是为什么没有root权限不能删除/system/app下到文件)24. export ANDROID_DATA /data #安卓data区25. export DOWNLOAD_CACHE /cache/download #下载缓存为/cache/download26. export EXTERNAL_STORAGE /mnt/sdcard #附加存储-->sdcard卡27. export ASEC_MOUNTPOINT /mnt/asec #asec根文件目录28. export LOOP_MOUNTPOINT /mnt/obb29. export SD_EXT_DIRECTORY /sd-ext #sdcard挂载格式30. export BOOTCLASSPATH/system/framework/core.jar:/system/framework/bouncycastle.jar:/system/f ramework/ext.jar:/system/framework/framework.jar:/system/framework/andr oid.policy.jar:/system/framework/services.jar:/system/framework/core-ju nit.jar #bootclasspath31. export DSP_PATH /system/lib/dsp #dsp(数字信号处理器) path32. export DEFAULT_BASEIMAGE /system/lib/dsp/baseimage.dof33. export QOSDYN_FILE /system/lib/dsp/qosdyn_3430.dll64P34.35.# Backward compatibility #反向兼容,确保对以前版本到兼容?(不缺定)36. symlink /system/etc /etc #在/etc下创建链接到/system/etc到链接37. symlink /sys/kernel/debug /d38.39.# Right now vendor lives on the same filesystem as system,40.# but someday that may change.41. symlink /system/vendor /vendor42.43.# create mountpoints44. mkdir /mnt 0775 root system45. #给system赋予0775的权限,也就是rwx-rwx-rw-现在详细解释如下46. #此权限数值对应为:47. #u(用户):r(读)-w(写)-x(执行)48. #g(群组):r(读)-w(写)-x(执行)49. #0(其他):r(读)-w(写)-50. #对应到2进制数值为:51. #1 1 1 :111 ---752. #1 1 1 :111 ---753. #1 1 0 :110 ---554. #55. mkdir /mnt/sdcard 0000 system system56.57.# Create cgroup mount point for cpu accounting #为cpu创建58. mkdir /acct59. mount cgroup none /acct cpuacct60. mkdir /acct/uid61.62.# Backwards Compat - XXX: Going away in G*63. symlink /mnt/sdcard /sdcard64.65. mkdir /system66. mkdir /data 0771 system system67. mkdir /cache 0771 system cache68. mkdir /config 0500 root root69.70. mkdir /sqlite_stmt_journals 01777 root root71. mount tmpfs tmpfs /sqlite_stmt_journals size=4m72.73. # Directory for putting things only root should see.#创建用于存放root用户才能可见到文件夹74. mkdir /mnt/secure 0700 root root75.76. # Directory for staging bindmounts #伺服器根文件目录77. mkdir /mnt/secure/staging 0700 root root78.79. # Directory-target for where the secure container80. # imagefile directory will be bind-mounted81. mkdir /mnt/secure/asec 0700 root root82.83. # Secure container public mount points.84. mkdir /mnt/asec 0700 root system85. mount tmpfs tmpfs /mnt/asec mode=0755,gid=100086.87. # Filesystem image public mount points.88. mkdir /mnt/obb 0700 root system89. mount tmpfs tmpfs /mnt/obb mode=0755,gid=100090.91. mkdir /sd-ext 0771 system system92.93. write /proc/sys/kernel/panic_on_oops 194. write /proc/sys/kernel/hung_task_timeout_secs 095. write /proc/cpu/alignment 496. write /proc/sys/kernel/sched_latency_ns 1000000097. write /proc/sys/kernel/sched_wakeup_granularity_ns 200000098. write /proc/sys/kernel/sched_compat_yield 199. write /proc/sys/kernel/sched_child_runs_first 0100.101.# Create cgroup mount points for process groups102. mkdir /dev/cpuctl103. mount cgroup none /dev/cpuctl cpu104. chown system system /dev/cpuctl105. chown system system /dev/cpuctl/tasks106. chmod 0777 /dev/cpuctl/tasks107. write /dev/cpuctl/cpu.shares 1024108.109. mkdir /dev/cpuctl/fg_boost110. chown system system /dev/cpuctl/fg_boost/tasks111. chmod 0777 /dev/cpuctl/fg_boost/tasks112. write /dev/cpuctl/fg_boost/cpu.shares 1024113.114. mkdir /dev/cpuctl/bg_non_interactive115. chown system system /dev/cpuctl/bg_non_interactive/tasks 116. chmod 0777 /dev/cpuctl/bg_non_interactive/tasks117. # 5.0 %118. write /dev/cpuctl/bg_non_interactive/cpu.shares 52119.120.#[LGE_start] hyunwoong.ahn121. mkdir /dvp 0771 system system122. mkdir /dvp/hwkey 0771 system system123. mkdir /dvp/userdata 0771 system system124.#[LGE_end] hyunwoong.ahn125.126. chown system system /sys/class/leds/lcd-backlight/als 127.128. # Increase readahead buffers on MMC devices129. write /sys/block/mmcblk0/bdi/read_ahead_kb 1024130. write /sys/block/mmcblk1/bdi/read_ahead_kb 1024131.132.on fs133.# mount mtd partitions134. # Mount /system rw first to give the filesystem a chance to save a checkpoint135. mount ext4 /dev/block/mmcblk0p8 /system ro noatime barrier=1 wait 136. # We chown/chmod /data again so because mount is run as root + defaults 137. mount ext4 /dev/block/mmcblk0p9 /data nosuid nodev noatime barrier=1 wait138. chown system system /data139. chmod 0771 /data140.141.#[LGE_star]Hyunwoong.ahn^M142. mount ext3 /dev/block/mmcblk0p6 /dvp/hwkey nosuid nodev143. chown system system /dvp/hwkey144. chown system divxdrm /dvp/hwkey/key.hw145. chmod 0660 /dvp/hwkey/key.hw146. mount ext3 /dev/block/mmcblk0p6 /dvp/userdata nosuid nodev147. chown system divxdrm /dvp/userdata148. chmod 0770 /dvp/userdata149. chown system system /dev/block/mmcblk0p5150. chown system system /dev/block/mmcblk0p12151. chmod 0777 /dev/block/mmcblk0p5152. chmod 0777 /dev/block/mmcblk0p12153.154. mount ext4 /dev/block/mmcblk0p10 /cache nosuid nodev noatime barrier=1 wait155.156. mkdir /lgdrm 0770 lgdrm lgdrm_acc157. mount ext3 /dev/block/mmcblk0p5 /lgdrm nosuid nodev158.159.160.161.162.163.on post-fs164.165. # once everything is setup, no need to modify /166. mount rootfs rootfs / ro remount167.168. # We chown/chmod /data again so because mount is run as root + defaults 169. chown system system /data170. chmod 0771 /data171.172. # Mount compressed filesystems173. mount squashfs loop@/system/lib/modules/modules.sqf/system/lib/modules ro174. mount squashfs loop@/system/xbin/xbin.sqf /system/xbin ro175.176. # Create dump dir and collect dumps.177. # Do this before we mount cache so eventually we can use cache for 178. # storing dumps on platforms which do not have a dedicated dump partition.179.180. mkdir /data/dontpanic181. chown root log /data/dontpanic182. chmod 0750 /data/dontpanic183.184. # Collect apanic data, free resources and re-arm trigger185. copy /proc/apanic_console /data/dontpanic/apanic_console186. chown root log /data/dontpanic/apanic_console187. chmod 0640 /data/dontpanic/apanic_console188.189. copy /proc/apanic_threads /data/dontpanic/apanic_threads190. chown root log /data/dontpanic/apanic_threads191. chmod 0640 /data/dontpanic/apanic_threads192.193. write /proc/apanic_console 1194.195. # Same reason as /data above196. chown system cache /cache197. chmod 0771 /cache198.199. # This may have been created by the recovery system with odd permissions 200. chown system cache /cache/recovery201. chmod 0770 /cache/recovery202.203. #change permissions on vmallocinfo so we can grab it from bugreports 204. chown root log /proc/vmallocinfo205. chmod 0440 /proc/vmallocinfo206.207. #change permissions on kmsg & sysrq-trigger so bugreports can grab kthread stacks208. chown root system /proc/kmsg209. chmod 0440 /proc/kmsg210. chown root system /proc/sysrq-trigger211. chmod 0220 /proc/sysrq-trigger212.213.# create basic filesystem structure214. mkdir /data/misc 01771 system misc215. mkdir /data/misc/bluetoothd 0770 bluetooth bluetooth216. mkdir /data/misc/bluetooth 0770 system system217. mkdir /data/misc/keystore 0700 keystore keystore218. mkdir /data/misc/vpn 0770 system system219. mkdir /data/misc/systemkeys 0700 system system220. mkdir /data/misc/vpn/profiles 0770 system system221. # give system access to wpa_supplicant.conf for backup and restore 222. mkdir /data/misc/wifi 0770 wifi wifi223. chmod 0770 /data/misc/wifi224. chmod 0660 /data/misc/wifi/wpa_supplicant.conf225. mkdir /data/local 0771 shell shell226. mkdir /data/local/tmp 0771 shell shell227. mkdir /data/local/download 0771 system cache228. mkdir /data/data 0771 system system229. mkdir /data/app-private 0771 system system230. mkdir /data/app 0771 system system231. mkdir /data/property 0700 root root232.233. mkdir /cache/download 0771 system cache234.235. # create dalvik-cache and double-check the perms236. mkdir /data/dalvik-cache 0771 system system237. chown system system /data/dalvik-cache238. chmod 0771 /data/dalvik-cache239.240. mkdir /cache/dalvik-cache 0771 system system241. chown system system /cache/dalvik-cache242. chmod 0771 /cache/dalvik-cache243.244. # create the lost+found directories, so as to enforce our permissions 245. mkdir /data/lost+found 0770246. mkdir /cache/lost+found 0770247.248. # double check the perms, in case lost+found already exists, and set owner249. chown root root /data/lost+found250. chmod 0770 /data/lost+found251. chown root root /cache/lost+found252. chmod 0770 /cache/lost+found253.254. # allow net_raw to have access to /dev/socket directory255. chown root net_raw /dev/socket256. chmod 0775 /dev/socket257.258. # allow system to modify cpufreq control files259. chown root system/sys/devices/system/cpu/cpu0/cpufreq/scaling_governor260. chmod 0664 /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor 261. chown root system/sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq262. chmod 0664 /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq 263. chown root system/sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq264. chmod 0664 /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq 265.266. chmod 0777 /data/misc/wifi/config_mac267. mkdir /data/misc/wifi/sockets 0770 wifi wifi268. mkdir /data/misc/dhcp 0777 dhcp dhcp269. setprop wifi.supplicant_scan_interval 20270. setprop wifi.interface wlan0271.272.on boot273.# basic network init274. ifup lo275. hostname localhost276. domainname localdomain277.278.# set RLIMIT_NICE to allow priorities from 19 to -20279. setrlimit 13 40 40280.281.# Define the oom_adj values for the classes of processes that can be 282.# killed by the kernel. These are used in ActivityManagerService. 283. setprop ro.FOREGROUND_APP_ADJ 0284. setprop ro.VISIBLE_APP_ADJ 1285. setprop ro.PERCEPTIBLE_APP_ADJ 2286. setprop ro.HEAVY_WEIGHT_APP_ADJ 3287. setprop ro.SECONDARY_SERVER_ADJ 4288. setprop ro.BACKUP_APP_ADJ 5289. setprop ro.HOME_APP_ADJ 6290. setprop ro.HIDDEN_APP_MIN_ADJ 7291. setprop ro.EMPTY_APP_ADJ 15292.293.# Define the memory thresholds at which the above process classes will 294.# be killed. These numbers are in pages (4k).295. setprop ro.FOREGROUND_APP_MEM 2048296. setprop ro.VISIBLE_APP_MEM 3072297. setprop ro.PERCEPTIBLE_APP_MEM 4096298. setprop ro.HEAVY_WEIGHT_APP_MEM 4096299. setprop ro.SECONDARY_SERVER_MEM 6144300. setprop ro.BACKUP_APP_MEM 6144301. setprop ro.HOME_APP_MEM 6144302. setprop ro.HIDDEN_APP_MEM 7168303. setprop ro.EMPTY_APP_MEM 8192304.305.# Write value must be consistent with the above properties.306.# Note that the driver only supports 6 slots, so we have combined some of 307.# the classes into the same memory level; the associated processes of higher 308.# classes will still be killed first.309. write /sys/module/lowmemorykiller/parameters/adj 0,1,2,4,7,15310.311. write /proc/sys/vm/overcommit_memory 1312. write /proc/sys/vm/min_free_order_shift 4313. write /sys/module/lowmemorykiller/parameters/minfree 2048,3072,4096,6144,7168,8192314.315. # Set init its forked children's oom_adj.316. write /proc/1/oom_adj -16317.318. # Tweak background writeout319. write /proc/sys/vm/dirty_expire_centisecs 200320. write /proc/sys/vm/dirty_background_ratio 5321.322. # Permissions for System Server and daemons.323. chown radio system /sys/android_power/state324. chown radio system /sys/android_power/request_state325. chown radio system /sys/android_power/acquire_full_wake_lock 326. chown radio system /sys/android_power/acquire_partial_wake_lock 327. chown radio system /sys/android_power/release_wake_lock328. chown radio system /sys/power/state329. chown radio system /sys/power/wake_lock330. chown radio system /sys/power/wake_unlock331. chmod 0660 /sys/power/state332. chmod 0660 /sys/power/wake_lock333. chmod 0660 /sys/power/wake_unlock334. chown system system /sys/class/timed_output/vibrator/enable335. chown system system /sys/class/leds/keyboard-backlight/brightness 336. chown system system /sys/class/leds/lcd-backlight/brightness 337. chown system system /sys/class/leds/button-backlight/brightness 338. chown system system /sys/class/leds/jogball-backlight/brightness 339. chown system system /sys/class/leds/red/brightness340. chown system system /sys/class/leds/green/brightness341. chown system system /sys/class/leds/blue/brightness342. chown system system /sys/class/leds/red/device/grpfreq343. chown system system /sys/class/leds/red/device/grppwm344. chown system system /sys/class/leds/red/device/blink345. chown system system /sys/class/leds/red/brightness346. chown system system /sys/class/leds/green/brightness347. chown system system /sys/class/leds/blue/brightness348. chown system system /sys/class/leds/red/device/grpfreq349. chown system system /sys/class/leds/red/device/grppwm350. chown system system /sys/class/leds/red/device/blink351. chown system system /sys/class/timed_output/vibrator/enable352. chown system system /sys/module/sco/parameters/disable_esco353. chown system system /sys/kernel/ipv4/tcp_wmem_min354. chown system system /sys/kernel/ipv4/tcp_wmem_def355. chown system system /sys/kernel/ipv4/tcp_wmem_max356. chown system system /sys/kernel/ipv4/tcp_rmem_min357. chown system system /sys/kernel/ipv4/tcp_rmem_def358. chown system system /sys/kernel/ipv4/tcp_rmem_max359. chown root radio /proc/cmdline360.361.# Define TCP buffer sizes for various networks362.# ReadMin, ReadInitial, ReadMax, WriteMin, WriteInitial, WriteMax, 363. setprop net.tcp.buffersize.default4096,87380,110208,4096,16384,110208364. setpropnet.tcp.buffersize.wifi 4095,87380,110208,4096,16384,110208365. setpropnet.tcp.buffersize.umts 4094,87380,110208,4096,16384,110208366. setprop net.tcp.buffersize.edge 4093,26280,35040,4096,16384,35040 367. setpropnet.tcp.buffersize.hspa 4094,87380,110208,4096,16384,110208368. setprop net.tcp.buffersize.gprs 4092,8760,11680,4096,8760,11680 369.370. chmod 0660 /sys/class/rfkill/rfkill0/state371. chmod 0660 /sys/class/rfkill/rfkill0/type372. chmod 0660 /sys/class/rfkill/rfkill1/state373. chmod 0660 /sys/class/rfkill/rfkill1/type374. chmod 0666 /sys/devices/platform/bd_address/bdaddr_if375. chown bluetooth bluetooth /sys/class/rfkill/rfkill0/state376. chown bluetooth bluetooth /sys/class/rfkill/rfkill0/type377. chown bluetooth bluetooth /sys/class/rfkill/rfkill1/state378. chown bluetooth bluetooth /sys/class/rfkill/rfkill1/type379. write /sys/class/rfkill/rfkill0/state 0380.381. chown system system /sys/devices/platform/motion_sensor/accel_onoff 382. chown system system /sys/devices/platform/motion_sensor/accel_delay 383. chown system system /sys/devices/platform/motion_sensor/compass_onoff 384. chown system system /sys/devices/platform/motion_sensor/compass_delay 385. chown system system /sys/devices/platform/motion_sensor/tilt_onoff 386. chown system system /sys/devices/platform/motion_sensor/tilt_delay 387. chown system system /sys/devices/platform/motion_sensor/gyro_onoff 388. chown system system /sys/devices/platform/motion_sensor/gyro_delay 389. chown system system /sys/bus/i2c/drivers/hub_proxi/3-0044/onoff 390. chown system system /sys/bus/i2c/drivers/hub_proxi/3-0044/delay 391. chown system system /sys/devices/platform/motion_sensor/shake_onoff 392. chown system system /sys/bus/i2c/drivers/kxtf9/3-000f/shake_onoff 393. chown system system /sys/devices/platform/motion_sensor/snap_onoff 394. chown system system /sys/bus/i2c/drivers/kxtf9/3-000f/snap_onoff 395. chown system system /sys/devices/platform/motion_sensor/flip_onoff 396. chown system system /sys/bus/i2c/drivers/kxtf9/3-000f/flip_onoff 397. chown system system /sys/devices/platform/motion_sensor/tap_onoff 398. chown system system /sys/bus/i2c/drivers/kxtf9/3-000f/tap_onoff 399. chown system system/sys/devices/platform/motion_sensor/yawimage_onoff400. chown system system/sys/devices/platform/i2c-gpio.7/i2c-adapter/i2c-7/7-001c/checkresult 401. chown system system/sys/devices/platform/i2c-gpio.7/i2c-adapter/i2c-7/7-001c/checkopmode 402. chmod 0666 /sys/devices/platform/motion_sensor/accel_onoff403. chmod 0666 /sys/devices/platform/motion_sensor/accel_delay404. chmod 0666 /sys/devices/platform/motion_sensor/compass_onoff 405. chmod 0666 /sys/devices/platform/motion_sensor/compass_delay 406. chmod 0666 /sys/devices/platform/motion_sensor/tilt_onoff407. chmod 0666 /sys/devices/platform/motion_sensor/tilt_delay408. chmod 0666 /sys/devices/platform/motion_sensor/gyro_onoff409. chmod 0666 /sys/devices/platform/motion_sensor/gyro_delay410. chmod 0666 /sys/bus/i2c/drivers/hub_proxi/3-0044/onoff411. chmod 0666 /sys/bus/i2c/drivers/hub_proxi/3-0044/delay412. chmod 0666 /sys/devices/platform/motion_sensor/shake_onoff413. chmod 0666 /sys/bus/i2c/drivers/kxtf9/3-000f/shake_onoff414. chmod 0666 /sys/devices/platform/motion_sensor/snap_onoff415. chmod 0666 /sys/bus/i2c/drivers/kxtf9/3-000f/snap_onoff416. chmod 0666 /sys/devices/platform/motion_sensor/flip_onoff417. chmod 0666 /sys/bus/i2c/drivers/kxtf9/3-000f/flip_onoff418. chmod 0666 /sys/devices/platform/motion_sensor/tap_onoff419. chmod 0666 /sys/bus/i2c/drivers/kxtf9/3-000f/tap_onoff420. chmod 0666 /sys/devices/platform/motion_sensor/yawimage_onoff 421. chmod 0666/sys/devices/platform/i2c-gpio.7/i2c-adapter/i2c-7/7-001c/checkresult 422. chmod 0666/sys/devices/platform/i2c-gpio.7/i2c-adapter/i2c-7/7-001c/checkopmode 423.424. chmod 0666 /sys/devices/platform/omapdss/display0/name425. chmod 0666 /sys/devices/platform/omapdss/display1/name426. chmod 0666 /sys/devices/platform/omapdss/display0/enabled427. chmod 0666 /sys/devices/platform/omapdss/display1/enabled428. chmod 0666 /sys/devices/platform/omapdss/display0/timings429. chmod 0666 /sys/devices/platform/omapdss/display1/timings430. chmod 0666 /sys/devices/platform/omapdss/overlay0/manager431. chmod 0666 /sys/devices/platform/omapdss/overlay1/manager432. chmod 0666 /sys/devices/platform/omapdss/overlay2/manager433. chmod 0666 /sys/devices/platform/omapdss/overlay0/zorder434. chmod 0666 /sys/devices/platform/omapdss/overlay1/zorder435. chmod 0666 /sys/devices/platform/omapdss/overlay2/zorder436. chmod 0666 /sys/devices/platform/omapdss/overlay0/enabled437. chmod 0666 /sys/devices/platform/omapdss/overlay1/enabled438. chmod 0666 /sys/devices/platform/omapdss/overlay2/enabled439. chmod 0666 /sys/devices/platform/omapdss/manager0/display440. chmod 0666 /sys/devices/platform/omapdss/manager1/display441. chmod 0666 /sys/devices/platform/omapdss/manager0/trans_key_enabled 442. chmod 0666 /sys/devices/platform/omapdss/manager1/trans_key_enabled 443. chmod 0666 /sys/devices/platform/omapdss/manager0/trans_key_type 444. chmod 0666 /sys/devices/platform/omapdss/manager1/trans_key_type 445. chmod 0666 /sys/devices/platform/omapdss/manager0/trans_key_value 446. chmod 0666 /sys/devices/platform/omapdss/manager1/trans_key_value 447. chmod 0666/sys/devices/platform/omapdss/manager0/alpha_blending_enabled448. chmod 0666/sys/devices/platform/omapdss/manager1/alpha_blending_enabled449. write /sys/devices/platform/omapdss/manager0/alpha_blending_enabled 1450.451.# MMS: Create log directory for fw3a_core452. mkdir /data/log/fw3A 0775 root root453.454.# change permissions for alsa nodes455. symlink /dev/snd/pcmC0D0c /dev/pcmC0D0c456. symlink /dev/snd/pcmC0D0p /dev/pcmC0D0p457. symlink /dev/snd/controlC0 /dev/controlC0458. symlink /dev/snd/timer /dev/timer459. chmod 0777 /dev/pcmC0D0c460. chmod 0777 /dev/pcmC0D0p461. chmod 0777 /dev/controlC0462. chmod 0777 /dev/timer463.464. chmod 0664/sys/devices/platform/i2c_omap.2/i2c-2/2-0060/leds/lcd-backlight/als 465. chown system system/sys/devices/platform/i2c_omap.2/i2c-2/2-0060/leds/lcd-backlight/als 466.467. # Batt gauge error detection468. chmod 0666/sys/bus/platform/drivers/twl4030_bci/twl4030_bci/gauge_if469.470. # Enabling sleep in idle path471. write /sys/power/sleep_while_idle 1472.473. # Enabling Off mode474. write /sys/power/enable_off_mode 1475.476. # Enabling voltage off while idle477. write /sys/power/voltage_off_while_idle 1478.479. # Permissions for setting the DSP Frequency480. chown media root /sys/power/dsp_freq481. chown media system /sys/devices/platform/omap3isp/isp_reserve 482.483.# Include extra init file484. import /system/etc/init.local.rc485.486.# gps permissions487. chown system system /sys/devices/platform/hub_gps_gpio/poweron 488. chown system system /sys/devices/platform/hub_gps_gpio/reset 489. mkdir /data/gps490. chmod 777 /data/gps491. mkdir /data/gps/var492. chmod 777 /data/gps/var493. mkdir /data/gps/var/run494. chmod 777 /data/gps/var/run495. mkdir /data/gps/log496. chmod 777 /data/gps/log497. mkdir /data/cache498. chmod 777 /data/cache499.500. ## Torch perms501. chown system camera /sys/class/leds/rt8515/brightness502. chmod 0660 /sys/class/leds/rt8515/brightness503.504. ## liblights505. chown system system /sys/class/leds/lcd-backlight/brightness 506. chown system system /sys/class/leds/lcd-backlight/onoff 507. chown system system/sys/devices/platform/i2c_omap.2/i2c-2/2-001a/led_brightness 508. chown system system/sys/devices/platform/i2c_omap.2/i2c-2/2-001a/led_onoff509. chown system system/sys/devices/platform/i2c_omap.2/i2c-2/2-001a/led_sync510. chown system system/sys/devices/platform/i2c_omap.2/i2c-2/2-001a/blink_enable511. chown system system/sys/devices/platform/i2c_omap.2/i2c-2/2-001a/0x06512. chown system system/sys/devices/platform/i2c_omap.2/i2c-2/2-001a/0x07513. chown system system/sys/devices/platform/i2c_omap.2/i2c-2/2-001a/0x0D514. chown system system/sys/devices/platform/i2c_omap.2/i2c-2/2-001a/0x0E515. chown system system/sys/devices/platform/i2c_omap.2/i2c-2/2-001a/0x10 516. chown system system/sys/devices/platform/i2c_omap.2/i2c-2/2-001a/0x11 517. chown system system/sys/devices/platform/i2c_omap.2/i2c-2/2-001a/0x03 518. chown system system/sys/devices/platform/i2c_omap.2/i2c-2/2-001a/0x04 519. chown system system/sys/devices/platform/i2c_omap.2/i2c-2/2-001a/0x09 520. chown system system/sys/devices/platform/i2c_omap.2/i2c-2/2-001a/0x0A 521. chown system system/sys/devices/platform/i2c_omap.2/i2c-2/2-001a/0x13 522. chown system system/sys/devices/platform/i2c_omap.2/i2c-2/2-001a/0x14 523.524.# Run sysinit525. exec /system/bin/sysinit526.527. class_start default528.529.## Daemon processes to be run by init.530.##531.service ueventd /sbin/ueventd532. critical533.534.service prb /sbin/prb535. user root536. disabled537. oneshot538. keycodes 114 116539.540.service console /system/bin/sh541. console542. disabled543. user shell544. group log545.546.on property:ro.secure=0547. start console548.549.# adbd is controlled by the persist.service.adb.enable system property 550.service adbd /sbin/adbd551. disabled552.553.# adbd on at boot in emulator554.on property:ro.kernel.qemu=1555. start adbd556.557.on property:persist.service.adb.enable=1558. start adbd559.560.on property:persist.service.adb.enable=0561. stop adbd562.563.service pvrsrvinit /system/bin/pvrsrvinit564. user root565. oneshot566.567.# load DSP firmware 防火墙568.service baseimage /system/bin/cexec.out /system/lib/dsp/baseimage.dof 569. user root570. group audio571. oneshot572.573.service fw3a /system/bin/fw3a_core --dbgport=6660 --dbgremote --dbgpath=/data/log/fw3A574. user root575. group root576.577.service servicemanager /system/bin/servicemanager578. user system579. critical580. onrestart restart zygote581. onrestart restart media582.583.service vold /system/bin/vold584. socket vold stream 0660 root mount585. ioprio be 2586.587.service netd /system/bin/netd588. socket netd stream 0660 root system589. socket dnsproxyd stream 0660 root inet590.591.service debuggerd /system/bin/debuggerd592.593.service ril-daemon /system/bin/rild594. socket rild stream 660 root radio595. socket rild-debug stream 660 radio system596. user root597. group radio cache inet misc audio sdcard_rw net_admin net_raw 598.599.service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server600. socket zygote stream 666601. onrestart write /sys/android_power/request_state wake602. onrestart write /sys/power/state on603. onrestart restart media604. onrestart restart netd605.606.service media /system/bin/mediaserver607. user media608. group system audio camera graphics inet net_bt net_bt_admin net_raw 609. ioprio rt 4610.611.service bootanim /system/bin/bootanimation612. user graphics613. group graphics614. disabled615. oneshot616.617.service dbus /system/bin/dbus-daemon --system --nofork618. socket dbus stream 660 bluetooth bluetooth619. user bluetooth620. group bluetooth net_bt_admin621.622.service bluetoothd /system/bin/bluetoothd -n623. socket bluetooth stream 660 bluetooth bluetooth624. socket dbus_bluetooth stream 660 bluetooth bluetooth625. # init.rc does not yet support applying capabilities, so run as root and626. # let bluetoothd drop uid to bluetooth with the right linux capabilities 627. group bluetooth net_bt_admin misc628. disabled629.630.service hfag /system/bin/sdptool add --channel=10 HFAG631. user bluetooth。

Android系统初始化开始位置及流程分析

Android系统初始化开始位置及流程分析

#040
#041 /* We must have some place other than / to create the
#042 * device nodes for kmsg and null, otherwise we won't
#043 * be able to remount / read-only later on.
这段代码是获取当前android系统运行的硬件信息,比如硬件的CPU名称。主要从/proc/cpuinfo里读到相关的信息。
#061 snprintf(tmp, sizeof(tmp), "/init.%s.rc", hardware);
#062 parse_config_file(tmp);
这段代码是分析根目录下面的init.rc配置文件,并且把里面的参数组成链表的方式,以便后面使用,后面再来仔细地分析init.rc文件的格式和内容。
#055
#056 /* pull the kernel commandline and ramdisk properties file in */
Kernel command line: noinitrd root=/dev/nfs console=ttySAC0 init=/init nfsroot=192.168.1.103:/nfsboot ip=192.168.1.20:192.168.1.103:192.168.1.1:255.255.255.0::eth0:on
#057 qemu_init();
这里初始化qemu模拟器运行计数,这里是指模拟ARM指令的虚拟系统。
#058 import_kernel_cmdline(0);
这段代码是从linux内核里获取引导系统给内核的引导参数,并保存到全局变量,以便使用。

android应用程序的运行原理

android应用程序的运行原理

Android应用程序的运行原理1. 概述Android应用程序的运行原理是指Android操作系统中应用程序是如何被加载、启动和执行的过程。

理解Android应用程序的运行原理对于开发高质量的应用程序以及解决性能问题至关重要。

2. Android应用程序的生命周期Android应用程序的生命周期可以分为以下几个阶段: - 创建(Creating):当应用程序被创建时,系统会调用应用程序的onCreate()方法。

在这个阶段,应用程序还没有可见的用户界面。

- 开始(Starting):应用程序从创建阶段转移到开始阶段时,系统会调用onStart()方法。

在这个阶段,应用程序已经可见,但用户不能与其进行交互。

- 恢复(Resuming):当应用程序从后台恢复到前台时,系统会调用onResume()方法。

在这个阶段,用户可以与应用程序进行交互。

- 暂停(Pausing):当用户离开应用程序或者有其他应用程序覆盖在其上时,应用程序会进入暂停阶段,系统会调用onPause()方法。

- 停止(Stopping):当应用程序完全不可见时,系统会调用onStop()方法。

- 销毁(Destroying):当用户关闭应用程序或者系统需要释放资源时,系统会调用onDestroy()方法。

3. Android应用程序的启动过程Android应用程序的启动过程可以分为以下几个步骤:- 应用程序的图标点击:当用户点击应用程序的图标时,系统会通过包管理器找到对应的应用程序,并启动它。

- 应用程序进程的创建:系统会为该应用程序创建一个新的进程,并为其分配资源。

- 应用程序的初始化:系统会调用应用程序的onCreate()方法,进行一些初始化工作,例如加载布局、注册事件监听器等。

- 启动主活动(MainActivity):系统会找到应用程序的主活动,并调用其onCreate()、onStart()和onResume()方法,最终将主活动显示在屏幕上。

Android开机启动流程

Android开机启动流程

Android启动流程
• 第四步 Home启动
在ServerThread@SystemServer.java后半段,我们可以看到系统在启 动完所有的Android服务后,做了这样一些动作: (1) 使用xxx.systemReady()通知各个服务,系统已经就绪。 (2) 特别对于ActivityManagerService.systemReady(回调) Widget.wallpaper,imm(输入法)等ready通知。 Home就是在ActivityManagerService.systemReady()通知的过程中建 立的。下面是ActivityManagerService.systemReady()的伪代码: systemReady()@ActivityManagerService.java resumeTopActivityLocked() startHomeActivityLocked();//如果是第一个则启动HomeActivity。 startActivityLocked(。。。)CATEGORY_HOME
Android启动流程
• 第二步 Zygote
Servicemanager和zygote进程就奠定了Android的基础。Zygote这个进程起来才会建立起真正的 Android运行空间,初始化建立的Service都是Navtive service.在.rc脚本文件中zygote的描述: service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server 所以Zygote从main(…)@frameworks/base/cmds/app_main.cpp开始。 (1) main(…)@frameworks/base/cmds/app_main.cpp 建立Java Runtime runtime.start("com.android.internal.os.ZygoteInit", startSystemServer); (2) runtime.start@AndroidRuntime.cpp 建立虚拟机 运行:com.android.internal.os.ZygoteInit:main函数。 (3)main()@com.android.internal.os.ZygoteInit//真正的Zygote。 registerZygoteSocket();//登记Listen端口 startSystemServer(); 进入Zygote服务框架。 经过这几个步骤,Zygote就建立好了,利用Socket通讯,接收ActivityManangerService的请求, Fork应用程序。

Android_launcher源码全面分析

Android_launcher源码全面分析
<favorite //程序快捷键属性标签
launcher:className="com.apical.radio.radioMainActivity" //点击图标时,需要启动的类 launcher:packageName="com.apical.radio" launcher:screen="1" launcher:x="0" l0auncher:y="0" /> //该应用的包名 //第1屏,0-4屏共5屏 //图标X位置,左上角第一个为0,向左递增,0-4共5个 //图标Y位置,左上角第一个为0,向下递增,0-2共3个
Launcher默认是有5个分屏,不过这个可以配置。同样,每行每列有多少图标也是可以配置 的。这里按我修改的是3行5列的界面排布(对应上面的效果图)。 一般配置APP的快捷方式,使用上面的属性标签就可以。
<appwidget //插件
launcher:className="de.dnsproject.clock_widget_main.Clock1AppWidgetProvider" //该应用的类 launcher:packageName="de.dnsproject.clock_widget_main" launcher:screen="1" launcher:x="2" launcher:y="1" launcher:spanX="3" launcher:spanY="2" /> //第1屏,0-4屏共5屏 //图标X位置,左上角第一个为0,向左递增,0-4共5个 //图标Y位置,左上角第一个为0,向下递增,0-2共3个 //在x方向上所占格数 //在y方向上所占格数 //该应用的包名

android系统启动过程(1)

android系统启动过程(1)

1Android系统的启动过程1.1启动过程Android系统完整的启动过程,可分为Linux系统层、Android系统服务层、Zygote进程模型三个阶段,从开机到启动Home Launcher完成具体的任务细节可分为七个步骤。

1.启动BootLoader2.加载系统内核3.启动Init和其它重要守护进程4.启动Zygote进程5.启动Runtime进程,初始化Service Manager。

Service Manager用于binder通讯,负责绑定服务的注册与查找。

6.启动SystemService7.启动Home Laucher8.启动其它应用程序1.1.1BootLoaderAndroid 系统是基于Linux操作系统的,所以它最初的启动过程和Linux一样。

当设备通电后首先执行BootLoader引导装载器,BootLoader是在操作系统内核运行之前运行的一段小程序。

通过这段小程序初始化硬件设备、建立内存空间映射图,从而将系统的软硬件环境引导进入合适的状态,以便为最终调用操作系统内核准备好正确的运行环境。

1.1.2启动Init和守护进程当系统内核加载完成之后,会首先启动Init守护进程,它是内核启动的第一个用户级进程,进程号永远是1。

当Init进程启动后,如(图1-1)它还负责启动其他的一些重要守护进程,主要包括:Usbd进程(USB Daemon):USB连接后台进程,负责管理USB连接。

adbd 进程(Android Debug Bridge Daemon):ADB连接后台进程,负责管理ADB连接。

debuggerd 进程(Debugger Daemon) :调试器后台进程,负责管理调试请求及调试过程。

rild进程(Radio Interface Layer Daemon):无线接口层后台进程,负责管理无线通信服务。

图1-1 Init和其它重要守护进程的启动,图片来源:http://www-igm.univ-mlv.fr/~dr/XPOSE2008/android/fonct.html1.1.3启动Zygote进程如(图1-2)所示,当Init进程和一些重要的守护进程启动完成之后,将启动Zygote 进程。

android4.4开机log分析

android4.4开机log分析

Android开机log分析1.分析开机log,一是可以理一下android启动流程,二是可以通过log定位错误,下面列举一些常见android程序发生错误时抛出的异常,查找关键字xxxException可以快速定位android层错误以及原因:ng.NullPointerException:空指针异常ng.ClassNotFoundException:找不到类抛出的异常ng.ArithmeticException:一个整数“除以零”时抛出的异常ng.ArrayIndexOutOfBoundsException:数组越界访问以后抛出的异常ng.IllegalArgumentException:传入非法参数抛出的异常ng.IllegalAccessException:当应用程序要调用一个类,但当前的方法即没有对该类的访问权限便会出现这个异常ng.SecturityException:安全异常。

由安全管理器抛出,用于指示违反安全情况的异常ng.RuntimeException运行时异常。

是所有Java虚拟机正常操作期间可以被抛出的异常的父类。

ng.NumberFormatException:字符串转换为数字异常:ng.StackOverflowError:堆栈溢出错误。

当一个应用递归调用的层次太深而导致堆栈溢出时抛出该错误。

ng.RuntimeExceptionng.OutOfMemoryError:内存不足错误。

当可用内存不足以让Java虚拟机分配给一个对象时抛出该错误。

ng.IOException:输入输出异常ng.AbstractMethodError:抽象方法错误。

当应用试图调用抽象方法时抛出。

ng.ClassFormatError:类格式错误。

当Java虚拟机试图从一个文件中读取Java类,而检测到该文件的内容不符合类的有效格式时抛出。

ng.InstantiationError:实例化错误。

Android启动过程

Android启动过程

1. Boot系统初始化,具体过程参见(system\core\init\Init.c)中的main函数,这时候,手机或者模拟器出现的画面是一个console,显示“ANDROID”msg。

2. 初始化成功后,就开始mounting系统,具体参见(system\core\mountd\Mountd.c) 中的main 函数。

3.接下来运行ndroidRuntime,并开始启动java虚拟机dalvikvm。

4. Java虚拟机启动成功后,开始系统初始化。

系统初始的第一步是用JNI方式实现的,对应java代码为(frameworks\base\services\java\com\android\server\SystemServer.java) init1(Native)函数,对应的JNI C++代码为(frameworks\base\core\jni\server\com_android_server_SystemServer.cpp),而实现的C++代码为(frameworks\base\cmds\system_server\library\ System_init.cpp) 中的system_init()函数。

5. system_init调用SurfaceFlinger,SurfaceFlinger的readyToRun()函数用BootAnimation来实现开机动画,这时候手机或者模拟器显示是一副背景图加一个动态的小机器人。

6. 系统初始化的第二步,将启动ServerThread进程,参见SystemServer.init2()。

ServerThread 将启动各种系统服务,如Power Manager、Activity Manager等等,具体参见ServerThread的run函数,ServerThread同在SystemServer.java中。

7.这之后的事,应该就是进入系统了。

Android 启动过程分析

Android 启动过程分析

Android 启动过程分析本文来自moko365的Jollen Chen老师的分析,网络一些文章还有加上个人理解。

不一一写明出处。

首先看看整体开机流程。

这个对于软件开发测试工作非常有用,特别是在项目初期的时候,通常出在驱动或者启动参数上面的问题比较多,比如关机充电,连接charger关机等问题。

一般开机过程大致可以分为三个大阶段:1. OS级别,由bootloader载入linux kernel后(注:bootloader和制造商有关,一般都是自己修改后的bootloader,大同小异,无外乎加载了自己的安全机制,我们可以用最常见的uboot来考虑),kernel开始初始化, 并载入built-in 的驱动程序。

Kernel完成开机后,载入init process,切换至user-space后,结束kernel 的循序过程(sequence),进入排程模式(process scheduling)。

2. Android-level,由init process 开始,读取init.rc,Native 服务启动,并启动重要的外部程序,例如:servicemanager、Zygote以及System Server。

3. Zygote-Mode,Zygote 启动完SystemServer 后,进入Zygote Mode,在Socket 等候命令。

随后,使用者将看到一个桌面环境(Home Screen)。

桌面环境由一个名为[Launcher]的应用程序负责提供。

注:Zygote干嘛用的?主要负责启动system server和执行android程序(APK)。

成功启动system server后会使用socket 方式监听(monitor android apps/prcesses)我们的image都包含什么?Bootloader,system(是Android镜像),data(用户数据/data),kernel(android linux kernel,基础OS,负责process 管理,HAL和一些系统程序),ramdisk(init装载,/system/init/init.c).关于开机时间长短问题,对于产品开机和关机时间长短,直接影响到用户的感受,所以我们需要对开机时间进行评估。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Android应用程序启动过程源代码分析分类:Android 2011-08-19 00:58 5447人阅读评论(40) 收藏举报前文简要介绍了Android应用程序的Activity的启动过程。

在Android系统中,应用程序是由Activity组成的,因此,应用程序的启动过程实际上就是应用程序中的默认Activity 的启动过程,本文将详细分析应用程序框架层的源代码,了解Android应用程序的启动过程。

在上一篇文章Android应用程序的Activity启动过程简要介绍和学习计划中,我们举例子说明了启动Android应用程序中的Activity的两种情景,其中,在手机屏幕中点击应用程序图标的情景就会引发Android应用程序中的默认Activity的启动,从而把应用程序启动起来。

这种启动方式的特点是会启动一个新的进程来加载相应的Activity。

这里,我们继续以这个例子为例来说明Android应用程序的启动过程,即MainActivity的启动过程。

MainActivity的启动过程如下图所示:点击查看大图下面详细分析每一步是如何实现的。

Step 1. Launcher.startActivitySafely在Android系统中,应用程序是由Launcher启动起来的,其实,Launcher本身也是一个应用程序,其它的应用程序安装后,就会Launcher的界面上出现一个相应的图标,点击这个图标时,Launcher就会对应的应用程序启动起来。

Launcher的源代码工程在packages/apps/Launcher2目录下,负责启动其它应用程序的源代码实现在src/com/android/launcher2/Launcher.java文件中:view plaincopy to clipboardprint?1./**2.* Default launcher application.3.*/4.public final class Launcher extends Activity5. implements View.OnClickListener, OnLongClickListener, LauncherModel.Callbacks, AllAppsView.Watcher {6.7. ......8.9. /**10. * Launches the intent referred by the clicked shortcut.11. *12. * @param v The view representing the clicked shortcut.13. */14. public void onClick(View v) {15. Object tag = v.getTag();16. if (tag instanceof ShortcutInfo) {17. // Open shortcut18. final Intent intent = ((ShortcutInfo) tag).intent;19. int[] pos = new int[2];20. v.getLocationOnScreen(pos);21. intent.setSourceBounds(new Rect(pos[0], pos[1],22. pos[0] + v.getWidth(), pos[1] + v.getHeight()));23. startActivitySafely(intent, tag);24. } else if (tag instanceof FolderInfo) {25. ......26. } else if (v == mHandleView) {27. ......28. }29. }30.31. void startActivitySafely(Intent intent, Object tag) {32. intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);33. try {34. startActivity(intent);35. } catch (ActivityNotFoundException e) {36. ......37. } catch (SecurityException e) {38. ......39. }40. }41.42. ......43.44.}1.<activity android:name=".MainActivity"2.android:label="@string/app_name">3.<intent-filter>4.<action android:name="android.intent.action.MAIN"/>5.<category android:name="UNCHER"/>6.</intent-filter>7.</activity>1.public class Activity extends ContextThemeWrapper2. implements LayoutInflater.Factory,3. Window.Callback, KeyEvent.Callback,4. OnCreateContextMenuListener, ComponentCallbacks {5.6. ......7.8.@Override9. public void startActivity(Intent intent) {10. startActivityForResult(intent, -1);11. }12.13. ......14.15.}1.public class Activity extends ContextThemeWrapper2. implements LayoutInflater.Factory,3. Window.Callback, KeyEvent.Callback,4. OnCreateContextMenuListener, ComponentCallbacks {5.6. ......7.8. public void startActivityForResult(Intent intent, int requestCode) {9. if (mParent == null) {10. Instrumentation.ActivityResult ar =11. mInstrumentation.execStartActivity(12. this, mMainThread.getApplicationThread(), mToken, this,13. intent, requestCode);14. ......15. } else {16. ......17. }18.19.20. ......21.22.}1.public class Instrumentation {2.3. ......4.5. public ActivityResult execStartActivity(6. Context who, IBinder contextThread, IBinder token, Activity target,7. Intent intent, int requestCode) {8. IApplicationThread whoThread = (IApplicationThread) contextThread;9. if (mActivityMonitors != null) {10. ......11. }12. try {13. int result = ActivityManagerNative.getDefault()14. .startActivity(whoThread, intent,15. intent.resolveTypeIfNeeded(who.getContentResolver()),16. null, 0, token, target != null ? target.mEmbeddedID : null,17. requestCode, false, false);18. ......19. } catch (RemoteException e) {20. }21. return null;22. }23.24. ......25.26.}1.class ActivityManagerProxy implements IActivityManager2.{3.4. ......5.6. public int startActivity(IApplicationThread caller, Intent intent,7. String resolvedType, Uri[] grantedUriPermissions, int grantedMode,8. IBinder resultTo, String resultWho,9. int requestCode, boolean onlyIfNeeded,10. boolean debug) throws RemoteException {11. Parcel data = Parcel.obtain();12. Parcel reply = Parcel.obtain();13. data.writeInterfaceToken(IActivityManager.descriptor);14. data.writeStrongBinder(caller != null ? caller.asBinder() : null);15. intent.writeToParcel(data, 0);16. data.writeString(resolvedType);17. data.writeTypedArray(grantedUriPermissions, 0);18. data.writeInt(grantedMode);19. data.writeStrongBinder(resultTo);20. data.writeString(resultWho);21. data.writeInt(requestCode);22. data.writeInt(onlyIfNeeded ? 1 : 0);23. data.writeInt(debug ? 1 : 0);24. mRemote.transact(START_ACTIVITY_TRANSACTION, data, reply, 0);25. reply.readException();26. int result = reply.readInt();27. reply.recycle();28. data.recycle();29. return result;30. }31.32. ......33.34.}1.public final class ActivityManagerService extends ActivityManagerNative2. implements Watchdog.Monitor, BatteryStatsImpl.BatteryCallback {3.4. ......5.6. public final int startActivity(IApplicationThread caller,7. Intent intent, String resolvedType, Uri[] grantedUriPermissions,8. int grantedMode, IBinder resultTo,9. String resultWho, int requestCode, boolean onlyIfNeeded,10. boolean debug) {11. return mMainStack.startActivityMayWait(caller, intent, resolvedType,12. grantedUriPermissions, grantedMode, resultTo, resultWho,13. requestCode, onlyIfNeeded, debug, null, null);14. }15.16.17. ......18.19.}1.public class ActivityStack {2.3. ......4.5. final int startActivityMayWait(IApplicationThread caller,6. Intent intent, String resolvedType, Uri[] grantedUriPermissions,7. int grantedMode, IBinder resultTo,8. String resultWho, int requestCode, boolean onlyIfNeeded,9. boolean debug, WaitResult outResult, Configuration config) {10.11. ......12.13. boolean componentSpecified = intent.getComponent() != null;14.15. // Don't modify the client's object!16. intent = new Intent(intent);17.18. // Collect information about the target of the Intent.19. ActivityInfo aInfo;20. try {21. ResolveInfo rInfo =22. AppGlobals.getPackageManager().resolveIntent(23. intent, resolvedType,24. PackageManager.MATCH_DEFAULT_ONLY25. | ActivityManagerService.STOCK_PM_FLAGS);26. aInfo = rInfo != null ? rInfo.activityInfo : null;27. } catch (RemoteException e) {28. ......29. }30.31. if (aInfo != null) {32. // Store the found target back into the intent, because now that33. // we have it we never want to do this again. For example, if the34. // user navigates back to this point in the history, we should35. // always restart the exact same activity.36. intent.setComponent(new ComponentName(37. aInfo.applicationInfo.packageName, ));38. ......39. }40.41. synchronized (mService) {42. int callingPid;43. int callingUid;44. if (caller == null) {45. ......46. } else {47. callingPid = callingUid = -1;48. }49.50. mConfigWillChange = config != null51. && mService.mConfiguration.diff(config) != 0;52.53. ......54.55. if (mMainStack && aInfo != null &&56. (aInfo.applicationInfo.flags&ApplicationInfo.FLAG_CANT_SAVE_STATE) != 0) {57.58. ......59.60. }61.62. int res = startActivityLocked(caller, intent, resolvedType,63. grantedUriPermissions, grantedMode, aInfo,64. resultTo, resultWho, requestCode, callingPid, callingUid,65. onlyIfNeeded, componentSpecified);66.67. if (mConfigWillChange && mMainStack) {68. ......69. }70.71. ......72.73. if (outResult != null) {74. ......75. }76.77. return res;78. }79.80. }81.82. ......83.84.}1. ActivityInfo aInfo;2. try {3.ResolveInfo rInfo =4.AppGlobals.getPackageManager().resolveIntent(5. intent, resolvedType,6. PackageManager.MATCH_DEFAULT_ONLY7. | ActivityManagerService.STOCK_PM_FLAGS);8.aInfo = rInfo != null ? rInfo.activityInfo : null;9. } catch (RemoteException e) {10. ......11. }接下去就调用startActivityLocked进一步处理了。

相关文档
最新文档