2018-12-24 14:44:00 lubin2099 阅读数 479
  • Android底层技术:Java层系统服务(Android Service)

    为什么我们需要学习撰写系统服务呢? 底层系统服务是Android 框架裡接近Linux/Driver 的部分。为了充分发挥硬件设备的差異化特性,系统服务是让上层Java 应用程序來使用Driver/HW Device 特色的重要管道。于此,先仔细解析Java层系统服务的架构,然后阐述这系统服务的代码开发要点,以及其API设计方法。

    32633 人正在学习 去看看 高煥堂

修改Android系统时间为默认编译时间

为了修改android的默认时间。 在网上查询一些资料,发现有介绍在SystemServer.java 里修改的。 但发现在此处修改,并没有达到预期效果,经查询在AlarmManagerService.java 中设置系统的默认时间更为妥当。
下面是Android 8.1 中
frameworks/base/services/core/java/com/android/server/AlarmManagerService.java
的代码块。其中setKernelTime 即为设置系统的时间。

    @Override
    public void onStart() {
        mNativeData = init();
        mNextWakeup = mNextNonWakeup = 0;

        // We have to set current TimeZone info to kernel
        // because kernel doesn't keep this after reboot
        setTimeZoneImpl(SystemProperties.get(TIMEZONE_PROPERTY));

        // Also sure that we're booting with a halfway sensible current time
        if (mNativeData != 0) {
            final long systemBuildTime = Environment.getRootDirectory().lastModified();
            if (System.currentTimeMillis() < systemBuildTime) {
                Slog.i(TAG, "Current time only " + System.currentTimeMillis()
                        + ", advancing to build time " + systemBuildTime);
                setKernelTime(mNativeData, systemBuildTime);
            }
        }
        .......
       }

从这里可以看出,system会取当前时间与system分区文件夹的时间进行比较。 如果时间小于文件夹时间,那么就会改成文件夹时间。
因为我们的目的是要将系统默认时间从1970修改到较近的一个时间。
为保证原先的逻辑。
增加一个逻辑,使时间为编译时间。
我们这里修改代码如下

    public void onStart() {
        mNativeData = init();
        mNextWakeup = mNextNonWakeup = 0;

        // We have to set current TimeZone info to kernel
        // because kernel doesn't keep this after reboot
        setTimeZoneImpl(SystemProperties.get(TIMEZONE_PROPERTY));

        // Also sure that we're booting with a halfway sensible current time
        if (mNativeData != 0) {
            long systemBuildTime = Environment.getRootDirectory().lastModified();
            String CurrentTimeMillis =  SystemProperties.get("ro.build.date.utc");
            
            long defaultBuildTime = Long.parseLong(CurrentTimeMillis) * 1000;
            Slog.i(TAG, "systemBuildTime  " + systemBuildTime + "defaultBuildTime  " + defaultBuildTime);
            if (systemBuildTime < defaultBuildTime)
            {
                systemBuildTime = defaultBuildTime;
                Slog.i(TAG, "Correct build time to  " + systemBuildTime);
            }
            if (System.currentTimeMillis() < systemBuildTime) {
                Slog.i(TAG, "Current time only " + System.currentTimeMillis()
                        + ", advancing to build time " + systemBuildTime);
                setKernelTime(mNativeData, systemBuildTime);
            }
        }
        ......
   }

date 命令使用

为方便使用,附上date 命令的简单使用方式

Linux命令转换时间戳,如下:


$ date +%s --date 19700101 --utc   // 1970-01-01 00:00 UTC
0
$ date +%s --date 20120101 --utc   // 2012-01-01 00:00 UTC
1325376000
$ date +%s --date 20160101 --utc   // 2016-01-01 00:00 UTC
1451606400

UNIX时间戳转换为具体日期

$ date --date=@86400 --utc 
1970年 01月 02日 星期五 00:00:00 UTC
$ date --date=@1451606400 --utc
2016年 01月 01日 星期五 00:00:00 UTC
$ date --date=@1451606400
2016年 01月 01日 星期五 08:00:00 CST
2013-09-09 10:20:49 brucezcg 阅读数 2597
  • Android底层技术:Java层系统服务(Android Service)

    为什么我们需要学习撰写系统服务呢? 底层系统服务是Android 框架裡接近Linux/Driver 的部分。为了充分发挥硬件设备的差異化特性,系统服务是让上层Java 应用程序來使用Driver/HW Device 特色的重要管道。于此,先仔细解析Java层系统服务的架构,然后阐述这系统服务的代码开发要点,以及其API设计方法。

    32633 人正在学习 去看看 高煥堂
public static void setTime(Date ServiceTime){
		SimpleDateFormat sdf=new SimpleDateFormat("yyyyMMdd.HHmmss",Locale.getDefault());
		String datetime=sdf.format(ServiceTime);  
		
		ArrayList<String> envlist = new ArrayList<String>();
		Map<String, String> env = System.getenv();
		for (String envName : env.keySet()) {
			envlist.add(envName + "=" + env.get(envName));
		}
		String[] envp = (String[]) envlist.toArray(new String[0]);
		String command;
		command = "date -s\""+datetime+"\"";
		try {
			Runtime.getRuntime().exec(new String[] { "su", "-c", command },
					envp);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			MyLog.e(e.toString());
		}
	}

花费两天时间在修改系统时间上面的确不应该,但又让我多学了一种方法;
第一种方法是用命令修改Android系统时间;
第二种方法是重新编译apk进行修改Android系统时间;
两个比较,肯定第一种既方便又节省时间;刚开始我使用的是第一种方法做的,
由于对命令不熟,导致设置时间失败;
最后没有办法尝试第二种方法,虽然第二种方法在自己的小Demo中能够成功,
可是加入项目中问题重重;用很多解决办法都没有完成;
之后又来重新用第一种方法试试;哎,都是在尝试中总结经验;
首先找到Android sdk路径,
在cmd命令里面进入D:\android\android-sdk-windows\android-sdk-windows\platform-tools;
然后进行adb shell;
获取root权限 su root
修改系统时间: date -s “20130603.184023”
这样就可以看到你手机上面的时间已经改变;
代码是这样修改的:

第二种方法网上都有,所以大家可以参照这篇文档就可以了;
http://www.eoeandroid.com/thread-108663-1-1.html
2018-10-10 11:53:19 u014630142 阅读数 2417
  • Android底层技术:Java层系统服务(Android Service)

    为什么我们需要学习撰写系统服务呢? 底层系统服务是Android 框架裡接近Linux/Driver 的部分。为了充分发挥硬件设备的差異化特性,系统服务是让上层Java 应用程序來使用Driver/HW Device 特色的重要管道。于此,先仔细解析Java层系统服务的架构,然后阐述这系统服务的代码开发要点,以及其API设计方法。

    32633 人正在学习 去看看 高煥堂

一 : 修改Android系统默认时间

源码路径:frameworks/base/services/java/com/android/server/SystemServer.java
主要变量EARLIEST_SUPPORTED_TIME

    // The earliest supported time.  We pick one day into 1970, to
    // give any timezone code room without going into negative time.
    private static final long EARLIEST_SUPPORTED_TIME = 1514764800000L;//20180101 00:00:00
  •  

通过SystemClock.setCurrentTimeMillis(EARLIEST_SUPPORTED_TIME)设置系统时间,只需要修改EARLIEST_SUPPORTED_TIME变量的值。

    private void run() {
        try {
            traceBeginAndSlog("InitBeforeStartServices");
            // If a device's clock is before 1970 (before 0), a lot of
            // APIs crash dealing with negative numbers, notably
            // java.io.File#setLastModified, so instead we fake it and
            // hope that time from cell towers or NTP fixes it shortly.
            if (System.currentTimeMillis() < EARLIEST_SUPPORTED_TIME) {
                Slog.w(TAG, "System clock is before 1970; setting to 1970.");
                SystemClock.setCurrentTimeMillis(EARLIEST_SUPPORTED_TIME);
            }
  •  

设置系统默认时间这段代码请放在startOtherServices()之后,否则无效(不同的平台代码略有差别,可以自己评价该放在什么位置)。

        // Start services.
        try {
            traceBeginAndSlog("StartServices");
            startBootstrapServices();
            startCoreServices();
            startOtherServices();
            //add by jasun@180730 for default time start
            if (System.currentTimeMillis() < EARLIEST_SUPPORTED_TIME) {
                Slog.w(TAG, "System clock is before 2018.; setting to 2018.");
                SystemClock.setCurrentTimeMillis(EARLIEST_SUPPORTED_TIME);
            }
            //add by jasun@180730 for default time end
            SystemServerInitThreadPool.shutdown();
        } catch (Throwable ex) {
            Slog.e("System", "******************************************");
            Slog.e("System", "************ Failure starting system services", ex);
            throw ex;
        } finally {
            traceEnd();
        }
  •  

二 : 时间转换为UNIX时间戳

EARLIEST_SUPPORTED_TIME变量值如何获取?
Linux命令转换时间戳,如下:

$ date +%s --date 19700101 --utc   // 1970-01-01 00:00 UTC
0
$ date +%s --date 20120101 --utc   // 2012-01-01 00:00 UTC
1325376000
$ date +%s --date 20160101 --utc   // 2016-01-01 00:00 UTC
1451606400
  •  

反之,也可以把某个UNIX时间戳转换为具体日期,如下:

$ date --date=@86400 --utc // Android默认EARLIEST_SUPPORTED_TIME值为86400×1000
1970年 01月 02日 星期五 00:00:00 UTC
$ date --date=@1451606400 --utc
2016年 01月 01日 星期五 00:00:00 UTC
$ date --date=@1451606400
2016年 01月 01日 星期五 08:00:00 CST

--------------------- 作者:一莫言一 来源:CSDN 原文:https://blog.csdn.net/ljx646566715/article/details/81189914?utm_source=copy 版权声明:本文为博主原创文章,转载请附上博文链接!

2014-04-03 16:31:41 z358247505 阅读数 622
  • Android底层技术:Java层系统服务(Android Service)

    为什么我们需要学习撰写系统服务呢? 底层系统服务是Android 框架裡接近Linux/Driver 的部分。为了充分发挥硬件设备的差異化特性,系统服务是让上层Java 应用程序來使用Driver/HW Device 特色的重要管道。于此,先仔细解析Java层系统服务的架构,然后阐述这系统服务的代码开发要点,以及其API设计方法。

    32633 人正在学习 去看看 高煥堂
代码如下:
public static void SetSysTime(int year,int month,int day,int h,int min,int sec){
	Calendar cal = Calendar.getInstance();
		
	cal.set(Calendar.YEAR, year);
	cal.set(Calendar.MONTH, month-1);//android使用Calendar的月是0-11,故此设置月时将标准月减1
        cal.set(Calendar.DAY_OF_MONTH, day);
        cal.set(Calendar.HOUR_OF_DAY, h);
        cal.set(Calendar.MINUTE,min);
        cal.set(Calendar.SECOND, sec);
        long when = cal.getTimeInMillis();
        //java.sql.Timestamp tr=new java.sql.Timestamp(when);
        //Log.e("GPS时间——riqi:",tr.toString());
        if (when < Long.MAX_VALUE) {
            SystemClock.setCurrentTimeMillis(when);
        }
	}

2017-08-05 16:42:47 weixin_36070850 阅读数 1125
  • Android底层技术:Java层系统服务(Android Service)

    为什么我们需要学习撰写系统服务呢? 底层系统服务是Android 框架裡接近Linux/Driver 的部分。为了充分发挥硬件设备的差異化特性,系统服务是让上层Java 应用程序來使用Driver/HW Device 特色的重要管道。于此,先仔细解析Java层系统服务的架构,然后阐述这系统服务的代码开发要点,以及其API设计方法。

    32633 人正在学习 去看看 高煥堂

权限为 Root 权限

    /** 
     * 设置系统时间 
     * @param time 格式为“年月日.时分秒”,例如:20111209.121212 
     */  
    public static boolean setTime(String time) {  
        Process process = null;  
        DataOutputStream os = null;  
        try {  
            process = Runtime.getRuntime().exec("su");  
            os = new DataOutputStream(process.getOutputStream());  
            os.writeBytes("date -s " + time + "\n");  
            os.writeBytes("exit\n");  
            os.flush();  
            process.waitFor();  
        } catch (Exception e) {  
            return false;  
        } finally {  
            try {  
                if (os != null) {  
                    os.close();  
                }  
                process.destroy();  
            } catch (Exception e) {  
            }  
        }  
        return true;  
    }  

Android修改系统时间

阅读数 3924

没有更多推荐了,返回首页