selinux策略文件的编译与加载 |
您所在的位置:网站首页 › sepolicy未被正确加载是什么 › selinux策略文件的编译与加载 |
注:本文写于2020年,基于Android11,Android12之后代码有些许变化,但是代码逻辑还是没变. 本文分析了selinux策略文件 在开机时的加载过程.selinux文章很多,写这个的应该不多. 一、编译 用法1:编译selinux make sepolicy -j48 或 make selinux_policy -j48 把生成的文件 \out\target\product\XXXX\obj\ETC\vendor_sepolicy.cil_intermediates\vendor_sepolicy.cil push(out\target\product\XXXX\vendor\etc\selinux\vendor_sepolicy.cil)到 /vendor/etc/selinux 目录下 注:当前以规则文件 vendor_sepolicy.cil 为例。 备份后删除/odm/etc/selinux/precompiled_sepolicy文件 重启手机后生效 用法2(推荐):编译selinux make selinux_policy -j48 make编译大约 3~17分钟 如果make编译过了,可使用ninja编译,不到一分钟就可以编译完成 time prebuilts/build-tools/linux-x86/bin/ninja -f out/combined-XXXX.ninja -j48 selinux_policy time prebuilts/build-tools/linux-x86/bin/ninja -f out/combined-XXXX.ninja -j48 sepolicy.recovery 备份/odm/etc/selinux/precompiled_sepolicy文件 把生成的文件out\target\product\klein\odm\etc\selinux\precompiled_sepolicy,push到/odm/etc/selinux/目录下 重启手机后生效 注:App上下文seapp_contexts,文件上下文 file_contexts ,属性上下文 property_contexts 的修改生效方法,见文末 二、原理 原理简介:手机启动后,进入加载selinux政策流程,会使用/odm/etc/selinux/目录下的两个sha256文件中的值分别同/system/etc/selinux,/product/etc/selinux 目录的sha256文件中的值对比,如果都相等,则加载/odm/etc/selinux/目录下的/odm/etc/selinux/precompiled_sepolicy 预编译的selinux二进制政策文件。如果不同,则使用/system/etc/selinux 和 /vendor/etc/selinux 等目录下的文件重新编译 selinux二进制政策文件,然后加载新的 sepolicy 文件。 详解 1、selinux政策加载流程(加载sepolicy 二进制文件流程) 函数调用流程:system/core/init/main.cpp ---> selinux.cpp ---> int SetupSelinux(char** argv) ---> SelinuxInitialize(); ---> LoadPolicy() ---> LoadSplitPolicy() ---> FindPrecompiledSplitPolicy(std::string* file) // 关键函数 函数调用流程讲解:开机启动时会加载selinux政策。main.cpp 中调用 selinux.cpp 中的 int SetupSelinux(char** argv) 函数,SetupSelinux 调用SelinuxInitialize(),SelinuxInitialize() 调用 LoadPolicy() 函数 int SetupSelinux(char** argv) { ··· // Set up SELinux, loading the SELinux policy. SelinuxSetupKernelLogging(); SelinuxInitialize(); ··· return 1; } void SelinuxInitialize() { ··· LOG(INFO) |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |