高通vendor app访问文件
一、什么是vendor app?
Vendor App:通常指设备制造商(OEM)预装在系统中的应用程序或服务,可能与硬件功能(如芯片组、传感器等)深度集成。
在设备中,显著特征是安装在 /vendor/app下的应用。
1.1 vendor app与普通应用和系统应用区别
一句话总结:
- 普通应用: 第三方 APK,装在
/data/app
,域untrusted_app_*
,无特权。 - 系统应用: 预置在
system/product/system_ext
,分为普通系统应用与特权系统应用(在priv-app
且允许清单放行)。 - Vendor 应用: 预置在
vendor
分区,域通常为vendor_app
;放到vendor/priv-app
并被放行后才具备特权。
1.2 关键差异维度
- 安装位置
- 普通应用:
/data/app
- 系统应用:
/system/app
、/product/app
、/system_ext/app
(或对应priv-app
) - Vendor 应用:
/vendor/app
(或/vendor/priv-app
)
- 普通应用:
- 签名与权限
- 普通应用: 只能拿普通/危险权限;
signature
权限需与定义方同签名。 - 系统应用(非特权): 预置但无特权;若与平台同签可拿
signature
(平台定义的)。 - 特权应用(任一分区的
priv-app
): 可获标记为privileged
的权限,但必须在对应分区的privapp-permissions-*.xml
白名单中显式放行。
- 普通应用: 只能拿普通/危险权限;
- SELinux 域(示意,随版本可能有细微差异)
- 普通应用:
untrusted_app
/untrusted_app_*
- 系统应用(非特权): 常见为
platform_app
/system_app
- 特权应用:
priv_app
- Vendor 应用(非特权):
vendor_app
- 普通应用:
- 接口可达性
- 普通/非特权系统/vendor 应用: 受隐藏 API 限制,不能访问私有/灰名单 API。
- 特权/平台应用: 可通过白名单获得少量豁免(需系统侧配置,强约束)。
- 数据与沙箱
- 三者均为独立应用沙箱,默认不能访问他人
/data/data/<pkg>
;即便文件 777 或属主为system
,也会被父目录与 SELinux 拦截。
- 三者均为独立应用沙箱,默认不能访问他人
- 硬件与服务访问
- Vendor 应用可按设备 sepolicy 授权访问特定 vendor 服务/HAL;普通应用一般不行。
- 可更新性
- 预置(系统/vendor)应用可被
/data/app
的同包名更高版本“覆盖更新”;特权资格取决于安装位与白名单,而非是否被后续更新覆盖。
- 预置(系统/vendor)应用可被
1.3 判断你手头 APK 属于哪类(开发机上)
adb shell pm path <pkg>
看安装路径是否在/data/app
、/system*
、/product
、/system_ext
、/vendor
。adb shell dumpsys package <pkg> | grep -i 'isSystem\|isPrivileged'
adb shell ps -A -o label,user,name | grep <pkg>
看 SELinux 域(如u:r:vendor_app:s0
、u:r:priv_app:s0
)。
二、vendor app访问文件系统
2.1 私有应用目录
vendor app可直接访问私有应用目录。
把文件放到 /data/user/0/<package>/files
,应用可直接读写。
或者 /data/data/<package>/files
应用可直接访问。文件权限可以设置777.
2.1.1 是否私有目录的读写不受限制呢?
vendor app 访问应用私有目录 /data/data/<package>/files/ark_000008_20250725_8850,发现模型ark_000008_20250725_8850访问失败。ark_000008_20250725_8850所有者 system:system, 读写权限777。
- 目录遍历被挡住:
/data/data/<package>
目录本身通常是0700 u0_aXXX:u0_aXXX
,外部进程无法通过父目录,即使子文件是777
也无效。 - SELinux 强制访问控制:私有目录和其中文件标记为
u:object_r:app_data_file:s0:cNNN,cMMM
(带 category),进程域(如u:r:priv_app:s0
/u:r:untrusted_app_*:s0
/u:r:vendor_app:s0
)不匹配会被拒绝。DAC 放行也会被 MAC 拦截。
可用命令验证(需 root/userdebug):
adb shell ls -ld /data/data/<package>
adb shell ls -lZ /data/data/<package>/files/ark_000008_20250725_8850
如果用户权限 root:root,读写权限777, vendor app可以访问。
2.2 shell工作区间
/data/local/tmp
仅 shell
/root
可访问,目录权限与 SELinux(shell_data_file
类型)会阻止普通 APP,包括 vendor/system/priv-app。
2.2.1 例外(仅限开发/自编 ROM/Root 环境)
- 设备是
userdebug/eng
,或已 root:可通过调整策略或权限后访问(例如setenforce 0
、改目录权限、或为应用添加 SELinux allow 规则)。量产 user 设备不可行。 - 让应用以
shell
UID 运行(平台签名 +sharedUserId="android.uid.shell"
):强烈不推荐,新版 Android 限制多且有合规风险。
2.2.2 推荐替代方案
应用私有目录:把文件放到
/data/user/0/<package>/files
,应用可直接读写。- 调试场景(需 debuggable 包)可用:
adb push foo /data/local/tmp/ adb shell run-as <package> cp /data/local/tmp/foo /data/user/0/<package>/files/
- 调试场景(需 debuggable 包)可用:
外部存储/SAF:把文件放到
Download
,用存储访问框架读取(Android 10+ 遵循分区存储与READ_MEDIA_*
权限)。通过服务/Provider:用自定义
ContentProvider
、Binder 服务、或本地 HTTP/Socket 把数据送入应用沙箱。内置资源:将测试数据打包进
assets/
或res/raw/
。调试专用接口:若是自研系统,可在自编 ROM 的 sepolicy 中为特定
vendor_app
放行访问(仅限内部测试)。结论:在标准量产设备上,vendor app 不能访问
/data/local/tmp
;请改用应用沙箱或上述替代路径。