在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;我们再来看下system_data_file在file_contexts.te中的定义
/data(/.*)? u:object_r:system_data_file:s0
./file.te:56:type system_data_file, file_type, data_file_type;
/data/download(/.*)? u:object_r:download_data_file:s0
type download_data_file, file_type;然后在recovery.te中增加对download_data_file的权限
allow recovery download_data_file:dir { write search remove_name }; allow recovery download_data_file:file { read getattr unlink };
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
allow uncrypt download_data_file:dir { search getattr }; allow uncrypt download_data_file:file { getattr read open };
最后这个问题就解决了。