上一节,可以通过添加su的方式获取系统权限,但这种存在安全隐患,故不推荐,本文通过获取数字签名方式获取系统权限。
首先需要准备工作:
准备
工具
SignAPK.jar
此工具由Android源代码附带提供。signapk的源代码是$AndroidRoot/build/tools/signapk下,编译后在$AndroidRoot/out/host/linux-x86/framework下。
BSP厂商提供此工具。
此工具可以运行于Windows和Linux平台。当然需要操作系统中安装了Java运行时环境Java Runtime Environment (JRE)。
(注意,不是源码,我们需要预编译的,有的在预编译下面,我的就在$AndroidRoot\prebuilts\sdk\tools\lib)
解压缩工具
Zipalign
Android SDK中包含一个“zipalign”的工具,它能够对打包的应用程序进行优化。在你的应用程序上运行zipalign,使得在运行时Android与应用程序间的交互更加有效率。(一般都有不需要安装)
http://developer.android.com/tools/help/zipalign.html
证书
签名apk使其具备system权限,需要使用两个文件platform.pk8和platform.x509.pem。这两个文件也是Android BSP厂商编译Android时候使用的证书文件。
文件由BSP厂商提供。(这个必须从源码里找,只有厂商才有)
文件路径为:$AndroidRoot/build/target/product/security/
这两个文件会被签名工具SignAPK读取使用。
java -jar signapk.jar platform.x509.pem platform.pk8 MyDemo.apk MyDemo_signed.apk 得到具有对应权限的APK
优化APK:
zipalign -v 4 MyDemo_signed.apk MyDemo_new.apk
感谢http://mysuperbaby.iteye.com/blog/1420612博主文章,至于怎么设置time
代码如下
public static void setDate(int year, int month, int day) throws IOException, InterruptedException { Calendar c = Calendar.getInstance(); c.set(Calendar.YEAR, year); c.set(Calendar.MONTH, month); c.set(Calendar.DAY_OF_MONTH, day); long when = c.getTimeInMillis(); if (when / 1000 < Integer.MAX_VALUE) { SystemClock.setCurrentTimeMillis(when); } long now = Calendar.getInstance().getTimeInMillis(); //Log.d(TAG, "set tm="+when + ", now tm="+now); if(now - when > 1000) throw new IOException("failed to set Date."); }
public static void setTime(int hour, int minute) throws IOException, InterruptedException { Calendar c = Calendar.getInstance(); c.set(Calendar.HOUR_OF_DAY, hour); c.set(Calendar.MINUTE, minute); long when = c.getTimeInMillis(); if (when / 1000 < Integer.MAX_VALUE) { SystemClock.setCurrentTimeMillis(when); } long now = Calendar.getInstance().getTimeInMillis(); //Log.d(TAG, "set tm="+when + ", now tm="+now); if(now - when > 1000) throw new IOException("failed to set Time."); }
该代码参考了http://blog.csdn.net/aikongmeng/article/details/26730737博主文章,但有所修改。
谢谢!