如果要作为一个Service来提供,我们应该怎么设计呢?
TODO:
QA:怎么设计比较合理。
首先,在Android 系统启动的时候init进程
/system/core/init
main@init.cpp
int main(int argc, char** argv) { ... parser.ParseConfig("/init.rc"); ... }
/system/core/rootdir/init.rc
on post-fs # Load properties from # /system/build.prop, # /odm/build.prop, # /vendor/build.prop and # /factory/factory.prop load_system_props # start essential services start logd start servicemanager start hwservicemanager start vndservicemanager
post-fs触发之后,在原先(Android O之前)启动servicemanager的时候,把hwservicemanager和vndservicemanager都启动了!
post-fs触发时机:
#节选自system/core/rootdir/init.rc ... on late-init ... trigger post-fs
而late-init是在这触发的:
system/core/init/init.cpp
... std::string bootmode = GetProperty("ro.bootmode", ""); if (bootmode == "charger") { am.QueueEventTrigger("charger"); } else { am.QueueEventTrigger("late-init"); } ...
启动模式不是“charger”就触发这个。。。什么鬼
我们找到hwservicemanager:
先看看编译文件/system/hwservicemanager/Android.bp
... cc_binary { name: "hwservicemanager", init_rc: [ "hwservicemanager.rc", ], srcs: [ "AccessControl.cpp", "HidlService.cpp", "ServiceManager.cpp", "service.cpp", "TokenManager.cpp", "Vintf.cpp", ], ...
/system/hwservicemanager/hwservicemanager.rc
service hwservicemanager /system/bin/hwservicemanager user system disabled group system readproc critical onrestart setprop hwservicemanager.ready false onrestart class_restart hal onrestart class_restart early_hal writepid /dev/cpuset/system-background/tasks class animation
会启动一个二进制可执行程序hwservicemanager,目录在/system/bin/
找main函数
//system/hwservicemanager/service.cpp static std::string serviceName = "default"; int main() { ... ServiceManager *manager = new ServiceManager(); if (!