参考:Android_BootTime_introduction_20140215.pptx
第1 章 阅读前的准备工作
1.1 系统架构
1.1.1 Android 的系统架构
1.1.2 本书的架构
1.2 搭建开发环境
1.2.1 下载原代码
1.2.2 编译原代码
1.3 工具介绍
1.3.1 source insight
1.3.2 busybox
第2 章 深入理解JNI
2.1 JNI 概述
2.2 学习JNI的实列:mediascanner
libmedia_jni.so,JNI库名.下划线前的media是native 层库的名字.
2.3 Java层mediascanner的分析
包括三个部分 1)加载JNI库,2)非native的实现,3)native 函数的申明
2.4 JNI层mediascanner的分析
2.4.1 注册JNI
(1) 通过javah工具//静态方式
javah -o output packagename.classname 生产output.h,实现对应的funtion.
(2) 通过Android 虚拟机 jint JNI_onload( JavaVM*,void reserved)//动态方式.
registerNativeMethod(JNIEnv *env,cost char *ClassName const JNINativeMethod*gMethods, int numMethods)
typedef struct
{
const char*name//native 函数名
const char*signature//参数类型和返回值类型组合的签名信息
void *fnptr//JNI 层对应的函数指针
}JNINativeMethod
2.4.2 数据类型的转换
基本数据类型的数组,class,string,thowable有对应的J*外,其他Jobject
2.4.3 JNIEnv的介绍
JNIEnv是线程相关的变量.JavaVM全局变量,通过attachCurrentThread/detachcurrentthread来改变JNIEnv
2.4.4 通过JNIEnv操作Jobject.调用java对象的函数
成员变量->jFielID// get<type>field/set<type>field
成员函数->jmethodID//通过JNIenv 输出call<type>method<JNIEnv*env,Jobject obj,jmethod...>
2.4.5 jstring介绍
(1) native 字符转换成java对象
env->NewString/env->NewStringUFT
(2) java string 对象转换成native 字符.
env->GetStringChars/env->GetStringUFTChars
(3)JVM资源的释放
env->ReleaseStringUFTchars/env->ReleaseStringchars
2.4.6 JNI类型签名介绍
使用工具:javap -s -p xx
2.4.7 垃圾回收
(1) local reference //通过env->DeleteLocalRef 来释放
(2) Global reference//通过env->NewGlobalRef/env->DeleteGlobalRef
2.4.8 JNI中的异常处理
env->ExceptionOccure
env->ExceptionClear
env->Thrownew
Q:在java中怎么找到class 中native 函数的实现呢?
A:第一步:sourceinsight搜索 class,
第二步: 找到对应JNI register函数.找到 gmethod数组.
第三步: 再找对应native 方法的实现.
Q:java world怎么调到native world
A:
Q:native world怎么调回到 java world.
A:
Q:JNIenv 的实现原理
A:
第3 章 深入理解init
3.1 概述
3.2 init分析
\system\core\init\init.c
1. 解析两个配置文件 init.rc/init.$hardware.rc
2. 创建zygote
3. property_init
4. 进入一个循环 等待是否有重启行为.
3.2.1 解析配置文件 init.rc
通过 init_parse_config_file(const char *fn)解析*.rc文件.
(1)*.rc文件主要由3部分组成,定义在keyword.h中
1: SECTION:如,Service,on,import
2: COMMAND; class_start
3: OPTION ;socket,
3.2.2 分析service
(1)通过parse_service和parse_line_service解析如下Service 结构体.
通过parse_action和parse_line_action 解析action/command.
通过parse_import导入其他*.rc
如下是解析zygote Service.得到struct service
(2) init 控制 service
a:queue_builtin_action 把action加到队列中,通过action_for_each_trigger 把section中 队列tigger起来.
如 class_start XXXX,调起XXX Service.
如:do_class_start,
从而start init.rc中Service.
b:重启zygote
在sigal_init创建sock