Mr.*_*r.K 4 service android multi-user
对于基于AOSP源的嵌入式项目,我在一个(系统)应用程序中有大量数据,其他应用程序必须可以访问.是的,我知道:内容提供商或服务的典型工作,但是...设备上的所有用户配置文件上的应用程序必须能够访问相同的数据(该大块的相同单个实例)!
我已经发现Android为服务,内容提供者和接收者提供了一个android:singleUser ="true"属性,但它有令人讨厌的副作用,它迫使android:exported ="false"!因此,我假设一个解决方案可能是在我的Manifest中使用android:singleUser ="true",第二个是android:exported ="true",并且第二个只查询第一个实际数据另一个应用程序可能需要,但是...这看起来很难看,在我的情况下 - 单用户Android已经存在内容提供商和服务的应用程序,它将需要相当多的更改.
我还尝试将我的完整(系统)应用程序标记为android:persistent ="true",但是这导致访问/ data/data的一些部分存在大量数据存在的问题(我需要进一步调试才能进入根本原因).
所以,我的问题是:是否有任何简单/建议的方式来创建内容提供者(同一个应用程序中的服务和接收者的相同问题),以便应用程序真正充当多个用户的单身人士(不是系统服务,因为我们不希望通过运行我们的东西作为SystemServer的一部分来影响系统稳定性)?
使用android:singleUser ="true"与android:exported ="true"是正确的方法,但使用此属性有一些警告.
首先,除非您的应用具有INTERACT_ACCROSS_USERS权限,否则ActivityManagerService (isSingleton方法)将忽略此属性.
第二个(这是我认为您的问题所在),您的应用程序也必须作为特权应用程序安装在priv-app文件夹中(Android.mk中的"LOCAL_PRIVILEGED_MODULE:= true").否则,PackageParser将清除'android:exported'属性.
if (sa.getBoolean(
com.android.internal.R.styleable.AndroidManifestProvider_singleUser,
false)) {
p.info.flags |= ProviderInfo.FLAG_SINGLE_USER;
if (p.info.exported && (flags & PARSE_IS_PRIVILEGED) == 0) {
Slog.w(TAG, "Provider exported request ignored due to singleUser: "
+ p.className + " at " + mArchiveSourcePath + " "
+ parser.getPositionDescription());
p.info.exported = false;
}
}
Run Code Online (Sandbox Code Playgroud)
注意:以上所有内容不仅适用于提供商,也适用于服务和接收者.
更新:看起来作为特权应用程序包的测试仅出现在Android 5.0及更高版本中.早期版本只是删除了导出属性.
| 归档时间: |
|
| 查看次数: |
2607 次 |
| 最近记录: |