在系统签名的应用程序中使用自定义 RenderScript
Use custom RenderScript in system signed application
如何在由系统证书签名的应用程序中使用自定义 RenderScript 脚本?
LogCat 输出:
E/RenderScript: Failed loading RS driver: dlopen failed: cannot locate symbol "_ZN7android12renderscript15RsdCpuReference6createEPNS0_7ContextEjjPFPKNS1_9CpuSymbolES3_PKcEPFPNS1_9CpuScriptES3_PKNS0_6ScriptEEPFPN4llvm6ModuleEPN3bcc8RSScriptESK_SK_EPFS8_S8_jES8_" referenced by "/system/vendor/lib/libRSDriver_adreno.so"...
E/RenderScript: Failed to load runtime libRSDriver_adreno.so, loading default
W/EventThread: type=1400 audit(0.0:200): avc: denied { execute } for path="/data/user_de/0/[packageName]/code_cache/com.android.renderscript.cache/librs.rgb2yuv.so" dev="mmcblk0p25" ino=65890 scontext=u:r:system_app:s0 tcontext=u:object_r:system_app_data_file:s0 tclass=file permissive=0
W/EventThread: type=1300 audit(0.0:200): arch=40000028 syscall=192 per=800008 success=no exit=-13 a0=9aa80000 a1=6c0 a2=5 a3=12 items=0 ppid=336 ppcomm=main auid=4294967295 uid=1000 gid=1000 euid=1000 suid=1000 fsuid=1000 egid=1000 sgid=1000 fsgid=1000 tty=(none) ses=4294967295 exe="/system/bin/app_process32" subj=u:r:system_app:s0 key=(null)
W/auditd: type=1323 audit(0.0:200): fd=120 flags=0x12
W/auditd: type=1327 audit(0.0:200): proctitle="[packageName]"
W/auditd: type=1320 audit(0.0:200):
E/RenderScript: Unable to open shared library (/data/user_de/0/[packageName]/code_cache/com.android.renderscript.cache/librs.rgb2yuv.so): dlopen failed: couldn't map "/data/user_de/0/[packageName]/code_cache/com.android.renderscript.cache/librs.rgb2yuv.so" segment 0: Permission denied
看起来像是权限问题,因为此文件 /data/user_de/0/[packageName]/code_cache/com.android.renderscript.cache/librs.rgb2yuv.so
存在于 phone。
我有自己的 Android OS 版本(具体来说是 Lineage 14.1),所以我可以更改权限。我已经设法让我的应用程序访问 video_device(通过从 sepolicy 存储库 app.te
文件中的 neverallow
块中排除 system_app
)。但是我找不到系统应用程序和渲染脚本权限之间的任何联系。
我终于设法解决了这个问题。
RenderScript 代码正在编译为共享库文件 (.so) 并放置在 /data directory/partition 中。 SELinux 策略,在 LineageOS14.1 中实现,正在阻止 system_app(这是一种策略规则被“分配”的类型,由系统证书签名的应用程序被识别为这种类型), 在 system_app_data_file 上执行(这是存储各种系统应用程序数据的类型识别目录,在我的例子中是编译的 RenderScript 库)。
加载库需要执行权限,这就是打印日志的原因(denied {execute} ...
)。
那么,它能做什么?
在 AOSP 中,/system/sepolicy
存储库需要进行少量更改:
1 system_app.te
: 允许 system_app 在 system_app_data_file[=32 上执行=]
diff --git a/system_app.te b/system_app.te
index 50320c5..25ebf06 100644
--- a/system_app.te
+++ b/system_app.te
@@ -11,6 +11,7 @@ binder_service(system_app)
# Read and write /data/data subdirectory.
allow system_app system_app_data_file:dir create_dir_perms;
allow system_app system_app_data_file:{ file lnk_file } create_file_perms;
+allow system_app system_app_data_file:{ file lnk_file } { execute };
# Read and write to /data/misc/user.
allow system_app misc_user_data_file:dir create_dir_perms;
但是,此修改还不够 - 现在构建 ASOP 将以错误结束,指出其他规则与此规则冲突。
2 app.te
:添加 system_app_data_file 作为从 /data
执行的 neverallow
的例外
diff --git a/app.te b/app.te
index 19a7dac..7a34645 100644
--- a/app.te
+++ b/app.te
@@ -453,18 +454,19 @@ neverallow appdomain {
# Blacklist app domains not allowed to execute from /data
neverallow {
bluetooth
isolated_app
nfc
radio
shared_relro
system_app
} {
data_file_type
-dalvikcache_data_file
-system_data_file # shared libs in apks
+ -system_app_data_file
-apk_data_file
}:file no_x_file_perms;
这条规则,未经我的更改,正在阻止 system_app 在文件上执行 - 修改为 system_app_data_file 添加了一个例外.
如何在由系统证书签名的应用程序中使用自定义 RenderScript 脚本?
LogCat 输出:
E/RenderScript: Failed loading RS driver: dlopen failed: cannot locate symbol "_ZN7android12renderscript15RsdCpuReference6createEPNS0_7ContextEjjPFPKNS1_9CpuSymbolES3_PKcEPFPNS1_9CpuScriptES3_PKNS0_6ScriptEEPFPN4llvm6ModuleEPN3bcc8RSScriptESK_SK_EPFS8_S8_jES8_" referenced by "/system/vendor/lib/libRSDriver_adreno.so"...
E/RenderScript: Failed to load runtime libRSDriver_adreno.so, loading default
W/EventThread: type=1400 audit(0.0:200): avc: denied { execute } for path="/data/user_de/0/[packageName]/code_cache/com.android.renderscript.cache/librs.rgb2yuv.so" dev="mmcblk0p25" ino=65890 scontext=u:r:system_app:s0 tcontext=u:object_r:system_app_data_file:s0 tclass=file permissive=0
W/EventThread: type=1300 audit(0.0:200): arch=40000028 syscall=192 per=800008 success=no exit=-13 a0=9aa80000 a1=6c0 a2=5 a3=12 items=0 ppid=336 ppcomm=main auid=4294967295 uid=1000 gid=1000 euid=1000 suid=1000 fsuid=1000 egid=1000 sgid=1000 fsgid=1000 tty=(none) ses=4294967295 exe="/system/bin/app_process32" subj=u:r:system_app:s0 key=(null)
W/auditd: type=1323 audit(0.0:200): fd=120 flags=0x12
W/auditd: type=1327 audit(0.0:200): proctitle="[packageName]"
W/auditd: type=1320 audit(0.0:200):
E/RenderScript: Unable to open shared library (/data/user_de/0/[packageName]/code_cache/com.android.renderscript.cache/librs.rgb2yuv.so): dlopen failed: couldn't map "/data/user_de/0/[packageName]/code_cache/com.android.renderscript.cache/librs.rgb2yuv.so" segment 0: Permission denied
看起来像是权限问题,因为此文件 /data/user_de/0/[packageName]/code_cache/com.android.renderscript.cache/librs.rgb2yuv.so
存在于 phone。
我有自己的 Android OS 版本(具体来说是 Lineage 14.1),所以我可以更改权限。我已经设法让我的应用程序访问 video_device(通过从 sepolicy 存储库 app.te
文件中的 neverallow
块中排除 system_app
)。但是我找不到系统应用程序和渲染脚本权限之间的任何联系。
我终于设法解决了这个问题。
RenderScript 代码正在编译为共享库文件 (.so) 并放置在 /data directory/partition 中。 SELinux 策略,在 LineageOS14.1 中实现,正在阻止 system_app(这是一种策略规则被“分配”的类型,由系统证书签名的应用程序被识别为这种类型), 在 system_app_data_file 上执行(这是存储各种系统应用程序数据的类型识别目录,在我的例子中是编译的 RenderScript 库)。
加载库需要执行权限,这就是打印日志的原因(denied {execute} ...
)。
那么,它能做什么?
在 AOSP 中,/system/sepolicy
存储库需要进行少量更改:
1 system_app.te
: 允许 system_app 在 system_app_data_file[=32 上执行=]
diff --git a/system_app.te b/system_app.te
index 50320c5..25ebf06 100644
--- a/system_app.te
+++ b/system_app.te
@@ -11,6 +11,7 @@ binder_service(system_app)
# Read and write /data/data subdirectory.
allow system_app system_app_data_file:dir create_dir_perms;
allow system_app system_app_data_file:{ file lnk_file } create_file_perms;
+allow system_app system_app_data_file:{ file lnk_file } { execute };
# Read and write to /data/misc/user.
allow system_app misc_user_data_file:dir create_dir_perms;
diff --git a/system_app.te b/system_app.te
index 50320c5..25ebf06 100644
--- a/system_app.te
+++ b/system_app.te
@@ -11,6 +11,7 @@ binder_service(system_app)
# Read and write /data/data subdirectory.
allow system_app system_app_data_file:dir create_dir_perms;
allow system_app system_app_data_file:{ file lnk_file } create_file_perms;
+allow system_app system_app_data_file:{ file lnk_file } { execute };
# Read and write to /data/misc/user.
allow system_app misc_user_data_file:dir create_dir_perms;
但是,此修改还不够 - 现在构建 ASOP 将以错误结束,指出其他规则与此规则冲突。
2 app.te
:添加 system_app_data_file 作为从 /data
执行的 neverallow
的例外
diff --git a/app.te b/app.te
index 19a7dac..7a34645 100644
--- a/app.te
+++ b/app.te
@@ -453,18 +454,19 @@ neverallow appdomain {
# Blacklist app domains not allowed to execute from /data
neverallow {
bluetooth
isolated_app
nfc
radio
shared_relro
system_app
} {
data_file_type
-dalvikcache_data_file
-system_data_file # shared libs in apks
+ -system_app_data_file
-apk_data_file
}:file no_x_file_perms;
这条规则,未经我的更改,正在阻止 system_app 在文件上执行 - 修改为 system_app_data_file 添加了一个例外.