<manifest xmlns:android="http://schemas.android.com/apk/res/android" // 命名空间
android:versionCode="1" // 版本号,会被gradle中覆盖,不推荐
android:versionName="1.0" // 版本名称,同上
android:sharedUserId="net.loosash.share" // sharedUserId 本文详细介绍
android:sharedUserLabel="@string/app_name" // 为用户提供一个可读的标签,value仅能使用资源id
android:installLocation="internalOnly" // 安装位置 默认internalOnly:只能安装在内部存储中;preferExternal:安装在外部存储中,当不可用时安装在内部存储中,安装后用户能够经过系统设置移动安装位置;auto:用户能够选择安装在内部存储仍是外部存储中。
package="net.loosash.learnmanifest">
......
</manifest>
复制代码
咱们都知道android的每个应用都运行在单独的虚拟机上,以便提升系统的稳定性,每一个应用进程都是由单独的Linux系统用户所建立,相同的sharedUserId的应用归属的linux相同的用户,资源共享则有不少的的便利能够利用。 我作了一个测试,使用adb shell top命令查看进程。 附带adb shell top命令解析linux
>adb shell top -h
Usage: top [ -m max_procs ] [ -n iterations ] [ -d delay ] [ -s sort_column ] [-t ] [ -h ]
-m num Maximum number of processes to display. 最多显示多少个进程
-n num Updates to show before exiting. 刷新次数
-d num Seconds to wait between updates. 刷新间隔时间(默认5秒)
-s col Column to sort by (cpu,vss,rss,thr). 按哪列排序
-t Show threads instead of processes. 显示线程信息而不是进程
-h Display this help screen. 显示帮助文档
复制代码
这张图是两个应用使用不一样的sharedUserId android
下面这张图是改为了相同的sharedUserId shell
如下两个应用的包名分别为net.loosash.learnshareduserid(A应用)、net.loosash.learnshareduserid2(B应用) 一、获取同名sharedUserId应用SP 固然SP存储的跨应用处理还有其余方式,具体会在SP部分中进行说明,这里特指getSharePreferences(String name ,@PreferencesMode int mode)方法中mode为Context.MODE_PRIVATE状况。 经过拿到Context来操做SP的读取。 A应用中储存数据库
val preferences = getSharedPreferences("sp", Context.MODE_PRIVATE)
preferences.edit().putInt(key_test_int, 1024).apply()
Log.d(tag,"获取sp内$key_test_int 值为${preferences.getInt(key_test_int,0)}")
复制代码
B应用中读取SPbash
val otherContext = this.createPackageContext("net.loosash.learnshareduserid",Context.CONTEXT_IGNORE_SECURITY)
val preferences = otherContext.getSharedPreferences("sp", Context.MODE_PRIVATE)
Log.d(tag,"获取sp内$key_test_int 值为${preferences.getInt(key_test_int,0)}")
复制代码
查看日志输出 A应用微信
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
复制代码
// var file = File("/data/data/net.loosash.learnshareduserid/test.txt")
var file = File("/data/data/net.loosash.learnshareduserid/test_from_b.txt")
if (!file.exists()) {
file.createNewFile()
}
// 在B中将B的test_from_b写入A
var input = this.assets.open("test_from_b.txt")
// 在B中将A的test写入A
// var input = otherContext.assets.open("test.txt")
var output = FileOutputStream(file)
val buffer = ByteArray(1024)
while (input.read(buffer) != -1) {
output.write(buffer, 0, input.read(buffer))
}
input.close()
output.close()
复制代码
在不一样sharedUserId时,运行B,报错Permission denied,没法访问A的data/data 目录app
不一样应用之间能够经过设置相同sharedUserId来实如今Linux上的用户统一,来打破不一样应用间的沙盒性质,已实现数据、资源的共享。测试