android130 android启动
Android的编译环境只支持Linux和Mac OS,google推荐使用64位操作系统, ### android启动 > #### 当引导程序启动Linux内核后,会加载各种驱动和数据结构,当有了驱动以后,开始启动Android系统同时会加载用户级别的第一个进程init(system\core\init.c)代码如下: int main(int argc, char **argv)
{ // 创建文件夹 挂载
mount("tmpfs", "/dev", "tmpfs", , "mode=0755");
mkdir("/dev/pts", ); // 打卡日志
log_init(); INFO("reading config file\n");
// 加载init.rc配置文件
init_parse_config_file("/init.rc"); } > #### 加载init.rc文件,会启动一个Zygote进程,此进程是Android系统的一个母进程,用来启动Android的其他服务进程,代码: service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server
socket zygote stream
onrestart write /sys/android_power/request_state wake
onrestart write /sys/power/state on
onrestart restart media
onrestart restart netd > #### 从c++代码调到java代码: int main(int argc, const char* const argv[])
{
...
// Android运行时环境
AppRuntime runtime;
...
// Next arg is startup classname or "--zygote"
if (i < argc) {
arg = argv[i++];
if ( == strcmp("--zygote", arg)) {
bool startSystemServer = (i < argc) ?
strcmp(argv[i], "--start-system-server") == : false;
setArgv0(argv0, "zygote");
set_process_name("zygote");
// 启动java代码
runtime.start("com.android.internal.os.ZygoteInit",
... }
> #### ZygoteInit.java 代码: public static void main(String argv[]) {
try {
VMRuntime.getRuntime().setMinimumHeapSize( * * ); // 加载Android依赖的类
preloadClasses();
//cacheRegisterMaps();
preloadResources();
... if (argv[].equals("true")) {
// 启动系统服务
startSystemServer();
} else if (!argv[].equals("false")) {
...
} private static boolean startSystemServer()
...
args = new String[] {
"--setuid=1000",
"--setgid=1000",
"--setgroups=1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1018,3001,3002,3003,3006",
"--capabilities=130104352,130104352",
"--rlimit=8,",
"--runtime-init",
"--nice-name=system_server",
"com.android.server.SystemServer",
... /* Request to fork the system server process */
// 母进程开始分叉服务 启动SystemServer
pid = Zygote.forkSystemServer(
parsedArgs.uid, parsedArgs.gid,
parsedArgs.gids, debugFlags, rlimits,
parsedArgs.permittedCapabilities,
parsedArgs.effectiveCapabilities);
..
} > #### SystemServer.java 代码 public static void main(String[] args) {
...
// 加载jni库
System.loadLibrary("android_servers");
// 调用native方法
init1(args);
}
native public static void init1(String[] args); > #### SystemServer 对应的c++代码 com_android_server_SystemServer.cpp 代码如下: // 类似java的抽象方法
extern "C" int system_init(); static void android_server_SystemServer_init1(JNIEnv* env, jobject clazz)
{
// 转调
system_init();
} /*
* JNI registration.
*/
static JNINativeMethod gMethods[] = {
/* name, signature, funcPtr */
// 函数指针 把init1方法映射到android_server_SystemServer_init1
{ "init1", "([Ljava/lang/String;)V", (void*) android_server_SystemServer_init1 },
}; > #### system_init 的实现方法在System_init.cpp 代码如下: extern "C" status_t system_init()
{
...
// 启动硬件的服务
if (strcmp(propBuf, "") == ) {
// Start the SurfaceFlinger
SurfaceFlinger::instantiate();
} AndroidRuntime* runtime = AndroidRuntime::getRuntime(); LOGI("System server: starting Android services.\n");
// 启动完硬件服务后,又回到Systemserver的init2方法
runtime->callStatic("com/android/server/SystemServer", "init2");
...
} > #### SystemServer 的init2方法代码: public static final void init2() {
Slog.i(TAG, "Entered the Android system server!");
Thread thr = new ServerThread();
thr.setName("android.server.ServerThread");
thr.start();
}
> #### ServerThread的run方法: public void run() {
...
// 开启Android各种服务并且添加到ServiceManager去管理
Slog.i(TAG, "Device Policy");
devicePolicy = new DevicePolicyManagerService(context);
ServiceManager.addService(Context.DEVICE_POLICY_SERVICE, ottle = ...
// We now tell the activity manager it is okay to run third party
// code. It will call back into us once it has gotten to the state
// where third party code can really run (but before it has actually
// started launching the initial applications), for us to complete our
// initialization.
// 各种服务开启后调用ActivityManagerService.systemReady
((ActivityManagerService)ActivityManagerNative.getDefault())
.systemReady(new Runnable() {
public void run() {
Slog.i(TAG, "Making services ready"); > #### ActivityMangerService的systemReady的方法: public void systemReady(final Runnable goingCallback) {
...
// 打开第一个Activity
mMainStack.resumeTopActivityLocked(null);
}
} > #### ActivityStack的resumeTopActivityLocked方法 final boolean resumeTopActivityLocked(ActivityRecord prev) {
// Find the first activity that is not finishing.
// 没有已经打开的Activity next为 null
ActivityRecord next = topRunningActivityLocked(null); // Remember how we'll process this pause/resume situation, and ensure
// that the state is reset however we wind up proceeding.
final boolean userLeaving = mUserLeaving;
mUserLeaving = false; if (next == null) {
// There are no more activities! Let's just start up the
// Launcher... if (mMainStack) {
// 启动lucher应用的锁屏界面
return mService.startHomeActivityLocked();
}
} > #### Android系统启动完成,打开了Luncher应用的Home界面。
android130 android启动的更多相关文章
- android 启动模式介绍
Android启动模式 (1)Task:与Android系统是个多任务的系统中的任务是不同的.后者更倾向于多进程和多线程来说的,而这里的任务与application(应用程序)和activity(活动 ...
- 深入浅出 - Android系统移植与平台开发(四)- Android启动流程
作者:唐老师,华清远见嵌入式学院讲师. 一.Android init进程启动 还是从Linux的启动开始吧.Linux被bootloader加载到了内存之后,开始运行,在初始化完 Linux运行环境之 ...
- 深入浅出 - Android系统移植与平台开发(六)- 为Android启动加速
作者:唐老师,华清远见嵌入式学院讲师. Android的启动速度一直以来是他的诟病,虽然现在Android设备的硬件速度越来越快,但是随着新 版本的出现,其启动速度一直都比较慢,当然,作为程序员,我们 ...
- 解决android 启动白屏问题
Android 启动APP时黑屏白屏的三个解决方案 http://www.cnblogs.com/liqw/p/4263418.html android:windowSoftInputMode属性使用 ...
- Android 启动过程简析
首先我们先来看android构架图: android系统是构建在linux系统上面的. 所以android设备启动经历3个过程. Boot Loader,Linux Kernel & Andr ...
- Android 启动模拟器是出现“Failed to allocate memory: 8”错误提示的原因及解决办法
某天,Android 启动模拟器是出现“Failed to allocate memory: 8”错误,模拟器无法启动,如下图: 原因:设置了不正确AVD显示屏模式,4.0版默认的模式为WVGA800 ...
- 我的Android最佳实践之—— Android启动画面的实现方法
本文实例讲述了Android启动画面的实现方法.分享给大家供大家参考.具体分析如下: 在应用程序中经常用到启动画面,会启动一个后台线程为主程序的运行准备资源.Android要实现启动画面可以这样做: ...
- Android 核心分析 之八Android 启动过程详解
Android 启动过程详解 Android从Linux系统启动有4个步骤: (1) init进程启动 (2) Native服务启动 (3) System Server,Android服务启动 (4) ...
- Android启动过程以及各个镜像的关系
Android启动过程 Android在启动的时候,会由UBOOT传入一个init参数,这个init参数指定了开机的时候第一个运行的程序,默认就是init程序,这个程序在ramdisk.img中.可以 ...
随机推荐
- sencha touch tabsidebar 源码扩展
先上图看效果 没错,这是一个sencha touch 项目,而这里的右边推出效果(下文叫做tabsiderbar),使用插件tabsiderbar来扩展的. 插件js下载地址:http://www.m ...
- 陈正冲老师讲c语言之const关键字
1.const 关键字也许该被替换为 readolny const是constant的缩写,是恒定不变的意思,也翻译为常量.常数等.很不幸,正是因为这一点,很多人都认为被const修饰的值是常量.这是 ...
- 深入理解Arrays.sort()
两种方法: 1.类本来就实现java.lang.Comparable接口,使类本身就有比较能力.接口实现compareTo方法,次方法接收另一个Object为参数,如果当前对象小于参数则返回负值,如果 ...
- 统一Matlab下不同子图的色标colorbar
Reference:http://www.mathworks.com/matlabcentral/answers/100950-how-can-i-have-a-standard-colorbar-f ...
- TortoiseGit日常使用指南
本文在介绍了软件安装和设置后, 写了TortoiseGit 常用的一些功能, 包括:创建新库添加文件及文件夹创建分支看分支情况及修改log比较版本差异合并分支其他操作: Stash; 忽略文件本文不包 ...
- ASDL + WN725N 配置无线AP
1. ASDL 正常拨号上网 2. 安装TP-LINK无线客户端应用程序 打开之后选择模拟AP 如下图设置----应用 3. 本地连接----属性----高级 如下图设置 4. 宽带连接--- ...
- 利用文件实现Free Pascal中的简单排序功能
此程序主要是验证文件功能的读写功能,总结到的东西有:①文件无论是读还是写,都要先建立链接关系才可以进行;②读与写不能同时进行,必须分开操作,这也可以理解,在实际鼠标操作时也是如此的!③读写后必须用cl ...
- convert nocdb to cdb using dbms_pdb
convert nocdb to cdb using dbms_pdb 本文介绍将nocdb转换为cdb 环境介绍: ORACLE_HOME: /u01/app/oracle/product/12 ...
- [Tommas] 测试用例覆盖率(一)
一.测试用例的切面设计 所谓测试切面设计,其实就是测试用例大项的划分.测试用例划分的经典方法是瀑布模型,也就是从上到下,逐渐细分,大模块包括小模块,小模块包括更小的模块.但仅仅如此是不够的,我们还要从 ...
- 《零成本实现Web自动化测试--基于Selenium》 第五章 Selenium-RC
一. 简介 Selenium-RC可以适应更复杂的自动化测试需求,而不仅仅是简单的浏览器操作和线性执行.Selenium-RC能够充分利用编程语言来构建更复杂的自动化测试案例,例如读写文件.查询数据库 ...