Manifest中的sharedUserId

640?wx_fmt=gif

点击“奇舞移动技术”关注我们!

一、manifest标签包含内容

<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.learnshareduserid">	
    ......	
</manifest>

二、sharedUserId注意事项

  • sharedUserId的value必须包含一个".",否则在打包安装到手机的时候会报错。

  • 某些功能的实现需要对相同shareUserId的apk使用相同的签名。

三、对sharedUserId的理解

我们都知道android的每一个应用都运行在单独的虚拟机上,以便提高系统的稳定性,每个应用进程都是由单独的Linux系统用户所创建,相同的sharedUserId的应用归属的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.  显示帮助文档 

这张图是两个应用使用不同的sharedUserId640?wx_fmt=png

下面这张图是改成了相同的sharedUserId640?wx_fmt=png

四、对于相同sharedUserId的使用

以下两个应用的包名分别为net.loosash.learnshareduserid(A应用)、net.loosash.learnshareduserid2(B应用) 1、获取同名sharedUserId应用SP

    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应用中读取SP

    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)}")

查看日志输出640?wx_fmt=pngB应用640?wx_fmt=png可见不同的应用共享SP中的数据了,同理数据库也同样共享fromb.txt

manifest中增加权限

      <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)	
	
    input.bufferedReader().useLines { lines ->	
        lines.forEach {	
            output.write((it+"\n").toByteArray())	
        }	
    }	
    input.close()	
    output.close()

在不同sharedUserId时,运行B,报错Permission denied,无法访问A的data/data 目录640?wx_fmt=png访问A的 data/data 目录,无test.txt及testfromb.txt640?wx_fmt=png修改相同sharedUserId,运行B,访问 data/data 目录,发现已经存在test.txt及testfromb.txt640?wx_fmt=png

五、总结

不同应用之间可以通过设置相同sharedUserId来实现在Linux上的用户统一,来打破不同应用间的沙盒性质,已实现数据、资源的共享,当然也会带来的稳定性的影响。

demo地址

https://github.com/loosaSH/android-sharedUsesrId

--END--

640?wx_fmt=png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值