Android init.rc配置EVS App开机启动
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android init.rc配置EVS App开机启动相关的知识,希望对你有一定的参考价值。
参考技术A 1、init.rc相关知识参考 https://www.jianshu.com/p/cb73a88b0eed ,这里不详解。2、添加service
在init.rc中添加evs app服务:
service evs_app /system/bin/evs_app --hw
class main
priority -20
user automotive_evs
group automotive_evs
选项 描述
console [<console>] 此服务需要一个控制台。可选的第二个参数选择特定的控制台而不是默认控制台
critical 这是一项设备关键型服务。 如果它在四分钟内退出四次以上,设备将重启进入恢复模式
disabled 服务不会自动运行,必须显式地通过服务器来启动。
setenv <name> <value> 设置环境变量
socket <name> <type> <perm> [ <user> [ <group> [ <seclabel>] ] ] 在/dev/socket/下创建一个unix domain的socket,并传递创建的文件描述符fd给服务进程.其中type必须为dgram或stream,seqpacket.用户名和组名默认为0
enter_namespace <type> <path> 输入位于_path_的_ type_类型的命名空间。 _type_设置为“net”时仅支持网络命名空间。 请注意,只能输入给定_type_的一个名称空间
file <path> <type> 打开文件路径并将其fd传递给已启动的进程。 _type_必须是 “r”,“w”或“rw”。
user <username> 在执行此服务之前先切换用户名。当前默认为root.
group <groupname> [ <groupname>* ] 类似于user,切换组名
capabilities <capability> [ <capability>* ] 执行此服务时设置功能
setrlimit <resource> <cur> <max> 这将给定的rlimit应用于服务
seclabel <seclabel> Change to ‘seclabel’ before exec’ing this service
oneshot 当此服务退出时不会自动重启.
class <name> [ <name>* ] 给服务指定一个类属,这样方便操作多个服务同时启动或停止.默认情况下为default
onrestart 当服务重启时执行一条指令
writepid <file> [ <file>* ] Write the child’s pid to the given files when it forks
priority <priority> 调度服务进程的优先级。 该值必须在范围内 -20到19,-20优先级最高。
3、启动服务
class main的service会统一在class_start main时调起
4、配置selinux权限
(1)高版本的android系统有一套SEAndroid安全机制,SEAndroid扩展自SELinux,如何配置这个evs app的selinux权限:在rc的同级目录下一般会有sepolicy文件夹,里面会有一个file_contexts文件,新建一个evs_app.te文件,参考 https://android.googlesource.com/platform/packages/services/Car/+/master/evs/sepolicy/evs_app.te ,内容如下:
# evs app
type evs_app, domain, coredomain;
hal_client_domain(evs_app, hal_evs)
hal_client_domain(evs_app, hal_vehicle)
hal_client_domain(evs_app, hal_configstore)
hal_client_domain(evs_app, hal_graphics_allocator)
# allow init to launch processes in this context
type evs_app_exec, exec_type, file_type, system_file_type;
init_daemon_domain(evs_app)
# gets access to its own files on disk
type evs_app_files, file_type, system_file_type;
allow evs_app evs_app_files:file getattr open read ;
allow evs_app evs_app_files:dir search;
# Allow use of gralloc buffers and EGL
allow evs_app gpu_device:chr_file rw_file_perms;
allow evs_app ion_device:chr_file r_file_perms;
allow evs_app system_file:dir r_dir_perms;
# Allow use of binder and find surfaceflinger
binder_use(evs_app);
allow evs_app surfaceflinger_service:service_manager find;
(2)在file_contexts中添加/system/bin/evs_app u:object_r:evs_app_exec:s0
(3)在attributes文件中添加缺失type:system/sepolicy/public/attributes和system/sepolicy/prebuilts/api/28.0/public/attributes中(对应版本)添加attribute system_file_type;
5.做完上面这些,完整编译一次,烧录固件,开机时evs_app就能自启动了。
android核心服务初探
终于进入android学习的进阶阶段,第一个课题是android的核心服务。首先,让我们来认识一下核心服务。
android核心服务与app服务有所区别。app服务继承自Service基类,在app运行时启动并绑定到Activity上。核心服务是在设备开机时解析init.rc文件预装在系统中的,早于任何一个app进程和app服务。app服务是有ActivityManangerServiec启动并绑定,而核心服务必须在ServiceManager中注册。
核心服务有分为native service和android service两种。一般来说,native service有c/c++编写,主要实现靠近驱动层的功能,android service由java编写,主要实现靠近app的功能。不管是何种核心服务,都运行在于app不同的进程中,因此,app想要与核心服务通信就必须使用IPC。
IPC是android中解决进程间通信的精巧框架,代码不多,功能强大。进程A想要与服务所在的进程B通信,必须先获取到服务的IBinder接口。IBinder接口,主要实现进程间的关联,将会在进程A中诞生一个BinderProxy。这个代理类,运行在进程A,将代理所有对进程B中的服务请求。对于进程A来说,就像是自身拥有这个服务。使用这样的client-server结构完美的实现了高内聚低耦合。
前面提到核心服务由ServiceManager启动和管理,其他进程要访问某服务都必须通过ServiceManager才能拿到IBinder接口。启动核心服务时,其中至关重要的一环是将核心服务登录到ManagerService中,代码如下:
int r = defaultServiceManager()->addService(String16("xxx"),new SQRService);
此时,意味着该核心服务可以被请求和绑定。请求IBinder接口代码如下:
m_ib = sm->getService(String16("xxx"));
从软硬整合的角度来说,核心服务的存在是为了让上层java应用程序使用Driver/HW Device特色的重要管道。基于android的开源特性,不同硬件厂家会有自主设计、性能各异的硬件设备,合理编写c层核心服务有利于充分发挥硬件特性。底层的优越设计将为上层应用的性能和用户体验提供强力支撑,可谓android框架中力与美的结合。
设计心得
刚才提到的client-server结构是IPC框架中的重要思想,我们在编写JNI层小框架的时候,也可以应用这个思想。其中的关键之处便是将控制点下移到c层,将服务程序封装在自己的框架中,高内聚低耦合。c层负责获取核心服务的IBinder接口并建立java层的BinderProxy对象,将BinderProxy的接口返回到java层。 代码如下:
sp<IServiceManager> sm = defaultServiceManager();
m_ib = sm->getService(String16("xxx");
jObject ibj = javaObjectForIBinder(env,mib);
以上是关于Android init.rc配置EVS App开机启动的主要内容,如果未能解决你的问题,请参考以下文章