热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

android8.x的HIDL众多服务启动时的优化

在Andorid8.x系统之前,Android系统的服务不是在SystemServer.java中启动,就在init进程初始化xxx.xxx.rc中启动

在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/android.hardware.audio@2.0-service.rc...
[ 22.592402] c3 init: Parsing file /vendor/etc/init/android.hardware.biometrics.fingerprint@2.1-service.rc...
[ 22.603000] c3 init: Parsing file /vendor/etc/init/android.hardware.bluetooth@1.0-service.rc...
[ 22.612471] c3 init: Parsing file /vendor/etc/init/android.hardware.camera.provider@2.4-service.rc...
[ 22.622456] c3 init: Parsing file /vendor/etc/init/android.hardware.cas@1.0-service.rc...
[ 22.631375] c3 init: Parsing file /vendor/etc/init/android.hardware.configstore@1.0-service.rc...
[ 22.640973] c3 init: Parsing file /vendor/etc/init/android.hardware.drm@1.0-service.rc...
[ 22.650100] c3 init: Parsing file /vendor/etc/init/android.hardware.dumpstate@1.0-service.rc...
[ 22.659732] c3 init: Parsing file /vendor/etc/init/android.hardware.gatekeeper@1.0-service.rc...
[ 22.669427] c3 init: Parsing file /vendor/etc/init/android.hardware.gnss@1.0-service.rc...
[ 22.678653] c3 init: Parsing file /vendor/etc/init/android.hardware.graphics.allocator@2.0-service.rc...
[ 22.689081] c3 init: Parsing file /vendor/etc/init/android.hardware.graphics.composer@2.1-service.rc...
[ 22.699269] c3 init: Parsing file /vendor/etc/init/android.hardware.health@1.0-service.rc...
[ 22.708675] c3 init: Parsing file /vendor/etc/init/android.hardware.keymaster@3.0-service.rc...
[ 22.718172] c3 init: Parsing file /vendor/etc/init/android.hardware.light@2.0-service.rc...
[ 22.727480] c3 init: Parsing file /vendor/etc/init/android.hardware.media.omx@1.0-service.rc...
[ 22.737140] c3 init: Parsing file /vendor/etc/init/android.hardware.memtrack@1.0-service.rc...
[ 22.746312] c3 init: Parsing file /vendor/etc/init/android.hardware.sensors@1.0-service.rc...
[ 22.755606] c3 init: Parsing file /vendor/etc/init/android.hardware.usb@1.1-service.rc...
[ 22.764512] c3 init: Parsing file /vendor/etc/init/android.hardware.vibrator@1.0-service.rc...
[ 22.773805] c3 init: Parsing file /vendor/etc/init/android.hardware.wifi@1.0-service.rc..

想着以前都是在init.rc中把这些脚本import解析执行,搜了一大圈没找到,又去SystemServer.java中找,也没找到,回过头分析log,“Parsing directory”  找到

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

./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 &#61; 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& args, size_t start_index, size_t end_index) {Parser& parser &#61; Parser::GetInstance();if (end_index <&#61; start_index) {// Fallbacks for partitions on which early mount isn&#39;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 是在上面蓝色还是红色出解析的呢&#xff1f;

接口和软件包

HIDL 是围绕接口进行编译的&#xff0c;接口是面向对象的语言使用的一种用来定义行为的抽象类型。每个接口都是软件包的一部分。

软件包

软件包名称可以具有子级&#xff0c;例如 package.subpackage。已发布的 HIDL 软件包的根目录是 hardware/interfaces 或 vendor/vendorName&#xff08;例如 Pixel 设备为 vendor/google&#xff09;。软件包名称在根目录下形成一个或多个子目录&#xff1b;定义软件包的所有文件都位于同一目录下。例如&#xff0c;package android.hardware.example.extension.light&#64;2.0 可以在 hardware/interfaces/example/extension/light/2.0 下找到。
下表列出了软件包前缀和位置&#xff1a;

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

软件包目录中包含扩展名为 .hal 的文件。每个文件均必须包含一个指定文件所属的软件包和版本的 package 语句。文件 types.hal&#xff08;如果存在&#xff09;并不定义接口&#xff0c;而是定义软件包中每个接口可以访问的数据类型.

现在删除部分serveice:

hidl-gen工具

在Treble架构中&#xff0c;经常会提到HIDL&#xff0c;首先介绍和HIDL相关的一个工具hidl-gen,系统定义的所有的.hal接口&#xff0c;都是通过hidl-gen工具转换成对应的代码。比如hardware/interfaces/power/1.0/IPower.hal&#xff0c;会通过hidl-gen转换成out/soong/.intermediates/hardware/interfaces/power/1.0/android.hardware.power&#64;1.0_genc&#43;&#43;/gen/android/hardware/power/1.0/PowerAll.cpp文件&#xff0c;为了深入了解&#xff0c;介绍相关原理,首先分析hidl-gen。

hidl-gen源码路径&#xff1a;system/tools/hidl&#xff0c;是在ubuntu上可执行的二进制文件。

使用方法&#xff1a;hidl-gen -o output-path -L language (-r interface-root) fqname

列子&#xff1a;

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
&#43;&#43;&#43; b/update-base-files.sh
&#64;&#64; -22,9 &#43;22,9 &#64;&#64; options&#61;"-Lexport-header \hidl-gen $options \-o hardware/libhardware/include/hardware/sensors-base.h \android.hardware.sensors&#64;1.0
-hidl-gen $options \
- -o hardware/libhardware/include/hardware/nfc-base.h \
- android.hardware.nfc&#64;1.0
&#43;#hidl-gen $options \
&#43;# -o hardware/libhardware/include/hardware/nfc-base.h \
&#43;# android.hardware.nfc&#64;1.0hidl-gen $options \-o hardware/libhardware/include/hardware/gnss-base.h \android.hardware.gnss&#64;1.0

参考&#xff1a;https://source.android.com/devices/architecture/hidl/interfaces

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


推荐阅读
  • 两个方案:1通过android.permission.READ_PHONE_STATE读取2通过短信过滤,读取手机号。按照第1个方案,AndroidManifest.xml需要添加< ... [详细]
  • publicvoidchooseVideo(Viewview){IntentintentnewIntent();*开启Pictur ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文介绍了在MFC下利用C++和MFC的特性动态创建窗口的方法,包括继承现有的MFC类并加以改造、插入工具栏和状态栏对象的声明等。同时还提到了窗口销毁的处理方法。本文详细介绍了实现方法并给出了相关注意事项。 ... [详细]
  • 本文介绍了如何使用MATLAB调用摄像头进行人脸检测和识别。首先需要安装扩展工具,并下载安装OS Generic Video Interface。然后使用MATLAB的机器视觉工具箱中的VJ算法进行人脸检测,可以直接调用CascadeObjectDetector函数进行检测。同时还介绍了如何调用摄像头进行人脸识别,并对每一帧图像进行识别。最后,给出了一些相关的参考资料和实例。 ... [详细]
  • 本文介绍了使用C++Builder实现获取USB优盘序列号的方法,包括相关的代码和说明。通过该方法,可以获取指定盘符的USB优盘序列号,并将其存放在缓冲中。该方法可以在Windows系统中有效地获取USB优盘序列号,并且适用于C++Builder开发环境。 ... [详细]
  • STM32 IO口模拟串口通讯
    转自:http:ziye334.blog.163.comblogstatic224306191201452833850647前阵子,调项目时需要用到低波 ... [详细]
  • scrcpy通过adb调试的方式来将手机屏幕投到电脑上,并可以通过电脑控制您的Android设备。它可以通过USB连接,也可以通过Wifi连接(类似于隔空投屏),而且不需要任何ro ... [详细]
  • quartus管脚分配后需要保存吗_嵌入式必须会的一些硬件面试题,要试一试吗?你过来呀!...
    1、下面是一些基本的数字电路知识问题,请简要回答之。(1)什么是Setup和Hold时间?答:SetupHoldTime用于测试芯片对输入 ... [详细]
  • Apple iPad:过渡设备还是平板电脑?
    I’vebeenagonizingoverwhethertopostaniPadarticle.Applecertainlydon’tneedmorepublicityandthe ... [详细]
  • Android跨进程通信IPC之9——Binder通信机制
    移步系列Android跨进程通信IPC系列1Android整体架构Android系统架构及系统源码目录Android系统架构 ... [详细]
  • 移动–镜像y轴的视频文件剪辑原文:https://www. ... [详细]
author-avatar
笑看人世情9
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有