android:sharedUserId问题

2023-05-16

android:sharedUserId问题

Android给每个APK进程分配一个单独的用户空间,其manifest中的userid就是对应一个Linux用户

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

如果编译Settings或者android manifest XML中 shared user id 包含android.uid.shared等系统权限的时候,则会报以下错误。

Installation error: INSTALL_FAILED_UPDATE_INCOMPATIBLE
Installation error: INSTALL_FAILED_SHARED_USER_INCOMPATIBLE

INSTALL_FAILED_UPDATE_INCOMPATIBLE
1、由于卸载没有完全,可以使用设置中卸载相应应用,或者adb uninstall com.android.***

INSTALL_FAILED_SHARED_USER_INCOMPATIBLE
主要是由于使用了android.uid.shared导致的问题。
解决方案如下
   第一个方法简单点,不过需要在Android系统源码的环境下用make来编译:

   1. 修改Android.mk文件,加入LOCAL_CERTIFICATE := platform这一行

  2. 查看Android.mk文件,加入LOCAL_CERTIFICATE := 这一行,根据这行的内容,选择相应的签名。
     platform----->platform.pk8和platform.x509.pem
     shared  ----->shared.pk8和shared.x509.pem
   3. 使用目标系统的platform密钥来重新给apk文件签名。这步比较麻烦,
      首先找到密钥文件,在我的Android源码目录中的位置
      是"build\target\product\security",下面的platform.pk8和platform.x509.pem
      两个文件。
      然后用Android提供的Signapk工具来签名,signapk的源代码是
      在"build\tools\signapk"下,
      用法为"java -jar signapk.jar  platform.x509.pem platform.pk8 input.apk output.apk",
      文件名最好使用绝对路径防止找不到,也可以修改源代码直接使用。

        最后解释一下原理,首先加入android:sharedUserId="android.uid.system"这个属性。通过Shared User id,拥有同一个User id的多个APK可以配置成运行在同一个进程中。那么把程序的UID配成android.uid.system,也就是要让程序运行在系统进程中,这样就有权限来修改系统时间了。

        只是加入UID还不够,如果这时候安装APK的话发现无法安装,提示签名不符,原因是程序想要运行在系统进程中还要有目标系统的platform key,就是上面第二个方法提到的platform.pk8和platform.x509.pem两个文件。用这两个key签名后apk才真正可以放入系统进程中。第一个方法中加入LOCAL_CERTIFICATE := platform其实就是用这两个key来签名。

        这也有一个问题,就是这样生成的程序只有在原始的Android系统或者是自己编译的系统中才可以用,因为这样的系统才可以拿到platform.pk8 和platform.x509.pem两个文件。要是别家公司做的Android上连安装都安装不了。试试原始的Android中的key来签名,程序在模拟器上运行OK,不过放到G3上安装直接提示"Package ... has no signatures that match those in shared user android.uid.system",这样也是保护了系统的安全。

 

        最最后还说下,这个android:sharedUserId属性不只可以把apk放到系统进程中,也可以配置多个APK运行在一个进程中,这样可以共享数据,应该会很有用的

 

在AndroidMenifest.xml中我们可以看到android:sharedUserId="android.uid.system"
但是有了这句后,就无法对sd卡进行读写操作,比如在SD卡中创建一个新文件夹,是创建不成功的。但是如果把android:sharedUserId="android.uid.system"注释掉,就可以在SD卡进行IO操作了。

       在Settings中android:sharedUserId="android.uid.system"是不可少的,少了它很多Settings下应用直接开不了,或一开就报错。

    解决方法一:

  
vold 模块里的 Volume.cpp文件
在调用doMount的语句里做一下修改~
doMount(devicePath, path, false, false, false,1000, 1015, 0702, true)

doMount(devicePath, path, false, true, false,1000, 1015, 0002, true)

编译以后试试

   解决方法二:

把SD卡操作的功能独立出去,做成一个独立的APK,然后在原项目中调用改功能就可以了。
   
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

android:sharedUserId问题 的相关文章

  • python 和 android 中通过 AES 算法加密和解密

    我有用于 AES 加密的 python 和 android 代码 当我在android中加密文本时 它在python上成功解密 但无法在android端解密 有人有想法吗 Python代码 import base64 import hash
  • SQlite 获取最近的位置(带有纬度和经度)

    我的 SQLite 数据库中存储有纬度和经度的数据 我想获取距我输入的参数最近的位置 例如我当前的位置 纬度 经度等 我知道这在 MySQL 中是可能的 并且我已经做了相当多的研究 SQLite 需要一个自定义外部函数来实现半正弦公式 计算
  • android 填充包含片段的布局

    问题是什么 我如何膨胀包含片段的布局 我不知道错误消息的含义 请帮我 谢谢 错误信息 09 01 18 44 58 698 E AndroidRuntime 20617 Caused by java lang IllegalArgument
  • Android:防止嗅探(例如使用 CharlesProxy)SSL 流量

    我使用 Charles 检查将我的应用程序发送到 HTTPS 的数据 我在手机上安装了 Charles CA 证书 因此我能够解密每个 SSL 流量 但我发现一些应用程序无法看到 SSL 流量 我如何将这种行为实现到我自己的应用程序中 有了
  • 在 AndEngine 中对多个实体修改器进行排队

    我试图让一个精灵 下面的 指针 沿着两条路径 一条接一条 这是我的代码 scene attachChild pointer pointer clearEntityModifiers pointer registerEntityModifie
  • 在Android中绘制带有曲线底部的矩形视图

    美好的一天 我想画一个矩形作为视图 但底部应该是弯曲的 我不想应用这样的背景图像或使用任何视图 因为如果我使用视图并设置背景 曲线部分仍然会有不可见的空白空间 我将无法将另一个曲线图像附加到自定义视图的底部曲线 那么我该如何绘制一个带有底部
  • 将 Android 应用程序从 Lite 升级到 Pro 版本时保持相同的 SQLite 数据库

    首先 我已经进行了搜索 但找不到我的问题的具体答案 所以这里是 我正在编写我的第一个 Android 应用程序 并计划拥有 Lite 版本 有限功能 和付费版本 完整功能 Lite 和 Pro 版本将使用相同的 SQLite 数据库结构 如
  • Firebase 远程配置 - 初始获取返回本地默认值

    我正在使用 Firebase 远程配置来获取远程数据 并且我的应用程序需要首次启动时的最新数据 我正在我的应用程序中进行获取和更新onCreate mFirebaseRemoteConfig fetch cacheExpiration ad
  • 关于钛文本字段更改事件的问题

    我有以下代码 for var i 0 i lt 3 i var newTF Ti UI createTextField top 20 hintText new text field under i 1 text field width 10
  • 如何在android模拟器中模拟加速度计? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我现在没有 Android 手机 但在我的应用程序中 我需要使用加速度计值 我怎样才能在模拟环境中做到
  • android /data/data文件夹在哪里

    好的 我是 Android 新手 我读过一些关于 data data安卓中的文件夹 但我在网上找不到这个文件夹指向哪里 有人可以解释一下吗 data data是设备内部存储的一部分 是所有应用程序的安装位置 除非您有 root 设备 否则无
  • 通话后返回App

    我正在尝试通过应用程序拨打电话 我希望它在通话后返回到应用程序 我在这个论坛问过这个问题 但我不明白答案 如何在 Android 中拨打电话并在通话结束后返回到我的活动 https stackoverflow com questions 1
  • Canvas.drawVertices(...) 不绘制任何内容

    下一类是红色三角形的视图 public class FreeStyleViewII extends View private final Paint paint new Paint private final int colors new
  • 找不到 ActionBar 资源图标

    各位 请原谅我刚刚开始学习Android开发 第一次使用ActionBar在我的 Android 应用程序中 首先 我正在关注tutorial http developer android com training basics actio
  • 使用套接字和 AsyncTask 强制关闭

    堆栈的人们大家好 请参阅下面我的班级代码和我的 LogCat 尝试连接时我受到强力关闭 如果有人能帮助我找出原因 我将不胜感激 基本上代码的作用是 从意图中获取 IP 地址 连接到端口 32 的 IP 然后发送一个命令 等待响应并发送另一个
  • 通过 WiFi 将视频从一部 Android 手机直播到另一部手机

    我已经在互联网上搜索了好几天关于如何通过 WiFi 连接实现从 Android 手机到另一部 Android 手机的视频流功能 但我似乎找不到任何有用的东西 我查看了 Android 开发人员的示例代码 stackoverflow goog
  • Android:使用 OAuth 访问 google 任务时出现问题

    由于 google 任务没有公共 api 我想编写解决方法并像浏览器一样请求数据 然后解析结果以进一步显示 为了访问数据 我使用 google 实现了 OAuth 身份验证来访问此 url https mail google com htt
  • 带有一、二和三个按钮的 Android 警报对话框

    我不经常发出警报 但每次发出警报时 我都会花一些时间来阅读文档 https developer android com guide topics ui dialogs html并弄清楚如何去做 由于我现在不得不这样做几次 所以我将在下面写一
  • ffmpeg视频已压缩但无法在浏览器中播放

    我已经集成了ffmpeg4android lib 视频压缩工作正常 但视频无法在除 safari 浏览器之外的浏览器中播放 上传到服务器后 我使用了以下命令 ffmpeg y i
  • 使用 ADB 命令获取 IMEI 号码 Android 12

    对于 11 之前的 Android 版本 我使用以下命令从我的设备获取 IMEI 号码 adb shell service call iphonesubinfo 4 cut c 52 66 tr d space or adb shell s

随机推荐