优化开机速度--抓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 << "...";
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