转载:https://blog.csdn.net/wuyou1336/article/details/52766099?locationNum=3&fps=1


在 Android 的API中有提供 SystemClock.setCurrentTimeMillis()函数来修改系统时间,.这个函数需要root权限或者运行于系统进程中才可以用。

  第一个方法简单点,不过需要在Android系统源码的环境下用make来编译:

        1. 在应用程序的AndroidManifest.xml中的manifest节点中加入android:sharedUserId="android.uid.system"这个属性。

        2. 修改Android.mk文件,加入LOCAL_CERTIFICATE := platform这一行

        3. 使用mm命令来编译,生成的apk就有修改系统时间的权限了。

Shareuserid介绍

    android:sharedUserId="android.uid.system"
    package="com.android.camera">

不同的APK会具有不同的userId,因此运行时属于不同的进程中,而不同进程中的资源是不共享的,在保障了程序运行的稳定。然后在有些时候,我们自己开发了多个APK并且需要他们之间互相共享资源,那么就需要通过设置shareUserId来实现这一目的。

通过Shared User id,拥有同一个User id的多个APK可以配置成运行在同一个进程中.所以默认就是可以互相访问任意数据. 也可以配置成运行成不同的进程, 同时可以访问其他APK的数据目录下的数据库和文件.就像访问本程序的数据一样。

把程序的UID配成android.uid.system,也就是要让程序运行在系统进程中

一个mainfest只能有一个Shareuserid标签

  第二个方法麻烦点,不过不用开虚拟机跑到源码环境下用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和第一个方法是一样的

   只是加入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运行在一个进程中,这样可以共享数据,应该会很有用的。



adb shell  进入shell终端界面

1、先设置系统的时区配置

cat /data/property/persist.sys.timezone //查看当前时区配置文件
setprop persist.sys.timezone GMT        //
修改属性 
2、开始设置修改当前系统时间

date -s "yyyymmdd.[[[hh]mm]ss]"  System/bin/date -s "yyyymmdd.[[[hh]mm]ss]"

3、查看是否生效

date 

二、用代码实现修改Android系统时间的方法

public void testDate(){
try {
Process process = Runtime.getRuntime().exec("su");
String datetime="20131023.112800"; //
测试的设置的时间【时间格式 yyyyMMdd.HHmmss
DataOutputStream os = new DataOutputStream(process.getOutputStream());
os.writeBytes("setprop persist.sys.timezone GMT\n");
os.writeBytes("/system/bin/date -s "+datetime+"\n");
os.writeBytes("clock -w\n");
os.writeBytes("exit\n");
os.flush();
} catch (IOException e) {
e.printStackTrace();
}
}

 

android默认系统日期、时间、时区更改

 

Android 通过应用设置系统日期和时间的方法

android 2.3 

android 4.0

测试可行,不过需要ROOT权限.


[java]  view plain  copy
  1. import java.io.DataOutputStream;    
  2. import java.io.File;    
  3. import java.io.IOException;    
  4. import java.util.Calendar;    
  5.     
  6. import android.os.SystemClock;    
  7.     
  8. public class SystemDateTime {    
  9.         
  10.     static final String TAG = "SystemDateTime";     
  11.         
  12.     public static void setDateTime(int year, int month, int day, int hour, int minute) throws IOException, InterruptedException {    
  13.     
  14.         requestPermission();    
  15.     
  16.         Calendar c = Calendar.getInstance();    
  17.     
  18.         c.set(Calendar.YEAR, year);    
  19.         c.set(Calendar.MONTH, month-1);    
  20.         c.set(Calendar.DAY_OF_MONTH, day);    
  21.         c.set(Calendar.HOUR_OF_DAY, hour);    
  22.         c.set(Calendar.MINUTE, minute);    
  23.             
  24.             
  25.         long when = c.getTimeInMillis();    
  26.     
  27.         if (when / 1000 < Integer.MAX_VALUE) {    
  28.             SystemClock.setCurrentTimeMillis(when);    
  29.         }    
  30.     
  31.         long now = Calendar.getInstance().getTimeInMillis();    
  32.         //Log.d(TAG, "set tm="+when + ", now tm="+now);    
  33.     
  34.         if(now - when > 1000)    
  35.             throw new IOException("failed to set Date.");     
  36.             
  37.     }    
  38.     
  39.     public static void setDate(int year, int month, int day) throws IOException, InterruptedException {    
  40.     
  41.         requestPermission();    
  42.     
  43.         Calendar c = Calendar.getInstance();    
  44.     
  45.         c.set(Calendar.YEAR, year);    
  46.         c.set(Calendar.MONTH, month);    
  47.         c.set(Calendar.DAY_OF_MONTH, day);    
  48.         long when = c.getTimeInMillis();    
  49.     
  50.         if (when / 1000 < Integer.MAX_VALUE) {    
  51.             SystemClock.setCurrentTimeMillis(when);    
  52.         }    
  53.     
  54.         long now = Calendar.getInstance().getTimeInMillis();    
  55.         //Log.d(TAG, "set tm="+when + ", now tm="+now);    
  56.     
  57.         if(now - when > 1000)    
  58.             throw new IOException("failed to set Date.");    
  59.     }    
  60.     
  61.     public static void setTime(int hour, int minute) throws IOException, InterruptedException {    
  62.             
  63.         requestPermission();    
  64.     
  65.         Calendar c = Calendar.getInstance();    
  66.     
  67.         c.set(Calendar.HOUR_OF_DAY, hour);    
  68.         c.set(Calendar.MINUTE, minute);    
  69.         long when = c.getTimeInMillis();    
  70.     
  71.         if (when / 1000 < Integer.MAX_VALUE) {    
  72.             SystemClock.setCurrentTimeMillis(when);    
  73.         }    
  74.     
  75.         long now = Calendar.getInstance().getTimeInMillis();    
  76.         //Log.d(TAG, "set tm="+when + ", now tm="+now);    
  77.     
  78.         if(now - when > 1000)    
  79.             throw new IOException("failed to set Time.");    
  80.     }    
  81.         
  82.     static void requestPermission() throws InterruptedException, IOException {    
  83.         createSuProcess("chmod 666 /dev/alarm").waitFor();    
  84.     }    
  85.         
  86.     static Process createSuProcess() throws IOException  {    
  87.         File rootUser = new File("/system/xbin/ru");    
  88.         if(rootUser.exists()) {    
  89.             return Runtime.getRuntime().exec(rootUser.getAbsolutePath());    
  90.         } else {    
  91.             return Runtime.getRuntime().exec("su");    
  92.         }    
  93.     }    
  94.         
  95.     static Process createSuProcess(String cmd) throws IOException {    
  96.     
  97.         DataOutputStream os = null;    
  98.         Process process = createSuProcess();    
  99.     
  100.         try {    
  101.             os = new DataOutputStream(process.getOutputStream());    
  102.             os.writeBytes(cmd + "\n");    
  103.             os.writeBytes("exit $?\n");    
  104.         } finally {    
  105.             if(os != null) {    
  106.                 try {    
  107.                     os.close();    
  108.                 } catch (IOException e) {    
  109.                 }    
  110.             }    
  111.         }    
  112.     
  113.         return process;    
  114.     }    
  115. }    

更多相关文章

  1. Android从文件目录中写入和读取图片
  2. 布局文件中的笔记
  3. Android的系统的Binder机制(一)
  4. android 有关怎么自己添加系统级服务 java层 重点aidl
  5. android9.0 系统默认时间修改
  6. 使用AIDL实现Android的跨进程通信
  7. android高版本系统源码下载和编译刷机

随机推荐

  1. Android(安卓)拦截短信配置
  2. Android蓝牙开发浅谈
  3. Android实现计时以及倒计时的几种方法
  4. From Zero to Boot: Porting Android(安
  5. Android异常总结---W/System.err(661): j
  6. Android(安卓)图片左上角、右上角标签tag
  7. android http get请求中的乱码问题
  8. android 判断文件是否存在
  9. android MediaPlayer SurfaceView 网络视
  10. Andriod studio编译问题:org.gradle.proce