一 App启动原理
- 手机开机会启动init.rc脚本 会加载好编译的init文件
- init
init文件是 \android-6.0.0_r1\system\core\init 文件下编译的可执行文件
函数入口为 main函数
init.c中会开启android-6.0.0_r1\frameworks\base\cmds 下的所有可执行文件 包括开启虚拟机的文
件app_process文件
main()
com.android.internal.os.ZygoteInit Java
-
xpose —>init
-
ArtMethod
Java文件 -
虚拟机 执行的第一个Java文件
ZygoteInit.java
class字节码 方法 ArtMethod()
root
runtime.start(“com.android.internal.os.ZygoteInit”, args, zygote);
虚拟机才会开启
if (startVm(&mJavaVM, &env, zygote) != 0) {
return;
}
- JNI_CreateJavaVM 创建java虚拟机 native JNIEnv *env
G:\Android\android-4.4.4_r1\art\runtime\jni_internal.cc JNI_CreateJavaVM
//JNIEnv *env 实例化
*p_env = Thread::Current()->GetJniEnv();
//实例化虚拟机的地方
*p_vm = runtime->GetJavaVM();
GetJniEnv()
这个函数定义在文件art/runtime/thread.h中。
// Every thread may have an associated JNI environment
JNIEnvExt* jni_env_;
JNIEnvExt 是 JNIEnv子类
实际上还是通过
env->FindClass(slashClassName) 2
/**
双亲委托机制
ClassLoader
加载Class
functions是jniNativeInterface
jclass FindClass(const char* name)
{ return functions->FindClass(this, name); }
G:\Android\android-4.4.4_r1\art\runtime\jni_internal.cc
FindClass(JNIEnv* env, const char* name)
踢皮球
c = class_linker->FindClass(descriptor.c_str(), cl);
调用了
DefineClass(self, descriptor, hash, NullHandlemirror::ClassLoader(), *pair.first,
*pair.second);
把class 加载class表
InsertClass(descriptor, klass.Get(), hash);
热启动 下一次开启 快一下
class 集合
冷启动 时间变得慢
真正Class
LoadClass(self, dex_file, dex_class_def, klass);
jdk 1.7
build_tool 22以下 安全
class存在着 磁盘 文件
dex—》class
class—》内存
方法
成员变量
java
LoadClassMembers 初始化 class里面的信息
Sophix
sizeof(相邻的artmthod大小)
java
static
SetVirtualMethodsPtr
虚函数表
放回当前的方法数量
t.NumDirectMethods()
给一个方法表分配内存
AllocArtMethodArray(self, it.NumVirtualMethods())
//循环每一个方法 ArtMethod 结构体 手机厂商
for (size_t i = 0; i < length; ++i) {
ArtMethod 厂商改这个大小
版本不一样 ArtMethod
new(reinterpret_cast<void*>(ptr + i * method_size)) ArtMethod;
}
二 替换系统启动动画
手机开机动画叫做:bootanimation
开机时:显示 bootUI -> Luanch
操作步骤
- 首先通过 adb push 命令将文件上传到 sdcard 的根目录下。
- 然后通过 adb shell 进入 设备目录下,提取 root 权限, 把 bootanimation.zip 覆盖到 system/media 目录下。
- 修改 bootanimation.zip 文件权限为可读可写可执行(777)。
854 480 7
p 1 2 folder1
p 0 2 folder2
下面对上述参数进行解释:
-
854 480 7 ----854 480代表动画的分辨率,854代表动画的宽度,480代表动画的高度;7则代表帧率,也就是一秒钟播放多少幅动画图片;
-
p 1 2 folder1 ----这里的p为标志符,1代表循环次数,2代表阶段间隔时间,folder1代表对应的动画文件夹名;
-
循环次数:0 : 表示无限循环。
注意
- desc.txt 文件要在 Linux 环境下生成,因为有些空格不一样
- part 目录中的图片的命名要是连续的,比如pic_001, pic_002, _pic_003 …
- 打包成bootanimation.zip文件的时候,要要用zip格式的存储方式打包。
- 个人: adb shell root