Android中应用程序如何获得系统签名权限
有些库的使用条件比较苛刻,要求同一签名的程序才可以获得访问权。此时即便是在AndroidManifest.xml中添加了相应的permission,依旧会得到没有xx访问权限的问题。比如android.permission.ACCESS_SURFACE_FLINGER 。
第一个方法简单点,不过需要在Android系统源码的环境下用make来编译:
1. 在应用程序的AndroidManifest.xml中的manifest节点中加入android:sharedUserId="android.uid.system"这个属性。
2. 修改Android.mk文件,加入LOCAL_CERTIFICATE := platform这一行
3. 使用mm命令来编译,生成的apk就有修改系统时间的权限了。
第二个方法麻烦点,不过不用开虚拟机跑到源码环境下用make来编译:
1. 同上,加入android:sharedUserId="android.uid.system"这个属性。
2. 使用eclipse编译出apk文件,但是这个apk文件是不能用的。
3. 用压缩软件打开apk文件,删掉META-INF目录下的CERT.SF和CERT.RSA两个文件。
4. 使用目标系统的platform密钥来重新给apk文件签名。这步比较麻烦,首先找到密钥文件,在我的Android源码目录中的位置是"build\target\product\security",下面的platform.pk8和platform.x509.pem两个文件。然后用Android提供的Signapk工具来签名,signapk的源代码是在"build\tools\signapk"下,用法为"signapk platform.x509.pem platform.pk8 input.apk output.apk",文件名最好使用绝对路径防止找不到,也可以修改源代码直接使用。
这样最后得到的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运行在一个进程中,这样可以共享数据,应该会很有用的。
相关文章
- [Android]android自动化测试十六之calabash-android
- [Android Pro] Android打包一个Apk后,如何查看它的VersionCode、VersionName 等等。
- Android实例-IdHTTP下载(并实现自动安装)(XE10+小米2)
- Android中如何使用自定义对话框
- Android API之android.provider.ContactsContract.Data
- Android Studio实用插件使用
- Android studio 提示“android qemu-system-i386.exe停止工作”
- Android系统onKeyDown监控/拦截/监听/屏蔽返回键、菜单键和Home键
- Android:通过MQTT实现用户端与服务器数据双向传输
- Android:最新版浮动按钮的制作
- Atitit.提升软件Web应用程序 app性能的方法原理 h5 js java c# php python android .net
- Atitit.播放系统规划新版本 and 最近版本回顾 v3 pbf.doc 1 版本11 (ing)41.1 规划h5本地缓存系列 41.2 Android版本app41.3 双类别系统,
- 27岁自学Android成功入职阿里,定薪25k*16薪,不要用时间换金钱
- android 11系统去掉内部存储 lost.dir文件夹
- Android WMS服务的窗口系统
- Android平台上使用属性系统(property system)
- Android【报错】. lang。android.app ClassCastException。SharedPreferencesImpl不能被强制转换为android.content.Shared
- Android 系统开发-提高编译速度的两种方式
- 【Android笔记24】Android中图形图像处理技术的介绍及使用
- Android 11.0 12.0在系统app安装第三方app弹出 解析安装包出现问题 的解决方案
- Android 10.0 设置充电到50%退出省电模式
- android 预置第三方32位apk到64位系统中so库兼容的问题,apk运行缺jar问题解决
- Android 系统当前时间与网络时间同步
- 【Android Gradle 插件】组件化中的 Gradle 构建脚本实现 ⑤ ( 优化 Gradle 构建脚本 | 构建脚本结构 | 闭包定义及用法 | 依赖配置 | android 块配置 )
- 【Android 安全】DEX 加密 ( 代理 Application 开发 | 加载 dex 文件 | 反射获取系统的 Element[] dexElements )
- 给android应用程序系统的签名
- Android12之Android.bp禁用odex(一百一十一)
- Android.mk中的LOCAL_OVERRIDES_PACKAGES
- 一文3500字手把手教你基于Android系统的自动化环境搭建
- Android 10.0 系统开机自启动第三方app
- Android系统信息获取 之十一:获取IMEI,IMSI号
- Android中binder,hwbinder,vndbinder之间的关系
- android源码查找测试demo
- Android Studio NDK报错:mips64el-linux-android-strip 找不到