android8.x的HIDL衆多服務啓動時的優化

在Andorid8.x系統之前,Android系統的服務不是在SystemServer.java中啓動,就在init進程初始化xxx.xxx.rc中啓動。

而Android8.x開始,會發現像/vendor/etc/init/android.hardware.*@2.0-service.rc這種類型的服務和初始化不知道在什麼地方加載起來,本文主要這個這種情況進行分析和優化。

本文轉自:https://blog.csdn.net/touxiong/article/details/80537777

優化開機速度--抓log發現很多用不着的service

[   22.577559] c3 init: Parsing directory /vendor/etc/init...
[   22.583263] c3 init: Parsing file /vendor/etc/init/[email protected]...
[   22.592402] c3 init: Parsing file /vendor/etc/init/[email protected]...
[   22.603000] c3 init: Parsing file /vendor/etc/init/[email protected]...
[   22.612471] c3 init: Parsing file /vendor/etc/init/[email protected]...
[   22.622456] c3 init: Parsing file /vendor/etc/init/[email protected]...
[   22.631375] c3 init: Parsing file /vendor/etc/init/[email protected]...
[   22.640973] c3 init: Parsing file /vendor/etc/init/[email protected]...
[   22.650100] c3 init: Parsing file /vendor/etc/init/[email protected]...
[   22.659732] c3 init: Parsing file /vendor/etc/init/[email protected]...
[   22.669427] c3 init: Parsing file /vendor/etc/init/[email protected]...
[   22.678653] c3 init: Parsing file /vendor/etc/init/[email protected]...
[   22.689081] c3 init: Parsing file /vendor/etc/init/[email protected]...
[   22.699269] c3 init: Parsing file /vendor/etc/init/[email protected]...
[   22.708675] c3 init: Parsing file /vendor/etc/init/[email protected]...
[   22.718172] c3 init: Parsing file /vendor/etc/init/[email protected]...
[   22.727480] c3 init: Parsing file /vendor/etc/init/[email protected]...
[   22.737140] c3 init: Parsing file /vendor/etc/init/[email protected]...
[   22.746312] c3 init: Parsing file /vendor/etc/init/[email protected]...
[   22.755606] c3 init: Parsing file /vendor/etc/init/[email protected]...
[   22.764512] c3 init: Parsing file /vendor/etc/init/[email protected]...
[   22.773805] c3 init: Parsing file /vendor/etc/init/[email protected]..

想着以前都是在init.rc中把這些腳本import解析執行,搜了一大圈沒找到,又去SystemServer.java中找,也沒找到,回過頭分析log,“Parsing directory”  找到

./core/init/init_parser.cpp:    LOG(INFO) << "Parsing directory " << path << "...";

./core/init/init_parser.cpp
bool Parser::ParseConfig(const std::string& path) {
    if (is_dir(path.c_str())) {
        return ParseConfigDir(path);
    }
    return ParseConfigFile(path);
}

繼續搜索

std::string bootscript = GetProperty("ro.boot.init_rc", "");
    if (bootscript.empty()) {
        parser.ParseConfig("/init.rc");
        parser.set_is_system_etc_init_loaded(
                parser.ParseConfig("/system/etc/init"));
        parser.set_is_vendor_etc_init_loaded(
                parser.ParseConfig("/vendor/etc/init"));
        parser.set_is_odm_etc_init_loaded(parser.ParseConfig("/odm/etc/init"));
    } else {
        parser.ParseConfig(bootscript);
        parser.set_is_system_etc_init_loaded(true);
        parser.set_is_vendor_etc_init_loaded(true);
        parser.set_is_odm_etc_init_loaded(true);
static void import_late(const std::vector<std::string>& args, size_t start_index, size_t end_index) {
    Parser& parser = Parser::GetInstance();
    if (end_index <= start_index) {
        // Fallbacks for partitions on which early mount isn't enabled.
        if (!parser.is_system_etc_init_loaded()) {
            parser.ParseConfig("/system/etc/init");
            parser.set_is_system_etc_init_loaded(true);
        }
        if (!parser.is_vendor_etc_init_loaded()) {
            parser.ParseConfig("/vendor/etc/init");
            parser.set_is_vendor_etc_init_loaded(true);
        }
        if (!parser.is_odm_etc_init_loaded()) {
            parser.ParseConfig("/odm/etc/init");
            parser.set_is_odm_etc_init_loaded(true);
         }

那請問 /vendor/etc/init 是在上面藍色還是紅色出解析的呢?

接口和軟件包

HIDL 是圍繞接口進行編譯的,接口是面向對象的語言使用的一種用來定義行爲的抽象類型。每個接口都是軟件包的一部分。

軟件包

軟件包名稱可以具有子級,例如 package.subpackage。已發佈的 HIDL 軟件包的根目錄是 hardware/interfaces 或 vendor/vendorName(例如 Pixel 設備爲 vendor/google)。軟件包名稱在根目錄下形成一個或多個子目錄;定義軟件包的所有文件都位於同一目錄下。例如,package [email protected] 可以在 hardware/interfaces/example/extension/light/2.0 下找到。
下表列出了軟件包前綴和位置:

軟件包 位置
android.hardware.* hardware/interfaces/*
android.frameworks.* frameworks/hardware/interfaces/*
android.system.* system/hardware/interfaces/*
android.hidl.* system/libhidl/transport/*

軟件包目錄中包含擴展名爲 .hal 的文件。每個文件均必須包含一個指定文件所屬的軟件包和版本的 package 語句。文件 types.hal(如果存在)並不定義接口,而是定義軟件包中每個接口可以訪問的數據類型.

現在刪除部分serveice:

hidl-gen工具

在Treble架構中,經常會提到HIDL,首先介紹和HIDL相關的一個工具hidl-gen,系統定義的所有的.hal接口,都是通過hidl-gen工具轉換成對應的代碼。比如hardware/interfaces/power/1.0/IPower.hal,會通過hidl-gen轉換成out/soong/.intermediates/hardware/interfaces/power/1.0/[email protected]_genc++/gen/android/hardware/power/1.0/PowerAll.cpp文件,爲了深入瞭解,介紹相關原理,首先分析hidl-gen。

hidl-gen源碼路徑:system/tools/hidl,是在ubuntu上可執行的二進制文件。

使用方法:hidl-gen -o output-path -L language (-r interface-root) fqname

列子:

hidl-gen  -Lmakefile  -r  android.hardware:hardware/interfaces  -r  android.hidl:system/libhidl/transpor
diff --git a/update-base-files.sh b/update-base-files.sh
index 1eb6b51..b5b1a99 100755
--- a/update-base-files.sh
+++ b/update-base-files.sh
@@ -22,9 +22,9 @@ options="-Lexport-header \
 hidl-gen $options \
          -o hardware/libhardware/include/hardware/sensors-base.h \
          [email protected]
-hidl-gen $options \
-         -o hardware/libhardware/include/hardware/nfc-base.h \
-         [email protected]
+#hidl-gen $options \
+#         -o hardware/libhardware/include/hardware/nfc-base.h \
+#         [email protected]
 hidl-gen $options \
          -o hardware/libhardware/include/hardware/gnss-base.h \
          [email protected]

參考:https://source.android.com/devices/architecture/hidl/interfaces

           https://blog.csdn.net/xiaosayidao/article/details/75577940

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章