android:sharedUserId问题
Android给每个APK进程分配一个单独的用户空间,其manifest中的userid就是对应一个Linux用户 Shared User id 如果编译Settings或者android manifest XML中 shared user id 包含android.uid.shared等系统权限的时候,则会报以下错误。 INSTALL_FAILED_UPDATE_INCOMPATIBLE 2. 查看Android.mk文件,加入LOCAL_CERTIFICATE := 这一行,根据这行的内容,选择相应的签名。 最后解释一下原理,首先加入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,然后在原项目中调用改功能就可以了。 |
更多相关文章
- android apk安装原理分析
- Android(安卓)4.4.2插入exFAT格式U盘识别及加载的解决方案
- Android视频播放器---播放远程非流MP4
- Android(安卓)属性系统设计分析
- 【Android基础笔记01】Android开发环境搭建和HelloWorld
- Android(安卓)读写文件
- Android项目构建Apk包流程
- Android面试汇总-Android内存和性能优化面试
- NPM 和webpack 的基础使用