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<void*>(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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章