原文 https://blog.csdn.net/kc58236582/article/details/51752765
在recover升级的时候,我们有个需要从服务器上下载升级包,然后放在data/download,这部分工作是放在一个systemapp中完成的。
然后重启进入recoveyr模式,在recovery升级完之后,我们需要在recovery中删除这个文件,这部分是在recovery中完成。
功能很简单,但是在android6.0上碰到selinux的问题。
我们先来看recovery.te中是不允许recovery操作data下面的目录,也就是下面这个neverallow原则
- # Recovery should never touch /data.
- #
- # In particular, if /data is encrypted, it is not accessible
- # to recovery anyway.
- #
- # For now, we only enforce write/execute restrictions, as domain.te
- # contains a number of read-only rules that apply to all
- # domains, including recovery.
- #
- # TODO: tighten this up further.
- neverallow recovery data_file_type:file { no_w_file_perms no_x_file_perms };
- neverallow recovery data_file_type:dir no_w_dir_perms;
- /data(/.*)? u:object_r:system_data_file:s0
而在file.te定义了system_data_file文件属于data_file_type类型,因此recovery也是不能操作data下面的文件
- ./file.te:56:type system_data_file, file_type, data_file_type;
在我们可以自己定义自己的file类型,我们可以定义data/download属于download_data_file类型
- /data/download(/.*)? u:object_r:download_data_file:s0
然后在file.te中定义download_data_file类型, 注意是只属于file_type类型的。
- type download_data_file, file_type;
- allow recovery download_data_file:dir { write search remove_name };
- allow recovery download_data_file:file { read getattr unlink };
另外我们还需在一个systemapp中先下载升级包,所以需要在system_app.te中增加对如下权限:
- allow system_app download_data_file:dir { search write add_name getattr remove_name };
- allow system_app download_data_file:file { create read write open getattr unlink };
但是最后还是失败了,为什么呢,因为一开始没有data/download这个目录,而是我们再app中自己下载的时候创建的目录,所以是system_data_file类型的。那么我们就需要在一开始就有data/download目录,所以在init.rc中添加如下代码:
- mkdir /data/download 0771 system system
最后我们还需要在uncrypt.te中增加如下,因为data目录有可能需要进行加密处理。
- allow uncrypt download_data_file:dir { search getattr };
- allow uncrypt download_data_file:file { getattr read open };