`

android系统学习笔记三

阅读更多

第四章android的底层库和程序

知识点:

 

Android.mk的书写规则

android中增加可执行程序、动态库、和静态库的方法

Init.rc启动角本的使用方法

Binder机制的工作原理

使用binder在程序中构建IPC的方法

Android的系统进程

底层库和程序的结构

1增加本地程序和库的方法

要增加的库和程序跟路径没有关系,只和它们的android.mk文件有关系

Android.mkmakefile有所不同,android.mk主要包含一些系统公共有宏

android.mk中选项的路径

Build/core/config.mk

各个选项的默认值

Build/core/base_rulles.mk

 

编译程序

1android.mk中编译一个可执行程序的模板

#TestExe

LOCAL_PATH:=${callmy-dir}

Include${CLEAR_VARS}

LOCALL_SRC_FILES:=\main.c源文件(相对于当前的目录)

LOCAL_MODULE:=test_exe最终生成可执行文件的名称

 

#LOCAL_MODULE:=模块最终的名称

#LOCAL_C_INCLUDES:=需要包含的头文件路径

#LOCAL_STATIC_LIBRARIES:=需要连接的静态库(*.a)

#LOCLA_SHARED_LIBRARIES:=需要连接的动态库(*.so)

 

Include${BUILD_EXECUTABLE}以一个可执行程序的方式进行编译

2编译一个静态库(归档文件)的模版

#TestStaticlib

LOCAL_PATH=${callmy-dir}

Include${CLEAR_VARS}

LOCAL_SRC_FILES:=\helloworld.c

LOCAL_MODULE:=libtest_static最终生成静态库的名称是libtest_static.a

 

#LOCAL_C_INCLUDES:=

#LOCAL_STATIC_LIBRARIES:=

#LOCAL_SHARED_LIBRAIES:=

 

Include${BUILD_STATIC_LIBRARY}编议一个静态库

 

3android.mk中编译一个动态库(共享库)的模版

#Testsharedlib

LOCAL_PATH:=${calmy-dir}

Include${CLEAR_VARS}

 

LOCAL_SRC_FILES:=\helloworld.c

LOCAL_MODULE:=libtest_shared最终生成动态库文件的名称是libtest_shared.so

TARGET_PRELINK_MODULE:=false

 

#LOCAL_C_INCLUDES:=

#LOCAL_STATIC_LIBRARIED:=

#LOCAL_SHARED_LIBRARIES:=

 

Include${BUILD_SHARED_LIBRARY}编译动态库

 

注:android.mk中不需要对c源文件和c++源文件进行区分,统一加入LOCAL_SRC_FILES中即可

 

可执行程序、静态库和动态库生成的编译结果分别存放在以下的目录中:

Out/target/produce/generic/obj/EXECUTABLE

Out/target/product/generic/obj/STATIC_LIBRARY

Out/target/product/generic/obj/SHARED_LIBRARY

 

每个模块的目标文件夹分别为:

可执行程序:{xxx}_intermediates

静态库:{xxx}_static_intermediates

动态库:{xxx}_shared_intermediates

{xxx}为模块中LOCAL_MODULE中所定义的名称,可执行程序和动态库,一般在LINK子目录中是带有符号的库(没有经过符号剥离)

 

编译过程中,可以编译目标机的内容,也可以编译主机的内容

.以下是编译目标机内容

 

以下是编译主机的内容

 

Android.mk中可以指定最后的目标安装路径

LOCAL_MODULE_PATH目标路径

LOCAL_UNSTRIPPED_PATH没有经过符号剥离的目标路径

安装到不同的系统路径的方式:

LOCAL_MODULE_PATH:={TARGET_ROOT_OUT}

LOCAL_UNSTRIPPED_PATH:=${TARGET_ROOT_OUT_UNSTRIPPED}

TARGET_ROOT_OUT根文件系统

TARGET_OUTsystem文件系统(默认)如果不使用local_module_path指定路径

TARGET_OUT_DATA:data文件系统

 

安装程序

Android.mk中,进行目录和安装程序的示例

LOCAL_PATH:=${callmy-dir}

Include${CLEAR_VARS}

Copy_from:=\A.txt\B.txt将当前目录下的ab复制到system/text

Copy_to:=${addprefix${TRAGET_OUT}/txt,${copy_from}}

${copy_to}:PRIVATE_MODULE:=txt

${copy_to}:${TARGET_OUT}/txt/%:${LOCAL_PATH}/%|${ACP}

${transform-prebuilt-to-target}

ALL_PREBUILT=${copy_to}

 

DIRS:=${addprefix$(TARGET_OUT)/,\txt\}system目录下创建txt目录

${DIRS}:

@echoDirectory:$@

@mkdir-p$@

 

 

标准c/c++bionic

源码和头文件在以下的目录中:bionic/

Bionic支持标准c/c++库的绝大部分功能,支持数学库和NPTL线程库,实现了自已的Linkerloader,用于动态库的创建和加载

加入了log的底层支持,还实现了一套property系统,android全局变量的存储区域,是用共享内存的方式来实现

 

 

 

C语言工具库libcutils--本地最基础的库

工具库头文件的路径是:system/core/include/cutils

工具库源文件的路径:system/core/libcutils

工具库编译的结果:libcutils.so

 

工具库中主要头文件如下:

Ashmem.h匿名共享内存的接口

Atomic.h原子操作接口

Array.h定义一个可以动态改变大小的数组

Threads.h线程接口,定义线程和相关的互斥量

Sockets.handroid的套接字接口

Properties.handroid属性系统接口

Log.hlog的信息接口定义了logvlogdlogilogwloge

Mq.h消息对列接口

Hashmap.h定义哈希表的工具

 

数组功能分配内存来实现/dev/ashmem的驱动来实现

套接字linux标准的Socket来实现

线程调用标准的Posix线程pthread来实现

Log输出调用并连接liblog

 

 

Init可执行程序

Init进程是android启动后,系统执行的第一个程序,以守护进程的方式运行

功能:

设备管理

解析启动脚本init.rc

执行启动脚本的基本功能

执行启动脚本中的各种服务

 

Init进程的代码路径为:system/core/init

Init处理完一系列操作后,将进入一个循环(进行设备处理)parse_config_file("/init.rc")

Log的输出首先调用load_565rle_image()打开"/initlogo.rle"文件,通过写调用写framebuffer驱动程序的方式,输出到屏幕上

如果要使用开机画面,就需要构造一个“/initlogo.rle”文件,这是一个RGB565格式的纯数据文件.

设备管理的内容在device.*中定义,分为初始化阶段和运行阶段两部分,基本的处理过程是通过读取Linuxuevent事件,从而获取linux内核中发生的事件,然后进行创建设备节点

Device_init()的返回值在main函数中使用,进行pull操作,用于动态创建设备节点、删除设备节点

Make_device()用于动态创建文件系统中驱动的设备节点,主要调用mknod()函数

程序启动后将调用handle_device_event()函数,然后调用make_device()用于创建各个设备

Graphics子系统用于创建Framebuffer的设备节点,默认情况下是在/dev.android

更改到/dev/graphics目录中

系统支持的设备在devperms数组中定义,这个数组的类型是perms

如果在系统中需要增加新的驱动程序,并且设备节点需要自动创建,则需要在devperms

数组中增加内容

 

 

启动脚本init.rc

在系统初始化过程中进行一些简单的初始化操作

启动脚步本的路径:system/core/rootdir/init.rc

语法:

    Commands:命令

Action动作

Triggers触发条件

Service服务

Service服务名称s可执行程序

Socket

User

Group

Oneshot表示该服务只启动一次,如果没有这个可执行程序会一直存在如果

          可执行程序被杀死,则会得新启动

 

 

 

 

Options选项

Properties属性

 

 

Shell工具

Androidshell界面供开发调试使用,需要启动一个名称为console的服务.

Console可执行程序的路径为console

Shell的功能是由sh程序(控制台)和工具箱(具体的命令)两部分组成

 

Sh程序作为守护进程运行即androidshell终端

Sh代码的路径:system/core/sh

入口文件是main.c执行后调用cmdloop()函数进入命令的循环中

Builtin.h定义类内建命令的格式

Builtin.c定义了内建命令的数组(命令名称对应函数指针)

builtincmd内建命令数组

Splbltincmd分割功能的内建命令数组

Sh程序使用系统的第一个终端(ttty0)作为输入输出设备(不支持tab键自动补全)

 

 

命令工具箱

Toolbox提供了在shell界面下执行的各个命令行命令

Toolbox的代码路径为:system/core/toolbox

入口文件为:toolbox.c

如果要增加新命令只需要增加一个文件,实现类似形式的函数,并在当前目录的

Android.mk中加入命令的名称,(tooboxandroid.mk自动找到源文件加入编译,并且自动生成tools.h头文件)

 

 

C++工具库libutils

Libutils头文件的路径:frameworks/base/include/utils

Libutils源文件的路径:frameworks/base/libs/utils

编译的结果是:libutils.so

 

Libutils中基本的主要头文件包括:

Error.h:定义表示错误码代码的宏

Endian.h:定义表示大小端的宏?

Misc.h:字符串和文件相关的功能函数

TextOutput.h:定义文本输入的基类

bufferedTextOutput.h:是一个textOutput的实现

Pipe.h:定义管道类pipe;

Buffer.h:定义内存缓冲区域的类

List.h:定义链表的模版类

SharedBuffer.h:定义类SharedBuffer表示共享内存

String16.h:定义表示双字节字符串的类String16

String8.h:定义表示单字节字符串的类String8

VectorImpl.h:定义表示向量的类VectorImpl

Vector.h:定义继承Vector.定义继承vectorImpl类模版

SortedVector.h:定义排序向量的模版

keyedVector.h:定义使用关键字的向量模版

Threads.h:定义线程相关的类

Socket.h:定义套接字相关的类

Timers.h:定义时间相关的函数和定时器

ZipEntry.h:zip功能相关的类

 

 

Binder(libbinder.so)

用于进程间的通信(IPC,类似于openBinder(传统的IPC机制还有Socketpipe

D-BUS

 

Native部分的binder实现

Binder基本架构

1.驱动层dev/binder

2驱动适配层IPCThreakState.cppProcessState.cpp,

3Binder核心框架层IBinder(IPC传输介质)两个子类BBinderBpBinder

IInterface表示需要使用ipc的一个接口

4Binder框架层

5Binder服务和客户端实现层

 

Binder服务器端和客户端

Binder的实现基础是运行与kernel空间的binder驱动

路径为frameworks/base/include/binder

Frameworks/base/libs/binder

native层中,其实也就是实现第四层和第五层主要使用的头文件是IInterface.h

 

IInterface中有两个宏,DECLARE_META_INTERFACE()

为类自动声明asInterface()getInterfaceDescriptor()两个函数

IMPLEMENT_META_INTERFACE()

使用这两个宏可以为继承IInterface的类节省很多代码

BnInterface是一个类模版

 

Binder系统的使用,需继承IInterfaceBnInterface(IInterface)两个类,实现进程间

的通信

/fremework/base/libs/IpermissionController.h

IPermissionController.cpp

 

 

 

Libutils中的其他内容

Imemory.h中定义了:ImemoryHeap表示一块堆上的内存

Imemory表示一块任意使用的内存

 

MemoryHeapBaseIMemoryHeap接口的一个实现

MemoryBaseIMemory接口的一个实现

 

 

Android的系统进程

可以通过adbshellps进行查看

几个重要系统进程/init/system/bin/servicemanager/system/bin/mediaserver

System_serverzygote

Servicemanager:Binder的服务管理器守护进程,所有binder机制的核心,所有Binder服务都通过他进行注册他是一个本地应用

路径是:frameworks/base/cmds/servicemanager

运行流程:打开binder驱动---->成为服务器管理进程------>进入binder_loop等待请求

 

服务的实现

mediaPlay为例ImediaPlayService

框架部分

frameworks/base/include/media/IMediaPlayerService.h

/frameworks/base/media/libmedia/IMediaPlayService.cpp

服务器部分

/frameworks/base/media/libmediaplayerservice/MediaPlayService.h

/frameworks/base/media/libmediaplayerservice/MediaPlayerService.cpp

 

客户端调用者

/frameworks/base/media/libmediaplayerservice/

建立服务的守护进程media_server

/frameworks/base/media/mediaserver/main_mediaserver.cpp

 

在进程中增加服务是和servicemanager有关系的

 

 

 

 

 

 

 

 

 

 

 

 

 

守护进程,有名称的服务,使用binder框架架构的接口三者之间的关系是

 

 

 

Zygote

通过init进程启动,android运行时非常核心的部分,zygote首先启动system_server这是大多数服务的守护进程,之后所有的Android应用程序也是由它创建

 

 

第五章androidjava虚拟机和java环境

Dalvikandroid的虚拟机,内容在android中是一个独立的代码路径dalvik/,其中包含了目标机和主机的内容

 

Dex工具库和虚拟的实现(c语言写的实现库)

Dex工具库的目录是dalvik/dex最终生成静态库libdex.a

虚拟机的实现库dalvik/vm最终生成libdvm.so(dalvik虚拟机)

虚拟机的可执行程序dalvik/dalvikvn

核心库

Libcore的主要编译结果:

Libjavacore.a生成java核心静态库

Core.jar最终放置在文件系统的/system/framework目录中

目录结构如下:

 

Classes.dex为主体的dalvik可执行格式的字节码,javaorg目录下分别是javaorg这两个包中某些类包含的一些属性

 

Mativehelper

是一个工具库,用于注册java本地调用的函数.(在其他代码需要使用jni从本地层向java层提供功能时使用该库)

代码路径为:dalvik/libnativehelper

Nativehelper库的头文件路径为

libnativehelper/include/nativehelper/jni.h基于jni标准的头文件

Libnativehelper/include/nativehelper/JNIHelp.h提供注册功能的头文件

 

Androidjava的程序环境(核心包目录frameworks/base/core/java

Java类的代码主要在frameworks/base

主体部分将生成frameworks.jar包最终放置在目标文件系统的system/framework

Java框架部分的内容

frameworks/base/graphics/java图形部分

frameworks/base/media/java媒体部分

frameworks/base/opengl/javaopenGL部分

frameworks/base/wifi/javaWiFi部分

基中资源文件frameworks/base/core/res也被生成一个jar,framework-res.apk

 

 

Android系统API(框架层和应用层的接口)

API的描述文件包含在frameworks/base/api目录中,主要是current.xml

Android.app包中的类Activity其代码路径为android/app/Activity.java

对应current.xml的描述如下:

<packagename="android.app">//包内容

<classname="Activity"//类内容

extends="android.view.ContextThemeWrapper"

abstract="false"

static="false"

final="false"

deprecated="notdeprecated"

visibility="public"

>

<implementsname="android.content.ComponentCallbacks">//类实现的内容

</implements>

<implementsname="android.view.KeyEvent.Callback">

</implements>

<implementsname="android.view.LayoutInflater.Factory">

</implements>

<implementsname="android.view.View.OnCreateContextMenuListener">

</implements>

<implementsname="android.view.Window.Callback">

</implements>

<constructorname="Activity"//构造函数的内容

type="android.app.Activity"

static="false"

final="false"

deprecated="notdeprecated"

visibility="public"

>

</constructor>

<methodname="addContentView"//方法

return="void"

abstract="false"

native="false"

synchronized="false"

static="false"

final="false"

deprecated="notdeprecated"

visibility="public"

>

<parametername="view"type="android.view.View">//参数

</parameter>

<parametername="params"type="android.view.ViewGroup.LayoutParams">

</parameter>

</method>

<methodname="closeContextMenu"

return="void"

abstract="false"

native="false"

synchronized="false"

static="false"

final="false"

deprecated="notdeprecated"

visibility="public"

>

</method>

<methodname="closeOptionsMenu"

return="void"

abstract="false"

native="false"

synchronized="false"

static="false"

final="false"

deprecated="notdeprecated"

visibility="public"

>

</method>

<methodname="createPendingResult"

return="android.app.PendingIntent"

abstract="false"

native="false"

synchronized="false"

static="false"

final="false"

deprecated="notdeprecated"

visibility="public"

>

<parametername="requestCode"type="int">

</parameter>

<parametername="data"type="android.content.Intent">

</parameter>

<parametername="flags"type="int">

</parameter>

</method>

<methodname="dismissDialog"

return="void"

abstract="false"

native="false"

synchronized="false"

static="false"

final="true"

deprecated="notdeprecated"

visibility="public"

>

<parametername="id"type="int">

</parameter>

</method>

<methodname="dispatchKeyEvent"

return="boolean"

abstract="false"

native="false"

synchronized="false"

static="false"

final="false"

deprecated="notdeprecated"

visibility="public"

>

<parametername="event"type="android.view.KeyEvent">

</parameter>

</method>

<methodname="dispatchPopulateAccessibilityEvent"

return="boolean"

abstract="false"

native="false"

synchronized="false"

static="false"

final="false"

deprecated="notdeprecated"

visibility="public"

>

<parametername="event"type="android.view.accessibility.AccessibilityEvent">

</parameter>

</method>

........................

<fieldname="DEFAULT_KEYS_DIALER"//常量

type="int"

transient="false"

volatile="false"

value="1"

static="true"

final="true"

deprecated="notdeprecated"

visibility="public"

>

</field>

<fieldname="DEFAULT_KEYS_DISABLE"

type="int"

transient="false"

volatile="false"

value="0"

static="true"

final="true"

deprecated="notdeprecated"

visibility="public"

>

</field>

<fieldname="DEFAULT_KEYS_SEARCH_GLOBAL"

type="int"

transient="false"

volatile="false"

value="4"

static="true"

final="true"

deprecated="notdeprecated"

visibility="public"

>

</field>

<fieldname="DEFAULT_KEYS_SEARCH_LOCAL"

type="int"

transient="false"

volatile="false"

value="3"

static="true"

final="true"

deprecated="notdeprecated"

visibility="public"

>

</field>

<fieldname="DEFAULT_KEYS_SHORTCUT"

type="int"

transient="false"

volatile="false"

value="2"

static="true"

final="true"

deprecated="notdeprecated"

visibility="public"

>

</field>

<fieldname="FOCUSED_STATE_SET"

type="int[]"

transient="false"

volatile="false"

value="null"

static="true"

final="true"

deprecated="notdeprecated"

visibility="protected"

>

</field>

<fieldname="RESULT_CANCELED"

type="int"

transient="false"

volatile="false"

value="0"

static="true"

final="true"

deprecated="notdeprecated"

visibility="public"

>

</field>

<fieldname="RESULT_FIRST_USER"

type="int"

transient="false"

volatile="false"

value="1"

static="true"

final="true"

deprecated="notdeprecated"

visibility="public"

>

</field>

<fieldname="RESULT_OK"

type="int"

transient="false"

volatile="false"

value="-1"

static="true"

final="true"

deprecated="notdeprecated"

visibility="public"

>

</field>

 

<interfacename="View.OnClickListener"//接口

abstract="true"

static="true"

final="false"

deprecated="notdeprecated"

visibility="public"

>

 

在编译时,如果源代码和current.xml不一致时,可以使用以下命令更新:

Makeupdate-api

 

 

 

Jni的使用(javanativeinterface)----java本地接口

 

 

JNI的架构

Android中主要JNI代码在以下路径中:framework/base/core/jni最终编译生成库

System/lib/Libandroid_runtime.so

媒体部分的jni在目录frameworks/base/media/jni,编译成:libmedia_jni.so

android中实现JNI,需要动态连接libnativehelper.so

JNI实现方式

JNI的核心是JNINativeMethod结构体,在jni.h中定义

 

在框架层使用JNI

android.util.Log的情况:

publicfinalclassLog{

publicstaticnativebooleanisLoggable(Stringtag,intlevel);

}

android_util_Log.cpp的方法列表

staticJNINativeMethodgMethods[]={

/*name,signature,funcPtr*/

{"isLoggable","(Ljava/lang/String;I)Z",(void*)android_util_Log_isLoggable},

{"println_native","(IILjava/lang/String;Ljava/lang/String;)I",(void*)android_util_Log_println_native},

};

 

intregister_android_util_Log(JNIEnv*env)

{

jclassclazz=env->FindClass("android/util/Log");

 

if(clazz==NULL){

LOGE("Can'tfindandroid/util/Log");

return-1;

}

 

levels.verbose=env->GetStaticIntField(clazz,env->GetStaticFieldID(clazz,"VERBOSE","I"));

levels.debug=env->GetStaticIntField(clazz,env->GetStaticFieldID(clazz,"DEBUG","I"));

levels.info=env->GetStaticIntField(clazz,env->GetStaticFieldID(clazz,"INFO","I"));

levels.warn=env->GetStaticIntField(clazz,env->GetStaticFieldID(clazz,"WARN","I"));

levels.error=env->GetStaticIntField(clazz,env->GetStaticFieldID(clazz,"ERROR","I"));

levels.assert=env->GetStaticIntField(clazz,env->GetStaticFieldID(clazz,"ASSERT","I"));

 

returnAndroidRuntime::registerNativeMethods(env,"android/util/Log",gMethods,NELEM(gMethods));

}

 

};

 

 

 

apk中实现JNI

Jni示例程序的路径为:

Development/samples/SimpleJNI

 

 

系统服务的java部分

Binder

Java层同样提供了一套Binder的相关函数,实现在:

/frameworks/base/core/java/android/os

/frameworks/base/core/java/com/android/internal/os

/frameworks/base/core/jni

 

Java层的核心是binder---->IBinder----->binderProxy这样一个三角关系

NativeBBinder--->IBinder---->BpBinder

Java层中aidl工具来辅助实现Binder,只需要定义接口XXX.aidl编译器就会生成

IXXX. 客户端IXXX.stuv.Proxy和服务器端IXXX.Stub

 

 

ServiceManager(服务管理的服务器端)

主要分析java框架中serviceManager客户端的实现,也就是IServiceManager接口的java实现

serviceManagerNative.java

serviceManager.java

serviceManager.java

IServiceManager.java

 

 

 

 

 

 

ServiceManager的方法

publicfinalclassServiceManager{

privatestaticfinalStringTAG="ServiceManager";

 

privatestaticIServiceManagersServiceManager;

privatestaticHashMap<String,IBinder>sCache=newHashMap<String,IBinder>();

privatestaticIServiceManagergetIServiceManager(){}

publicstaticIBindergetService(Stringname){}

publicstaticvoidaddService(Stringname,IBinderservice){}

publicstaticIBindercheckService(Stringname){}

publicstaticString[]listServices()throwsRemoteException{}

publicstaticvoidinitServiceCache(Map<String,IBinder>cache){}

}

 

 

例如:

1.armManagerService的调用者

代码路径为:/frameworks/base/core/java/android/app

packageandroid.app;

 

importandroid.app.PendingIntent;

 

/**

*SystemprivateAPIfortalkingwiththealarmmanagerservice.

*

*{@hide}

*/

interfaceIAlarmManager{

voidset(inttype,longtriggerAtTime,inPendingIntentoperation);

voidsetRepeating(inttype,longtriggerAtTime,longinterval,inPendingIntentoperation);

voidsetInexactRepeating(inttype,longtriggerAtTime,longinterval,inPendingIntentoperation);

voidsetTime(longmillis);

voidsetTimeZone(Stringzone);

voidremove(inPendingIntentoperation);

}

 

 

2.Service库中alarmManagerService

publicvoidset(inttype,longtriggerAtTime,PendingIntentoperation){}

publicvoidsetRepeating(inttype,longtriggerAtTime,longinterval,

PendingIntentoperation){}

publicvoidsetInexactRepeating(inttype,longtriggerAtTime,longinterval,

PendingIntentoperation){}

publicvoidsetTime(longmillis){}

publicvoidsetTimeZone(Stringtz){}

publicvoidremove(PendingIntentoperation){}

publicvoidremoveLocked(PendingIntentoperation){}

privatevoidremoveLocked(ArrayList<Alarm>alarmList,

PendingIntentoperation){}

 

3.增加服务

/frameworks/base/services/java/com/android/server/SystemServer.java

Slog.i(TAG,"AlarmManager");

AlarmManagerServicealarm=newAlarmManagerService(context);

ServiceManager.addService(Context.ALARM_SERVICE,alarm);

4.得到接口

/frameworks/base/core/java/android/app

privateAlarmManagergetAlarmManager(){

synchronized(sSync){

if(sAlarmManager==null){

IBinderb=ServiceManager.getService(ALARM_SERVICE);

IAlarmManagerservice=IAlarmManager.Stub.asInterface(b);

sAlarmManager=newAlarmManager(service);

}

}

returnsAlarmManager;

}

 

 

系统进程

主要是对zygote的分析,它是通进init进程读取init.rc启动的

servicezygote/system/bin/app_process-Xzygote/system/bin--zygote--start-system-server

socketzygotestream666

onrestartwrite/sys/android_power/request_statewake

onrestartwrite/sys/power/stateon

onrestartrestartmedia

对应的可执行文件

/frameworks/base/cmds/app_process/app_main.c通过runtime:start开启整个初始化流程

首先是开启java虚拟机app_process联接一个名为libandroid_runtime.so的动态库,再连接

Libdvm.so由它调用虚拟机

/frameworks/base/core/java/com/android/internal/os/ZygoteInit完成初始化操作

ZygoteInit.main()会完成一次分裂,这个分裂出来的线程(system_server)继续进行java框架的初始化工作,通过startSystemServer()方法来完成,继续调用handleSystemServerProcess(parsedArgs) 传递参数com.android.server.SystemServer通过RuntimeInin.zygooteInit--->systemServer.main----->systemServer.init1----->systemServer.init2

代码如下:

privatestaticbooleanstartSystemServer()

throwsMethodAndArgsCaller,RuntimeException{

/*Hardcodedcommandlinetostartthesystemserver*/

Stringargs[]={

"--setuid=1000",

"--setgid=1000",

"--setgroups=1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1018,3001,3002,3003",

"--capabilities=130104352,130104352",

"--runtime-init",

"--nice-name=system_server",

"com.android.server.SystemServer",

};

ZygoteConnection.ArgumentsparsedArgs=null;

 

intpid;

 

try{

parsedArgs=newZygoteConnection.Arguments(args);

 

/*

*Enabledebuggingofthesystemprocessif*either*thecommandlineflags

*indicateitshouldbedebuggableorthero.debuggablesystemproperty

*issetto"1"

*/

intdebugFlags=parsedArgs.debugFlags;

if("1".equals(SystemProperties.get("ro.debuggable")))

debugFlags|=Zygote.DEBUG_ENABLE_DEBUGGER;

 

/*Requesttoforkthesystemserverprocess*/

pid=Zygote.forkSystemServer(

parsedArgs.uid,parsedArgs.gid,

parsedArgs.gids,debugFlags,null,

parsedArgs.permittedCapabilities,

parsedArgs.effectiveCapabilities);

}catch(IllegalArgumentExceptionex){

thrownewRuntimeException(ex);

}

 

/*Forchildprocess*/

if(pid==0){

handleSystemServerProcess(parsedArgs);

}

 

returntrue;

}

分享到:
评论

相关推荐

    第一行代码 android学习笔记 完整版

    Android学习笔记是Android开发者的必读书籍,书中涵盖了Android系统架构、Activity、Intent、资源管理等多方面的知识。本笔记对应的学习资源《第一行代码》是Android开发者的入门必读书籍,书中系统地介绍了Android...

    Android基础学习笔记

    Android基础学习笔记主要涵盖了一系列关于Android开发的基本概念和关键组件,以下是这些知识点的详细解析: 1. **Activity**: 是Android应用程序的基本单元,它代表用户在屏幕上看到的一个界面。每个Activity都必须...

    Android Studio 学习笔记-新手入门-(1)第一个案例

    这篇学习笔记将引导新手入门,通过创建第一个简单的案例来了解Android Studio的基本操作。 首先,让我们了解一下Android Studio的核心功能。它基于IntelliJ IDEA,具备代码自动补全、重构、调试等强大的开发特性。...

    Android Activity学习笔记

    Android Activity学习笔记 Android Activity是Android系统中最基本的组件之一,它负责处理用户交互和显示用户界面。本文将深入讲解Activity的生命周期、Activity之间的数据交互、Activity启动模式、Task和BackStack...

    Android学习新手笔记

    - Android系统基于Linux系统开发,拥有开放源码。 - Android系统框架由多个组件构成,其中包括Activity、Intent、Service、ContentProvider、View和BroadcastReceiver。 - Activity作为组件容器,主要负责用户...

    java学习细节 android学习笔记

    根据给定的信息,我们可以从Java和Android学习笔记中提取出一系列重要的知识点,下面将逐一进行详细解释。 ### Java基础知识 #### 1. 命令行基础操作 - **`javacmd`**: 这个命令是Java命令行工具的一部分,用于...

    Android+学习笔记

    ### Android学习笔记知识点详解 #### 一、简介与背景 Android作为全球最受欢迎的移动操作系统之一,自2007年谷歌发布以来,迅速占领市场并持续引领移动技术的发展。随着移动互联网的兴起和发展,Android应用开发...

    Android_学习笔记

    ### Android学习笔记——从HelloWorld开始 #### 一、Google的Android SDK介绍 自从Google发布了Android SDK以来,这款开源移动操作系统迅速吸引了众多开发者的关注。Android SDK为开发者提供了丰富的工具和API,...

    android全程学习笔记

    Android全程学习笔记旨在提供一个详尽且全面的指南,涵盖了Android开发中的关键技术点和实践案例。以下是关于Android开发的一些核心知识点: 1. **第一个Android应用**:开发Android应用的起点通常是从创建并运行你...

    Android_学习笔记.zip

    这个"Android_学习笔记.zip"文件很可能包含了一个详细的Android开发学习路径和关键知识点的总结。下面将基于这个主题,详细讲解Android开发的一些核心概念和技术。 首先,Android是Google开发的一款开源操作系统,...

    Android 学习笔记

    这篇学习笔记主要涵盖了关于布局的一些基本概念,特别是`fill_parent`和`wrap_content`这两种尺寸指定方式,以及如何通过XML布局文件来精确控制组件的位置。 首先,`fill_parent`和`wrap_content`是Android布局中的...

    Android 系统相关学习笔记.zip

    在Android系统相关学习笔记中,我们可以深入探讨这个广泛而复杂的移动操作系统的核心概念和技术。Android以其开源性和灵活性,吸引了大量的开发者和爱好者。以下是一些关键的知识点: 1. **Android架构**:Android...

    android 很好的学习笔记

    【Android学习笔记详解】 在移动应用开发领域,Android操作系统占据着重要的地位,为开发者提供了...通过系统学习并实践其中的内容,你将能够逐步掌握Android开发的核心技能,为你的Android开发者之路打下坚实的基础。

    Android PreferenceActivity 学习笔记

    这篇学习笔记将深入探讨PreferenceActivity的使用方法、功能以及与源码相关的知识。 首先,PreferenceActivity是Android SDK提供的一种特殊类型的Activity,它允许开发者快速构建具有可配置选项的界面,类似于系统...

    Android开发学习笔记

    ### Android开发学习笔记知识点梳理 #### 一、Android概述与架构 - **定义与发布**:Android是由Google在2007年11月5日宣布的基于Linux平台的开源手机操作系统。它不仅用于智能手机,还广泛应用于平板电脑、可穿戴...

Global site tag (gtag.js) - Google Analytics