[Android10 定制] 系统级 app 无法正确执行二进制文件

2022-07-06 21:02:54 +08:00
 zinwalin

自家的 System App(比如 Home Launcher)里面通过 Runtime.getRuntime().exec("$command\n")来调用这个二进制文件时,无法正常执行(没有写入文件的实际操作),但是在 adb shell 下是可以正常执行的。

SELinux 的权限问题已经解决,执行时无报错了。

备注: 此二进制文件的功能是把一个文件写入覆盖到某个分区,从某个文件拷贝数据,然后写入到此分区所在的设备块上。

6491 次点击
所在节点    Android
13 条回复
codehz
2022-07-06 21:58:13 +08:00
(虽然正常思路是做一个特权系统服务,然后通过 binder 向应用提供功能(
因为即使是特权应用也是拿不到 shell 级别的权限的(
非得野路子的话,就把系统 root 了吧,放个自定义 su ,自动给特定 uid 开 shell
zinwalin
2022-07-06 22:47:20 +08:00
@codehz 公司卖的平板,正式版本是去年 su 的,安全考虑,我试着把相应类型的 device 加入相关的.te 文件里。
scys
2022-07-07 01:10:39 +08:00
SELinux 是关闭,还是你写了规则?
如果规则的话,看看有没有给与执行权限,并且路径必须准确。
而这个二进制的需求,你都已经是 System 权限了,为啥不用 Java 实现?
yuedashi
2022-07-07 08:08:18 +08:00
虽然你说没 selinux 权限报错了,我还是建议先 adb shell setenforce 0 .
zinwalin
2022-07-07 09:26:33 +08:00
@scys 二进制有可执行的权限,shell 下可以执行,二进制代码涉及到打开 /dev/block/mmcblk0p1 设备,但是失败了。
zinwalin
2022-07-07 09:26:59 +08:00
@yuedashi 已经加上了,还是一样。selinux 是 permissive.
zinwalin
2022-07-07 09:37:20 +08:00
@yuedashi

我在 system_app.te 里加了这三行

allow system_app system_file:file { open read execute_no_trans }; // 解决二进制文件 execute_no_trans 问题
allow system_app sdcard_block_device:chr_file rwx_file_perms;
allow system_app sdcard_block_device:chr_file { open read write ioctl };
zinwalin
2022-07-07 09:37:27 +08:00
@scys


我在 system_app.te 里加了这三行

allow system_app system_file:file { open read execute_no_trans }; // 解决二进制文件 execute_no_trans 问题
allow system_app sdcard_block_device:chr_file rwx_file_perms;
allow system_app sdcard_block_device:chr_file { open read write ioctl };
tsann
2022-07-14 08:53:53 +08:00
可以让 init 来执行这个二进制文件,随着 Android 系统权限的收紧在 App 里执行特殊权限的命令越来越麻烦

1.在 init.target.rc 里定义一个 service ,比如:
service write_xxx system/bin/write_xxx

再定义一个触发条件:
on property:sys.write_start=1
start write_xxx
setprop sys.write_start 0

2. 在 App 或系统服务代码里执行
SystemProperties.set ("splash.write_start","1"); 就会触发 start write_xxx 的执行
tsann
2022-07-14 08:54:35 +08:00
然后等待 sys.write_start 是否为 0 ,来判断 write_xxx 是否完成
zinwalin
2022-07-14 10:43:54 +08:00
@ican147 太强了。 顺便问一下,sys.write_start 需要在其它地方先声明吗?
tsann
2022-07-14 14:27:09 +08:00
sys.write_start 不用其它地方声明,但可能要调试一下,在 system/core/init/里可能有对这个 action 做限制,像 Android9 里有个 kExportedActionableProperties 数组用来定义可以触发 action 的 Properties
zinwalin
2022-07-14 19:11:07 +08:00
@ican147 感谢分享,很有用。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/864524

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX