最近在做的项目,有好大一部分都用到这个权限,修改系统时间啊,调用隐藏方法啊,系统关机重启啊,静默安装升级卸载应用等等,刚开始的时候,直接添加权限,运行就报错,无论模拟器还是真机,在logcat中总会得到"Unable to open alarm driver: Permission denied ".这个函数需要root权限或者运行于系统进程中才可以用。网上搜索了好久,发现有两种方法可以解决:
    一种是需要在Android系统源码的环境下用make来编译:
         1. 在应用程序的AndroidManifest.xml中的manifest节点中加入android:sharedUserId="android.uid.system"这个属性。        2. 修改Android.mk文件,加入LOCAL_CERTIFICATE := platform这一行
        3. 使用mm命令来编译,生成的apk就有修改系统时间的权限了。
LZ不会.mk编译这种方法 ,所以就只好参考第二种了:
        1. 加入android:sharedUserId="android.uid.system"这个属性。        2. 使用eclipse编译出未加签名的apk文件,但是这个apk文件是不能用的。
        3. 使用目标系统的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运行在一个进程中,这样可以共享数据,应该会很有用的。

有需要的同学可以看看,上个帖子发布的签名工具,亲测4.0系统没问题,其他的系统就不清楚了,

更多相关文章

  1. 一款常用的 Squid 日志分析工具
  2. GitHub 标星 8K+!一款开源替代 ls 的工具你值得拥有!
  3. RHEL 6 下 DHCP+TFTP+FTP+PXE+Kickstart 实现无人值守安装
  4. Linux 环境下实战 Rsync 备份工具及配置 rsync+inotify 实时同步
  5. Nginx系列教程(六)| 手把手教你搭建 LNMP 架构并部署天空网络电影
  6. 一款霸榜 GitHub 的开源 Linux 资源监视器!
  7. JavaScript与Android原生相互调用并传参
  8. 关于 Android(安卓)中 Support 支持包(1)
  9. Android中3种全屏方法及3种去掉标题栏的方法

随机推荐

  1. Android Debug Bridge 技术实现原理
  2. android ui事件分析
  3. Android CheckBox
  4. Android TextView文字过多时,通过滚动条显
  5. Android(安卓)UI开发第十八篇――Activit
  6. Android 通过WebView 调用Js sqlite数据
  7. android各组件详解
  8. 初学Android,五大布局对象(六)
  9. 安装android时提示The operation cannot
  10. gprs便捷开关 android之widget应用