通过Android manifest中的sharedUserId属性的设置来实现apk之间的资源共享

android:sharedUserId作用 前言 Android给每个APK进程分配一个单独的空间,manifest中的userid就是对应一个分配的Linux用户ID,并且为它创建一个沙箱,以防止影响其他应用程序(或者被其他应用程序影响)。 通常,不同的APK会具有不同的userId,因此运行时属于不同的进程中,而不同进程中的资源是不共享的(比如只能访问/data/data/自己包名下面的文件),保障了程序运行的稳定。然后在有些时候,我们自己开发了多个APK并且需要他们之间互相共享资源,那么就需要通过设置shareUserId来实现这一目的。 阅读详情

在Android应用的开发中应该都会有两个进程中需要互相访问数据的需求,而在APK在安装到设备里的时候该应用的userid就已经确定了,

一般情况下都不会再改变,每个应用的进程在默认情况下的userid是不一样的,如adb shell下top命令显示的进程信息中的UID,

  PID PR CPU% S  #THR     VSS     RSS PCY UID      Name

 1436  2   0%    S    15 671956K  33284K  bg system   com.android.deskclock
 1459  2   0%    S    13 666772K  29656K  bg u0_a35   com.android.managedprovisioning
 1483  3   0%    S    23 683604K  36020K  bg u0_a42   com.android.mms
 1519  0   0%    S    23 687924K  39484K  bg u0_a36   com.android.email


那么UID(userid)都有什么作用呢?

众所周知,Android是基于Linux内核的操作系统,一般理解为User Identifier,UID在Linux中就是用户的ID,表明是哪个用户运行了这个程序,

主要用于权限的管理。Linux系统中不同的两个普通用户之间如果没有赋予权限是不能互相访问数据的。

而在Android 中又有所不同,因为Android为单用户系统,这时UID 便被赋予了新的使命——数据共享,为了实现数据共享,Android为每个

应用几乎都分配了不同的UID,不像传统的Linux,每个进程的用户相同就为之分配相同的UID,(当然这也就表明了一个问题,android只

能是单用户系统,在设计之初就被他们的工程师给阉割了多用户),使之成了数据共享的工具。


那么在Android中UID既然是用来进行数据共享的工具,那么我们怎么样才能做到数据共享呢?

Android中的数据共享方式有两种:

1)通过ContentProvider,这个方式是通过实现ContentProvider的抽象方法将需要共享的数据暴露出去,这个后续在细研究,如果需要实现

     组定义的ContentProvider,建议可以参考code/Lollipop/packages/providers/下的原生实现。

2)  通过在AndroidManifest中将android:sharedUserId属性,将需要互相访问的apk中的该属性设置成相同的,这样它们的UID就一样了,就可以

     互相访问各自的数据啦,包括数据库和文件等。

     示例:

     a)首先在AndroidManifest.xml中设置相同的sharedUserId(后面简称为UID),可以看到该id的命名可以随意,当然最好能表达其作用。

      应用一     

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="test.anna.hello"
    android:sharedUserId="anna.uid">
  应用二
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="test.anna.world"
    android:sharedUserId="anna.uid">
  b) 两个应用程序设置完相同的UID之后,为了安全起见,建议再到Android.mk中定义相同的签名,因为如果不设置相同的签名,一旦
     应用被破解,所设置的UID被暴露,其它应用通过设定相同的UID也可以任意访问我们的数据,这样非安全的共享其实没有什么意义了,
     那么这个签名怎么设置呢?
     参考如下:
     vi Android.mk #应用一和应用二都需要添加
     将LOCAL_CERTIFICATE := testkey添加mk文件中
     可能在这里对于LOCAL_CERTIFICATE的赋值,大家又会有疑问,可以使用的值都有哪些呢?
     在build/target/product/security目录中有四组默认签名供Android.mk在编译APK使用:


1、testkey:普通APK,默认情况下使用。


2、platform:该APK完成一些系统的核心功能。经过对系统中存在的文件夹的访问测试,这种方式编译出来的APK所在进程的UID为system。


3、shared:该APK需要和home/contacts进程共享数据。


4、media:该APK是media/download系统中的一环。


应用程序的Android.mk中有一个LOCAL_CERTIFICATE字段,由它指定用哪个key签名,未指定的默认用testkey
四组签名的原生注释可以查看build/target/product/security/README的说明。


  c)目前已经具备两个应用之间互相访问数据的权限,那么怎么互相访问呢?
     一方面是共享资源,要获取资源只要能拿到对方的context就可以,例如在应用二中创建应用一的context:
     Context context1 = this.createPackageContext(“test.anna.hello”,Context.CONTEXT_IGNORE_SECURITY);
     这里的this应该是Application或者Activity等有createPackageContext能力的类型相关实例。
     这样通过context1可以获取到应用一中的资源,包括:数据库,preference,资源文件等等
     例如通过context1获取应用一中的string:
     context1.getString(R.string.toast_message)


           其余资源获取方式查看Context的相关API进行使用。
     另一方面可能你还希望能够在应用二中使用应用一中的一些类,那么你可以通过修改应用二的Android.mk文件就可以mm通过,在该mk文件中添加如
     下这个编译变量的定义:
     LOCAL_APK_LIBRARIES += Hello  
     这样你可以编译通过,但是可能会有运行时错误,这个错误可能由于两个apk的classloader不一致,这个待后续验证再补充blog,今天累了。。。


参考:

1.http://www.cnblogs.com/perseus/articles/2354173.html

2.http://blog.youkuaiyun.com/wirelessqa/article/details/8581652

3.http://blog.youkuaiyun.com/hmg25/article/details/6447067




Android逆向之旅---Android中的sharedUserId属性详解 下面我们可以直接使用一个例子来看看效果:这个工程很简单,我们编译安装运行即可。这里有一个核心方法,我们首先通过插件工程的包名:cn.wjdiankong.shareuseridplugin;创建出一个Context对象。得到了Context变量之后,我们下面就可以通过反射来执行代码和获取资源了,下面我们运行结果看看:运行成功了啦~~是不是很简单呢。发现报错了,找不到指定的类。所以如果想运行代码的话,这个值一定要加上。看到了,爆出了安全错误,所以要想构造成功Context出来,必须要加上这个值。 阅读详情

相关推荐

Android应用间数据共享实战:sharedUserId的正确打开方式(附签名避坑指南)

本文深入解析了Android应用间数据共享机制sharedUserId的正确使用方法,重点阐述了其核心原理与签名一致性要求。通过实战案例,详细对比了自定义签名与系统平台签名两种方案的配置流程,并针对Android 15+的新限制提供了签名避坑指南,帮助开发者安全高效地实现多应用协同。

h0i1j2k3l的博客 408

添加系统级权限 android:sharedUserId=“android.uid.system“

关于android:sharedUserId=“android.uid.system“ 的使用

okk 1万+

Android系统级应用开发:深入解析sharedUserId与android.uid.system权限机制

在Android应用开发中,权限隔离与数据共享是构建安全、高效应用架构的核心基础。Android系统基于Linux内核的用户ID(UID)机制,为每个应用创建独立的沙箱环境,实现进程与数据的隔离。通过android:sharedUserId属性,开发者可以突破默认的沙箱限制,让多个应用共享同一个UID,从而实现深度的数据共享与权限继承。这一机制在系统级应用开发中尤为重要,尤其是android.uid.system这一特殊标识,它赋予应用与系统核心进程同等的权限级别,能够访问受保护的系统API、执行静默安装等

weixin_30902251的博客 326

Manifest中的sharedUserId

点击“奇舞移动技术”关注我们!一、manifest标签包含内容<manifest xmlns:android="http://schemas.android.com...

QiwooMobile的博客 336

R语言新手也能搞定!WGCNA分析全流程代码详解(附常见报错解决方案)

本文为R语言新手提供了WGCNA分析的完整代码流程与实战指南。从环境配置、数据准备、软阈值选择、网络构建到模块-表型关联分析,逐步详解核心步骤。重点针对安装依赖、内存不足等常见报错提供了具体解决方案,帮助初学者避开陷阱,顺利完成加权基因共表达网络分析。

terraform7cloud的博客 539

【机器学习】实验3,贝叶斯垃圾邮件识别(完整代码实现+报告)

电子邮件是互联网的一项重要服务,在大家的学习、工作和生活中会广泛使用。但是大家的邮箱常常被各种各样的垃圾邮件填充了。有统计显示,每天互联网上产生的垃圾邮件有几百亿近千亿的量级。因此,对电子邮件服务提供商来说,垃圾邮件过滤是一项重要功能。而朴素贝叶斯算法在垃圾邮件识别任务上一直表现非常好,至今仍然有很多系统在使用朴素贝叶斯算法作为基本的垃圾邮件识别算法。本次实验数据集来自的中文垃圾邮件数据集,目录解压后包含三个文件夹,其中data目录下是所有的邮件(未分词),已分词好的邮件在data_cut目录下。

高丽大学人工智能硕士在读|专注大模型、RAG、OCR与AI工程实践 5025

【AndroidManifest.xml详解】Manifest属性之sharedUserId、sharedUserLabel

android:sharedUserId当APK安装的时候,userid这个标志就会产生。APK在设备上的整个生命周期中,这个ID不再改变。不同设备上同一个应用包可能有不同的userid,重要的是在给定的设备上,每个应用包有自己独立的userid。userid的特点:1. 作为APK身份的标识 2. userid对应一个Linux用户,所以不同APK(用户)间互相访问数据默认是禁止的. 那么不同A...

zhuawalibai的博客 258

金蝶个版本下载地址,记得保存收藏。

专业版 V10.0 http://downloads.cmcloud.cn/kis/kis_pro/10.0/kiszybV10sp1.rar V11.0 http://downloads.cmcloud.cn/kis/kis_pro/11.0/KISV11Setup.rar V12.0 http://dow...

饺子的博客 2505

AndroidManifest.xml详解】Manifest属性之sharedUserId、sharedUserLabel

[转自 http://www.wirelessqa.com/?p=143] android:sharedUserId 当APK安装的时候,userid这个标志就会产生。APK在设备上的整个生命周期中,这个ID不再改变。不同设备上同一个应用包可能有不同的userid,重要的是在给定的设备上,每个应用包有自己独立的userid。 userid的特点: 1. 作为APK身份的标识

一头雾水的Blog 1259

用PyCharm+Scrapy打造你的第一个爬虫:从安装到实战(附完整代码)

本文详细介绍了如何使用PyCharm和Scrapy框架从零开始构建高效网络爬虫。通过环境配置、项目创建、核心爬虫逻辑编写到数据处理与存储的完整流程,帮助Python开发者快速掌握爬虫开发技巧,并附有实战代码示例。特别适合想要学习Scrapy框架和提升爬虫技能的开发者。

weixin_29038345的博客 868

UG/NX二次开发实例流程样例(nx1980+vs2019)

以上就是基本操作了,下面进入界面开发流程,nx1980的界面开发操作,也需要在块UI界面编辑器中操作,很多教程都没有讲解这一点,尤其是如何进入块UI界面编辑器,那么我在这里详细说明一下步骤。》,这一篇文章我们将详细讲述,如何开发一个具体的功能——根据用户输入的数据,在特定的点上创建一个指定大小的立方体。可以将文件保存当桌面,笔者保存在桌面的create_block目录中了,如下图所示,可以发现生成了三个文件。4.在新建模型完成后,我们准备创建交互UI,按照下图所示的顺序,找到块UI界面编辑器,。

秋月的私语 1万+

Android sharedUserId研究记录 【转】

原文地址:  http://blog.youkuaiyun.com/dyllove98/article/details/8836412 刚整理完的文档,顺便园子发个分享。因工作繁忙,还是有不少方面无法深入测试,欢迎各位回帖提出意见~   签名简介: 在Android 系统中,所有安装到系统的应用程序都必有一个数字证书,此数字证书用于标识应用程序的作者和在应用程序之间建立信任关系,。这个数字证书

sharemyfree的专栏 713

CAN通信:EB中配置CAN驱动,配置参数解析

以S32K314芯片说明,其他芯片不同,参数配置也有差异。

zhangxiaio1的博客 2167

Android基础之一:Manifest.xml

Manifest.xml是Android应用程序(Android Application)开发的基础配置文件,处于项目工程的最底层,全名为AndroidManifest.xml 首先Manifest文件是一个xml文件,必须符合xml文件定义规范 XML文件定义声明:<?xml version="" encoding="utf-8"?> 关键xml节点-->mani...

weixin_30735391的博客 170

光学设计进阶:Zemax中的坐标断点与离轴系统优化

本文深入解析了Zemax中坐标断点的核心原理与实战应用,它是实现离轴光学系统设计的关键。文章通过比喻和实例,详细阐述了如何利用坐标断点作为“方向盘”来精确控制光学元件的偏心和倾斜,实现“前断后接”的局部坐标系变换,从而构建并优化无中心遮拦的离轴反射系统,避免光线失控。

3a9bq4r8t2y的博客 525

CMOS Sensor的调试经验分享

我这里要介绍的就是CMOS摄像头的一些调试经验。 首先,要认识CMOS摄像头的结构。我们通常拿到的是集成封装好的模组,一般由三个部分组成:镜头、感应器和图像信号处理器构成。一般情况下,集成好的模组我们只看到外面的镜头、接口和封装壳,这种一般是固定焦距的。有些厂商只提供芯片,需要自己安装镜头,镜头要选择合适大小的镜头,如果没有夜视要求的话,最好选择带有红外滤光的镜头,因为一般的sensor都...

camerall 3763

Android安全和权限①----ShareUserId和文件访问(File Access)--Security and Permission

关于SharedUserId的总结:  我们知道一般每个app都有一个唯一的linux user ID,则这样权限就被设置成该应用程序的文件只对该用户可见,只对该应用程序自身可见,而我们可以使他们对其他的应用程序可见,这会使我们用到 SharedUserId,也就是让两个apk使用相同的userID,这样它们就可以看到对方的文件。为了节省资源,具有相同ID的apk也可以在相同 的li...

quanminchaoren 278

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Android应用插件式开发解决方法

转自:http://blog.youkuaiyun.com/arui319/article/details/8109650 一、现实需求描述 一般的,一个Android应用在开发到了一定阶段以后,功能模块将会越来越多,APK安装包也越来越大,用户在使用过程中也没有办法选择性的加载自己需要的功能模块。此时可能就需要考虑如何分拆整个应用了。 二、解决方案提出 一般有两种方式,一种是将应用按照功能分拆...

weixin_30709061的博客 84

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

初学Android ShareUserId(多应用共享资源和服务)

Android里面每个app都有一个唯一的linuxuserID。我们通过SharedUserId,让使用相同的userID的两个app应用可以看到对方的文件。为了节省资源,具有相同ID的apk也可以在相同的linux进程中进行。ShareUserId的作用:数据共享、调用其他程序资源。 步骤: 一、新建a,b两个android项目,a 的包名com.rainwii.client ...

weixin_34049948的博客 348

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Android中获取系统级权限(sharedUserId的使用)

近段时间我们打算针对公司已有的设备做一套设备管理系统,采集设备的数据、给设备发送指令。过程中发现代码执行reboot命令的时候长时间未响应,但是我去adb中执行reboot又是可以的,而且以往从来也没有出现过这个情况,经过我反复排查发现是这批设备没有进行root的原因,导致我的app没有root权限,无法执行这些命令可是厂家给的app装上竟然可以执行这些命令。

lss0555的博客 7012

Android:shareUserId知多少

通过Shared User id,拥有同一个User id的多个APK可以配置成运行在同一个进程中。所以默认就是可以互相访问任意数据。也可以配置成运行成不同的进程,同时可以访问其他APK的数据目录下的数据库和文件,就像访问本程序的数据一样。

weixin_43858011的博客 1769

android的sharedUserId

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.youkuaiyun.com/jiangwei0910410003/article/details/51316688 一、前言今天我们来看一下Android中一个众人熟悉的一个属性:shareUse...

中二少年的编程之路 3198

Android中sharedUserId的用处

不同APK之间如何互相访问数据? Android为我们提供了两种数据互访的方法: (1) 使用Share Preference(设置为共有)或Content Provider APK通过指定接口和数据供其它APK读取,开发者需要实现接口和指定share的数据 (2)在配置文件AndroidManifest.xml中配置相同的UserId 通过共享userid,拥有相同userid的用户可...

嵌入式软件开发交流 2万+
上一篇: xmlns是什么意思
下一篇: Java Debug小技巧记录
AnnaLoad
博客等级 码龄17年 7粉丝 23原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值