赞
踩
看这个之前,先看看大神总结的文章
这篇文章总结的非常到位,但是因为代码不是最新的Android版本,对我们最新的Android版本不适用。
http://gityuan.com/2016/02/05/android-init/
拷贝其实也就是把文件放到机器的某个位置,我们也可以使用这个命令来完成我们需要的功能。
- 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
在 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 fs
- trigger 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 encryption
- trigger 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_complete
-
- trigger early-boot
- trigger boot
- on early-init
- on init
- on late-init
- trigger post-fs
- trigger load_system_props_action
- trigger post-fs-data
- trigger load_persist_props_action
- trigger firmware_mounts_complete
- trigger boot
-
- on post-fs //挂载文件系统
- start logd
- mount rootfs rootfs / ro remount
- mount rootfs rootfs / shared rec
- mount none /mnt/runtime/default /storage slave bind rec
- ...
-
- on post-fs-data //挂载data
- start logd
- start 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
- 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:s0
- class core
- socket adbd stream 660 system system
- disabled
- seclabel 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-data
- chown system system /sys/class/android_usb/android0/f_mass_storage/lun/file
- chmod 0660 /sys/class/android_usb/android0/f_mass_storage/lun/file
- chown system system /sys/class/android_usb/android0/f_rndis/ethaddr
- chmod 0660 /sys/class/android_usb/android0/f_rndis/ethaddr
- mkdir /data/misc/adb 02750 system shell
- mkdir /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:s0
- class core
- socket adbd stream 660 system system
- disabled
- seclabel u:r:adbd:s0
-
- on boot
- setprop sys.usb.configfs 0
-
- # Used to disable USB when switching states
- on property:sys.usb.config=none && property:sys.usb.configfs=0
- stop adbd
- write /sys/class/android_usb/android0/enable 0
- write /sys/class/android_usb/android0/bDeviceClass 0
- setprop 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=0
- write /sys/class/android_usb/android0/enable 0
- write /sys/class/android_usb/android0/idVendor 18d1
- write /sys/class/android_usb/android0/idProduct 4EE7
- write /sys/class/android_usb/android0/functions ${sys.usb.config}
- write /sys/class/android_usb/android0/enable 1
- start adbd
- setprop sys.usb.state ${sys.usb.config}
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
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文件中会将一些服务设置为该类。
我们有时候需要增加一个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$
这部分和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,但是程序却没有执行。
- 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$
- +on property:sys.zigbee.enable=1
- + chmod 0666 /dev/ttyMT0
- + chmod 0666 /dev/ttyMT1
- + chmod 0666 /dev/ttyMT2
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分区挂载完成后,触发我们服务的启动,以达到服务开机快速启动的效果。
推荐阅读:
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。