做Android开发,要清楚init.rc里面的东西

init.rc 复习

看这个之前,先看看大神总结的文章

这篇文章总结的非常到位,但是因为代码不是最新的Android版本,对我们最新的Android版本不适用。

http://gityuan.com/2016/02/05/android-init/

#init rc文件拷贝

拷贝其实也就是把文件放到机器的某个位置,我们也可以使用这个命令来完成我们需要的功能。

PRODUCT_COPY_FILES += $(LOCAL_PATH)/factory_init.project.rc:$(TARGET_COPY_OUT_VENDOR)/etc/init/hw/factory_init.project.rc
PRODUCT_COPY_FILES += $(LOCAL_PATH)/init.project.rc:$(TARGET_COPY_OUT_VENDOR)/etc/init/hw/init.project.rc
PRODUCT_COPY_FILES += $(LOCAL_PATH)/meta_init.project.rc:$(TARGET_COPY_OUT_VENDOR)/etc/init/hw/meta_init.project.rc
PRODUCT_COPY_FILES += $(LOCAL_PATH)/init.recovery.mt8167.rc:root/init.recovery.mt8167.rc

#触发 trigger 

system/core/rootdir/init.rc

如果我们想触发某种 trigger,就可以这样去做,Android也是通过这样的机制来决定各个阶段做不同的事情的。

# Mount filesystems and start core system services.
on late-init/*触发更早的文件系统*/trigger early-fs# Mount fstab in init.{$device}.rc by mount_all command. Optional parameter# '--early' can be specified to skip entries with 'latemount'.# /system and /vendor must be mounted by the end of the fs stage,# while /data is optional./*vendor 需要在fs 挂载之后才能挂载*/trigger fstrigger post-fs# Mount fstab in init.{$device}.rc by mount_all with '--late' parameter# to only mount entries with 'latemount'. This is needed if '--early' is# specified in the previous mount_all command on the fs stage.# With /system mounted and properties form /system + /factory available,# some services can be started.trigger late-fs# Now we can mount /data. File encryption requires keymaster to decrypt# /data, which in turn can only be loaded when system properties are present.trigger post-fs-data# Now we can start zygote for devices with file based encryptiontrigger zygote-start# Load persist properties and override properties (if enabled) from /data.trigger load_persist_props_action# Remove a file to wake up anything waiting for firmware.trigger firmware_mounts_completetrigger early-boottrigger boot

#Android 服务启动顺序

on early-init
on init
on late-inittrigger post-fs      trigger load_system_props_actiontrigger post-fs-data  trigger load_persist_props_actiontrigger firmware_mounts_completetrigger boot   on post-fs      //挂载文件系统start logdmount rootfs rootfs / ro remountmount rootfs rootfs / shared recmount none /mnt/runtime/default /storage slave bind rec...on post-fs-data  //挂载datastart logdstart vold   //启动vold//android 9.0 中变成了 在main.c代码中去触发 ATRACE_BEGIN("VoldNativeService::start");if (android::vold::VoldNativeService::start() != android::OK) {LOG(ERROR) << "Unable to start VoldNativeService";exit(1);}ATRACE_END();on boot      //启动核心服务...class_start core //启动core class

#解析init.*.rc文件的代码位置

system/core/init/- init.cpp
/*可以从system/core里面去看代码,找到你想要的东西*/

#查看服务的状态

getprop | grep init.svc
/*服务指的是用service指定的服务*//*比如*/
# adbd is controlled via property triggers in init.<platform>.usb.rc
service adbd /system/bin/adbd --root_seclabel=u:r:su:s0class coresocket adbd stream 660 system systemdisabledseclabel u:r:adbd:s0

在机器中执行结果如下

Android 9.0:/ # getprop |grep init.svc
[init.svc.XoSetCap]: [stopped]
[init.svc.adbd]: [running]
[init.svc.aee-reinit]: [stopped]
[init.svc.aee_aed]: [running]
[init.svc.aee_aedv]: [running]
[init.svc.atcid-daemon-u]: [stopped]
[init.svc.audio-daemon]: [stopped]
[init.svc.audioserver]: [running]
[init.svc.batterywarning]: [running]
[init.svc.bluetooth-1-0]: [running]
[init.svc.bluetoothd]: [stopped]
[init.svc.bootanim]: [stopped]
[init.svc.bootlogoupdater]: [stopped]
[init.svc.bugreport]: [stopped]
[init.svc.camerahalserver]: [running]
[init.svc.cameraserver]: [running]
[init.svc.clear-bcb]: [stopped]
[init.svc.console]: [running]
[init.svc.drm]: [running]
[init.svc.dumpstate]: [stopped]
[init.svc.dumpstatez]: [stopped]
[init.svc.flash_recovery]: [stopped]
[init.svc.fuse_usbotg]: [stopped]
[init.svc.gatekeeperd]: [running]
[init.svc.ged_srv]: [running]
[init.svc.hdmi]: [stopped]

查看adbd 的服务状态

Android 9.0:/ # getprop |grep adb
[init.svc.adbd]: [running]
[persist.sys.usb.config]: [adb]
[ro.adb.secure]: [1]
[ro.boottime.adbd]: [6366465736]
[service.adb.root]: [1]
[sys.usb.config]: [adb]
[sys.usb.state]: [adb]
Knowin inSight10:/ #

adbd 服务定义在 init.usb.rc里面

adbd的服务启动和usb强相关,服务的启动和停止总是和usb关连在一起。

# Copyright (C) 2012 The Android Open Source Project
#
# USB configuration common for all android devices
#on post-fs-datachown system system /sys/class/android_usb/android0/f_mass_storage/lun/filechmod 0660 /sys/class/android_usb/android0/f_mass_storage/lun/filechown system system /sys/class/android_usb/android0/f_rndis/ethaddrchmod 0660 /sys/class/android_usb/android0/f_rndis/ethaddrmkdir /data/misc/adb 02750 system shellmkdir /data/adb 0700 root root# adbd is controlled via property triggers in init.<platform>.usb.rc
service adbd /system/bin/adbd --root_seclabel=u:r:su:s0class coresocket adbd stream 660 system systemdisabledseclabel u:r:adbd:s0on bootsetprop sys.usb.configfs 0# Used to disable USB when switching states
on property:sys.usb.config=none && property:sys.usb.configfs=0stop adbdwrite /sys/class/android_usb/android0/enable 0write /sys/class/android_usb/android0/bDeviceClass 0setprop sys.usb.state ${sys.usb.config}# adb only USB configuration
# This is the fallback configuration if the
# USB manager fails to set a standard configuration
on property:sys.usb.config=adb && property:sys.usb.configfs=0write /sys/class/android_usb/android0/enable 0write /sys/class/android_usb/android0/idVendor 18d1write /sys/class/android_usb/android0/idProduct 4EE7write /sys/class/android_usb/android0/functions ${sys.usb.config}write /sys/class/android_usb/android0/enable 1start adbdsetprop sys.usb.state ${sys.usb.config}

#vendor 和 system/vendor Link在一起

vendor 英文解释是供应商的意思,对我们开发而言,也就是除开google的那一套之外,都可以归类到vendor下面去,比如我们自己客制化的hal,也可以放到vendor下面去。

    # Link /vendor to /system/vendor for devices without a vendor partition.symlink /system/vendor /vendor

在设备上查看

Closed connection on port 1.
android 9.0:/ # ls /system/vendor/
app bin build.prop cache data default.prop etc firmware lib lost+found nvdata odm overlay persist protect_f protect_s res ueventd.rc va
android 9.0:/ # ls /vendor/
app bin build.prop cache data default.prop etc firmware lib lost+found nvdata odm overlay persist protect_f protect_s res ueventd.rc va

# class 对应的属性 core 、main、late_start

class 是类别的意思,一共有三种类别。

  • core

ueventd、logd、healthd、adbd(disabled)、lmkd(LowMemoryKiller)、servicemanager、vold、debuggerd、surfaceflinger、bootanim(disabled)等

core分类中的服务都是一些核心服务,它们不启动,后续的服务或系统启动就可能出问题。比如servicemanager,binder通信大管家,它的启动很靠前,因为,其他服务启动时候需要向servicemanager注册binder服务。vold,负责存储类设备的挂载;还有surfaceflinger,图形显示的核心服务等。

  • main

debuggerd64、drm、media、ril-daemon、installd、flash_recovery、racoon(disabled)、mtpd(disabled)、keystore、dumpstate(disabled)、mdnsd(disabled)、pre-recovery(disabled)、cmd_services(disabled)、phasecheckserver、zygote等。

main分类中的服务是一些系统的基本服务,有了这些服务android系统、Java世界才能正常运行。

  • late_start

    字面意思是晚些启动。/device/中一些硬件厂商的.rc文件中会将一些服务设置为该类。

#Android 增加一个property

我们有时候需要增加一个property 在init.rc 里面做判断,用来判断某个服务是否已经启动。

这个property 也会在设备启动后的build.prop中显示出来。

weiqifa@bsp-ubuntu1804:~/mt8167s-9.0-sdk$ git diff build/make/tools/buildinfo.sh
diff --git a/build/make/tools/buildinfo.sh b/build/make/tools/buildinfo.sh
index 6400b1b402..cdc973275c 100755
--- a/build/make/tools/buildinfo.sh
+++ b/build/make/tools/buildinfo.sh
@@ -75,3 +75,4 @@ echo "system_init.startsensorservice=1"echo "ro.knowin.version.firmware=$BUILD_FIRMWARE_VERSION"echo "nfc.debug_enabled=0"echo "nfc.nxp_log_level_nci=0"
+echo "sys.zigbee.enable=0"
weiqifa@bsp-ubuntu1804:~/mt8167s-9.0-sdk$ 

#Android 分区fstab

这部分和init.rc关系不大,但是分区的挂载都是在init.rc里面去触发的,所以需要关注。

device\mediateksample\xxx\recovery_emmc.fstab
recovery_emmc.fatab

文件内容

boot             /boot       emmc      defaults        defaults
/dev/block/mmcblk0p2      /cache      ext4      defaults        defaults
/dev/block/mmcblk0p3      /data       ext4      defaults        defaults
misc            /misc       emmc      defaults        defaults
recovery        /recovery   emmc      defaults        defaults
/dev/block/mmcblk0p4      /sdcard     vfat      defaults        defaults
/dev/block/mmcblk0p6      /system     ext4      defaults        defaults

#给增加的property增加权限

不要以为增加了property就可以使用权限了,还需要给增加的property在某个位置修改一下。

这一步至关重要,要不然我们会发现触发了property,但是程序却没有执行。

weiqifa@bsp-ubuntu1804:~/mt8167s-9.0-sdk$ git diff system/core/init/stable_properties.h
diff --git a/system/core/init/stable_properties.h b/system/core/init/stable_properties.h
old mode 100644
new mode 100755
index 4972d101f1..262039c57b
--- a/system/core/init/stable_properties.h
+++ b/system/core/init/stable_properties.h
@@ -58,6 +58,7 @@ static const std::set<std::string> kExportedActionableProperties = {"vold.post_fs_data_done","vts.native_server.on","wlan.driver.status",
+    "sys.zigbee.enable",};}  // namespace init
weiqifa@bsp-ubuntu1804:~/mt8167s-9.0-sdk$ 

#增加权限后,在init.rc 判断才能触发?

+on property:sys.zigbee.enable=1
+    chmod 0666 /dev/ttyMT0
+    chmod 0666 /dev/ttyMT1
+    chmod 0666 /dev/ttyMT2

#在init.rc 里面加上打印日志

 write /dev/kmsg "[UART0]=== weiqifa === start post-fs-data"

然后在dmesg 里面可以看到打印的信息

#常见的问题

列出的问题是我们项目中遇到的,如果大家有遇到,可以按照我们的修改方式进行修改。

我们在项目中给adb加了key值在data分区下,在使用的过程中,会发现data目录下的key被篡改,通过修改,把文件放在vendor下后正常。

被篡改的原因可能因为权限问题,也可以尝试在放文件的时候,修改文件权限只对adbd服务可读访问。

还有一个问题是我们的应用,需要使用的一些资源,放在data下,也遇到被篡改。

修改的方法与上面的类似,我们把文件放在vendor下,然后每次开机的时候,再拷贝到data目录下,确保每次开机文件都存在。

当然,也可以让app直接访问vendor下的文件。

我最这部分的理清主要为了解决我们项目中有一个服务启动速度慢,原来依赖的是data分区,我把代码修改为依赖sdcard分区,在sdcard分区挂载完成后,触发我们服务的启动,以达到服务开机快速启动的效果。

推荐阅读:

专辑|Linux文章汇总

专辑|程序人生

专辑|C语言

我的知识小密圈

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/466874.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

宏比较值,坑的一B

昨晚上&#xff0c;我准备睡觉&#xff0c;连总给我发了一段代码#include "stdio.h"#define MAX_MACRO(a, b) ((a) > (b) ? (a) : (b)) int MAX_FUNC(int a, int b) {return ((a) > (b) ? (a) : (b)); }int main() {unsigned int a 1;int b -1;printf(&quo…

Linux下Samba服务器搭建

linux文件共享之samba服务器 ——ubuntu 宗旨&#xff1a;技术的学习是有限的&#xff0c;分享的精神是无限的。 关闭LINUX防火墙命令&#xff1a; #ufwdisable 然后就在windows下ping一下linux的IP&#xff0c;如果能ping通&#xff0c;就可以继续下面的内容&#xff0c;如果p…

搞懂C++为什么难学,看这篇就够了!

学C能干什么&#xff1f; 往细了说&#xff0c;后端、客户端、游戏引擎开发以及人工智能领域都需要它。往大了说&#xff0c;构成一个工程师核心能力的东西&#xff0c;都在C里。跟面向对象型的语言相比&#xff0c;C是一门非常考验技术想象力的编程语言&#xff0c;因此学习起…

看图学源码之FutureTask

RunnableFuture 源码学习&#xff1a; 成员变量 任务的运行状态的转化 package java.util.concurrent; import java.util.concurrent.locks.LockSupport;/**可取消的异步计算。该类提供了Future的基本实现&#xff0c;包括启动和取消计算的方法&#xff0c;查询计算是否完成以…

单片机的引脚,你都清楚吗?

第1课&#xff1a;单片机简叙1.单片机可以做什么&#xff1f;目前单片机渗透到我们生活的各个领域&#xff0c;几乎很难找到哪个领域没有单片机的踪迹。小到电话&#xff0c;玩具&#xff0c;手机&#xff0c;各类刷卡机&#xff0c;电脑键盘&#xff0c;彩电&#xff0c;冰箱&…

Graphviz的安装及纠错

在Anaconda Prompt里边输入conda install graphviz 安装成功之后输入pip install graphviz 它会提示成功安装。 启动 Jupyter Notebook &#xff0c;在文件里边输入 import graphviz 测试&#xff0c;如果没有报错证明&#xff0c;模块安装成功&#xff0c;但是在运行程序…

sklearn——决策树

总结sklearn决策树的使用&#xff0c;方便以后查阅。1.分类决策树 &#xff08;基于CART树&#xff09; 原型&#xff1a;参数&#xff1a;2、回归分类树 原型&#xff1a;参数&#xff1a;3、export_graphviz 当训练完毕一颗决策树时&#xff0c;可以通过sklearn.tree.expor…

Linux下SVN服务器的搭建

Linux下SVN服务器的搭建 宗旨&#xff1a;技术的学习是有限的&#xff0c;分享的精神是无限的。 1、下载工具&#xff08;下载地址&#xff1a;&#xff09; subversion-1.6.1.tar.gz subversion-deps-1.6.1.tar.gz 2、解压两个包&#xff1a; a) tar -xzvf subvers…

记一次解决问题的掉坑过程

这两天在调试一个音频ADC 芯片&#xff0c;也是之前的项目&#xff0c;但是一直调不出来&#xff0c;我发现我总是在这样的问题上纠结很久&#xff0c;以前踩过的坑后面照样会踩&#xff0c;只不过踩完会迅速把脚拉出来继续前进&#xff0c;我经常听到有人说「做嵌入式真的太容…

sklearn——AdaBoost应用

选自《python大战机器学习》

面试常见的C语言字符串操作

#字符串倒序输出实现逻辑&#xff0c;通过strlen获取字符串长度&#xff0c;然后通过 len/2 进行交叉赋值&#xff0c;这里需要注意&#xff0c;不需要考虑len是奇数还是偶数的问题。如果len是奇数&#xff0c;最后一个字符就不需要倒序&#xff0c;如果是偶数&#xff0c;最后…

HttpHandler:给指定路径下的图片添加水印显示

圣诞节&#xff0c;25日&#xff0c;要交ACCP5.0认证的项目&#xff0c;其中有这样一个要求&#xff1a;书店的所有图书的封面放在了\images\convers\下面&#xff0c;要求所有引用这一路径下的图片都添加书店的店名水印图片。就是说拦截Http请求了&#xff0c;自然想到HttpHan…

Linux 下的复制命令,这几个比较靠谱

平时我们使用Linux复制命令的时候&#xff0c;一般使用 cp命令&#xff0c;但是cp 命令性能比较令人担忧使用tar 命令来拷贝大量文件通过对比下面的几个命令&#xff0c;在拷贝比较多而且比较大的文件的话&#xff0c;用git clone 比较靠谱&#xff0c;特别是复制代码库&#x…

Mendeley文献管理软件使用介绍

<!DOCTYPE html>New DocumentMendeley 是一款免费的跨平台文献管理软件&#xff0c;同时也是一个在线的学术社交网络平台。Mendeley 对 PDF、Bibtex 的支持非常好&#xff0c;可以直接导出 Bibtex 格式&#xff0c;还可以直接导入zotero数据库&#xff0c;决定了其兼容性…

过拟合问题——正则化方法

看了很多资料&#xff0c;本身想放一个正则化的概念的&#xff0c;实在不敢放&#xff0c;怕吓跑一堆人&#xff0c;所以&#xff0c;将就吧。首先&#xff0c;我们知道正则化&#xff08;Regularization&#xff09;是解决过拟合问题的&#xff0c;简单来说&#xff0c;过拟合…

CentOS 8明年正式停止维护,以后再也不会有免费的RHEL了!

CentOS 8 明年正式停止维护&#xff0c;以后再也不会有免费的 RHEL 了!CentOS 是 Community Enterprise Operating System&#xff08;社区企业操作系统&#xff09;的首字母缩写&#xff0c;是 100&#xff05; 重建的 RHEL&#xff08;红帽企业 Linux&#xff09;。尽管 RHEL…

Python sqlalchemy orm 多外键关联

多外键关联 注&#xff1a;在两个表之间进行多外键链接 如图&#xff1a; 案例&#xff1a; # 创建两张表并添加外键主键 # 调用Column创建字段 加类型 from sqlalchemy import Integer, ForeignKey, String, Column# 调用基类Base from sqlalchemy.ext.declarative import dec…

将DataFrame格式的数据存入到mysql数据库中

因为最近频繁操作数据库&#xff0c;特别是写入数据比较麻烦。在DataFrame格式或者是Series格式的数据处理之后&#xff0c;总是会面临写入数据&#xff0c;迫不得已只能进行格式转换&#xff0c;搜索过程中发现了to_sql&#xff08;&#xff09;函数&#xff0c;就百度了用法&…

从小米智能家居入手,揭秘物联网关键技术

物联网已不知不觉融入我们的生活中给我们带来便捷&#xff0c;比如&#xff0c;智能门锁、ETC 电子自动收费系统等&#xff0c;一开始感觉还挺很新奇的&#xff0c;现在也习以为常了。那到底什么是物联网&#xff1f;可能很多人还挺蒙圈的。所谓物联网&#xff0c;最终目的就是…

Orange——The Data

The Data 这个部分描述的是怎样在Orange上加载数据。我们也将展示如何探索数据&#xff0c;发现一些基本统计特性&#xff0c;怎么数据取样。 Data Input Orange可以读取本机以制表符分隔的格式的文件&#xff0c;也可以从任何主要的标准电子表格文件类型加载数据&#xff0…