网上看了一下相关的知识,转载一下两篇相关的文章
(一)
在 android 的API中有提供 SystemClock.setCurrentTimeMillis()函数来修改系统时间,可惜无论你怎么调用这个函数都是没用的,无论模拟器还是真机,在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就有修改系统时间的权限了。
第二个方法麻烦点,不过不用开虚拟机跑到源码环境下用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 的设置源码,里面的一个方法如下:
publicvoidonDateSet(DatePickerview,intyear,intmonth,intday){
Calendarc=Calendar.getInstance();
c.set(Calendar.YEAR,year);
c.set(Calendar.MONTH,month);
c.set(Calendar.DAY_OF_MONTH,day);
longwhen=c.getTimeInMillis();
if(when/1000<Integer.MAX_VALUE){
SystemClock.setCurrentTimeMillis(when);
}
updateTimeAndDateDisplay();
}
从上面的 Android 应用程序源码可以看出,修改系统日期需要为Calendar 设置年月日,然后通过调用SystemClock.setCurrentTimeMillis 方法,设置系统日期,既然源码是这样写的,那我们也依样画葫芦来学一下吧,下面是通过使用datePicker修改日期的代码:
canlendar=Calendar.getInstance();
year=datePicker.getYear();
month=datePicker.getMonth();
day=datePicker.getDayOfMonth();
canlendar.set(Calendar.YEAR,year);
canlendar.set(Calendar.MONTH,month);
canlendar.set(Calendar.DAY_OF_MONTH,day);
longwhen=canlendar.getTimeInMillis();
if(when/1000<Integer.MAX_VALUE){
SystemClock.setCurrentTimeMillis(when);
tv_date.setText(canlendar.get(Calendar.YEAR)+"/"
+((canlendar.get(Calendar.MONTH)+1))+"/"
+canlendar.get(Calendar.DAY_OF_MONTH));
}
Tip:每次需要使用Calendar 必须获得一次实例,否则会它会使用上一次获取实例的日期格式,修改的时候可能会有点小问题
可是,照着上面的代码敲了之后,运行却出现如下的警告:
网上查了一下,说SystemClock.setCurrentTimeMillis 这个函数需要root 权限或者运行在系统进程中才可以用,通过参考了这一篇文章我得到了解决办法:http://dev.10086.cn/blog/?uid-49302-action-viewspace-itemid-907,不过这篇文章的第二个办法说得有点不是很清楚,这里我重新为大家详细说一下
先进入 Android 源码目录 F:/android_source/build/target/product/security ,具体机器目录自己选择。找到 【platform.pk8】和【platform.x509.pem】这两个文件,这里为了方便将它们复制到根目录,如:F:/sign 文件夹内,本来下一步就是需要打包jar 包了,不过里我们在android系统的源码内找到 out 编绎目录下
signApk.jar 这个包,可以自行打jar 包或者下载我这个jar 包都是可以的,下载地址:signapk请自行将后缀名改为.jar 格式,把此jar 包放于F:/sign
文件内,打开dos 操作界面,定们到F:/sign,如下:,接着输入如下命令:java
-jar signapk.jar platform.x509.pem platform.pk8 test.apk testnew.apk ,在dos 命令名如下图:,其中set.apk
是指我们要签名的原始文件apk,后面setnew.apk 是指我们签名后输出的apk文件的名称
Tip:在签名的时候必须将set.apk事先用rar 文件打开,进入META-INF目录下,将CERT.SF和CERT.RSA这两个文件删除掉,再执行如上操作。到了这一步,程序己经可以正常安装了。
如果提示 FaiLure [INSTALL_FAILED_ALREADY_EXISTS],请使用如下命令,将应用程序移除:,uninstall
后面字符是指应用程序所在的包名,再运行adb install [package name] 就可以安装成功。
Tip:不要忘了在你的manifest文件下注册android:sharedUserId="android.uid.system" 。
如果你照着如上的步骤一步一步写的话,保证可以成功修改系统的时间或者日期等操作。
本文出自 “Terry_龙” 博客,请务必保留此出处http://terryblog.blog.51cto.com/1764499/389843
分享到:
相关推荐
Android修改系统时间(应用程序获得系统权限)!!!对你有所帮助
NULL 博文链接:https://lufengdie.iteye.com/blog/918975
修改源码让APP获取root权限可以执行su命令的git diff记录
手机端收集应用程序权限信息和产生的系统调用信息发给远程服务器,远程服务器根据权限信息采用序列最小优化算法给应用程序进行分类,分类后利用系统调用频数计算出系统调用使用值,与该类别的阈值进行比较判断是否...
沙地机器人Android应用程序修改应用程序的权限Sandroid 是一个安卓应用程序,可用于在安装前查看、选择和修改任何应用程序所需的权限。 这使用户可以更好地控制他们的数据,并在安装任何未知应用程序时为其设备提供...
Android 项目是使用 Android 操作系统和相关开发工具开发的一款移动应用程序。Android 平台提供了丰富的功能和接口,开发人员可以使用 Java 或 Kotlin 等编程语言编写 Android 应用程序。Android 项目也可以是针对...
14.4.3 系统当前激活的应用程序窗口获得键盘消息 14.4.4 InputDispatcher获得键盘事件处理完成通知 14.5 InputChannel的注销过程 14.5.1 销毁应用程序窗口 14.5.2 注销Client端InputChannel 14.5.3 注销...
14.4.3 系统当前激活的应用程序窗口获得键盘消息 14.4.4 InputDispatcher获得键盘事件处理完成通知 14.5 InputChannel的注销过程 14.5.1 销毁应用程序窗口 14.5.2 注销Client端InputChannel 14.5.3 注销Server...
1.2 Android应用程序参考书籍....................................... 3 1.3 下载、编译和运行Android源代码........................... 3 1.3.1 下载Android源代码.............................................
随着攻击者利用Android和其他移动操作系统中的移动应用程序权限,移动应用程序将基于授予的应用程序权限来影响用户的隐私。 这项研究根据Google对危险权限的分类将权限分为三类。 第一组包含可以访问用户私人数据...
Magisk:Android 获取 Root 权限的工具。它可以快速、无痛地获得 Android 的超级用户权限,支持 Android 5.0 以上的设备。 介绍 Magisk是一套用于定制Android的开源软件,支持高于Android 5.0的设备。 一些突出特点...
2.普通用户在系统中仅有创建,查看,修改申请表,查看办公系统总表,查看领用表的权限。 3.在系统中可以很明确地查看到自己可以进行的操作。 应用服务器端: 1.只允许系统管理员登录及注册 2.系统管理员拥有增删改查...
由于现有的手机应用程序的开发是构建在各手机厂家的私有操作系统之上的,所以它限制了第三方应用程序的开发,而Android为我们提供了一个开放和通用的选择。因为没有了人为制造的障碍,所以Android开发人员可以自由地...
使用DatePickerDialogTimePickerDialog来实现修改系统时间,系统时间不是那么好修改的,涉及到修改应用程序权限的问题,必须使应用程序有系统的签名才可以修改系统时间,这里附上操作步骤: ...
基于Android的男装出口管理系统是一款专门为男装出口企业开发的移动应用程序。该应用程序提供了一种便捷的方式,让企业可以随时随地管理其出口业务,包括订单管理、库存管理、财务管理等方面。 该应用程序的主要...
检查您的Android应用程序的权限更改 重要! 这就是用户最关心的事情。 用户总是怀疑为什么应用程序实际上需要任何权限,他们讨厌内心深处的每一个权限。 最好以任何方式检查是否有任何新权限添加到您的Android应用...
Android应用程序修改应用程序的权限 Sandroid是一个android应用程序,可用于查看,选择和修改安装前任何应用程序所需的权限。 这为用户提供了对其数据的更多控制权,并且即使在安装任何未知应用程序时也为他们的...
本发明提供一种安卓应用程序永久获取Root 权限的方法,将需要用到Root 权限的操作进行编 写,并编译成一可执行程序文件,将该文件包含在 应用程序中,应用程序通过一次su 程序授权,将 文件拷贝到/system/bin 的目录...
个人android小部件工具应用程序 所有小部件都在android 4.4和android 5.0.2中进行了测试,因此它们应该可以在android 4.x和android 5.x上正常工作。 从理论上讲,所有小部件也都支持android 3.x,但我没有在...
《Android高级编程》首先简要介绍Android软件栈,接着陈述为手机创建稳定可靠、赏心悦目的应用程序的基本原理。通过学习,您可以打下牢固的理论根基,了解使用当前Android 1.0 SDK编写定制移动程序所需的知识,还能...