NDK18_App启动原理和替换系统启动动画

NDK开发汇总

一 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(ptr + i * method_size)) ArtMethod;
}

二 替换系统启动动画

手机开机动画叫做:bootanimation
开机时:显示 bootUI -> Luanch

操作步骤

  1. 首先通过 adb push 命令将文件上传到 sdcard 的根目录下。
  2. 然后通过 adb shell 进入 设备目录下,提取 root 权限, 把 bootanimation.zip 覆盖到 system/media 目录下。
  3. 修改 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 : 表示无限循环。

注意

  1. desc.txt 文件要在 Linux 环境下生成,因为有些空格不一样
  2. part 目录中的图片的命名要是连续的,比如pic_001, pic_002, _pic_003 …
  3. 打包成bootanimation.zip文件的时候,要要用zip格式的存储方式打包。
  4. 个人: adb shell root

你可能感兴趣的:(NDK)