diff --git a/mpmaster/src/main/java/com/xypower/mpmaster/AppMaster.java b/mpmaster/src/main/java/com/xypower/mpmaster/AppMaster.java index 4503982d..84066053 100644 --- a/mpmaster/src/main/java/com/xypower/mpmaster/AppMaster.java +++ b/mpmaster/src/main/java/com/xypower/mpmaster/AppMaster.java @@ -672,7 +672,7 @@ public class AppMaster { if (dl.download(url, apkPath)) { sendResult(cid, 1, action, action + ":" + mCmdid); Context context = mService.getApplicationContext(); - Log.i(TAG, "Upgrade APP: " + url); + mService.logger.info("Upgrade APP: " + url); SysApi.installApk(context, apkPath, context.getPackageName(), true); } diff --git a/mpmaster/src/main/java/com/xypower/mpmaster/LogFormatter.java b/mpmaster/src/main/java/com/xypower/mpmaster/LogFormatter.java new file mode 100644 index 00000000..ca7a20de --- /dev/null +++ b/mpmaster/src/main/java/com/xypower/mpmaster/LogFormatter.java @@ -0,0 +1,57 @@ +package com.xypower.mpmaster; + +import java.io.PrintWriter; +import java.io.StringWriter; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.logging.ConsoleHandler; +import java.util.logging.Formatter; +import java.util.logging.Level; +import java.util.logging.LogRecord; +import java.util.logging.Logger; + + +public class LogFormatter extends Formatter { + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + + static String getLevelName(Level level) { + int levelInt = level.intValue(); + if (levelInt >= 1000) { + return "E"; + } else if (levelInt >= 900) { + return "W"; + } else if (levelInt >= 700) { + return "I"; + } else if (levelInt >= 500) { + return "D"; + } else { + return "V"; + } + } + + @Override + public String format(LogRecord record) { + String message = formatMessage(record); + return String.format(sdf.format(new Date(record.getMillis())) + " [%s] %s\n", + // ecord. + getLevelName(record.getLevel()), message); + } + + /** + * 将{@link LogFormatter}实例指定为{@link Logger}的输出格式 + * @param logger + * @return always logger + */ + public static Logger installFormatter(Logger logger){ + if(null != logger){ + /** 禁用原输出handler,否则会输出两次 */ + logger.setUseParentHandlers(false); + ConsoleHandler consoleHandler = new ConsoleHandler(); + consoleHandler.setFormatter(new LogFormatter()); + logger.addHandler(consoleHandler); + } + return logger; + } + +} diff --git a/mpmaster/src/main/java/com/xypower/mpmaster/LogcatHandler.java b/mpmaster/src/main/java/com/xypower/mpmaster/LogcatHandler.java new file mode 100644 index 00000000..f2dbfd77 --- /dev/null +++ b/mpmaster/src/main/java/com/xypower/mpmaster/LogcatHandler.java @@ -0,0 +1,100 @@ +package com.xypower.mpmaster; + +import android.util.Log; +import java.util.logging.Handler; +import java.util.logging.Level; +import java.util.logging.LogRecord; + +public class LogcatHandler extends Handler { + + private static final int TAG_MAX_LENGTH = 23; + + static String getLevelName(int level) { + switch (level) { + case 1: + return "VERY VERBOSE"; + case Log.VERBOSE: + return "VERBOSE"; + case Log.DEBUG: + return "DEBUG"; + case Log.INFO: + return "INFO"; + case Log.WARN: + return "WARN"; + case Log.ERROR: + return "ERROR"; + case Log.ASSERT: + return "ASSERT"; + default: + return "UNKNOWN"; + } + } + + static int levelFromLevel(Level level) { + int levelInt = level.intValue(); + if (levelInt >= 1000) { + return Log.ERROR; + } else if (levelInt >= 900) { + return Log.WARN; + } else if (levelInt >= 700) { + return Log.INFO; + } else if (levelInt >= 500) { + return Log.DEBUG; + } else { + return Log.VERBOSE; + } + } + + static Level levelFromLevel(int level) { + switch (level) { + case 1: + return Level.FINEST; + case Log.VERBOSE: + return Level.FINER; + case Log.DEBUG: + return Level.FINE; + case Log.INFO: + return Level.INFO; + case Log.WARN: + return Level.WARNING; + case Log.ERROR: + return Level.SEVERE; + case Log.ASSERT: + return Level.SEVERE; + default: + return Level.FINE; + } + } + + @Override public void publish(LogRecord record) { + if (record == null || !super.isLoggable(record)) { + return; + } + + String tag = tagFromLoggerName(record.getLoggerName()); + + int level = levelFromLevel(record.getLevel()); + + Log.println(level, tag, record.getMessage()); + if (record.getThrown() != null) { + Log.println(level, tag, Log.getStackTraceString(record.getThrown())); + } + } + + @Override public void flush() {} + + @Override public void close() throws SecurityException {} + + private String tagFromLoggerName(String name) { + if (name == null) { + return ""; + } + + if (name.length() > TAG_MAX_LENGTH) { + return name.substring(name.length() - TAG_MAX_LENGTH, name.length()); + } else { + return name; + } + } + +} diff --git a/mpmaster/src/main/java/com/xypower/mpmaster/MpMasterService.java b/mpmaster/src/main/java/com/xypower/mpmaster/MpMasterService.java index 7a8b4a99..49a56bc0 100644 --- a/mpmaster/src/main/java/com/xypower/mpmaster/MpMasterService.java +++ b/mpmaster/src/main/java/com/xypower/mpmaster/MpMasterService.java @@ -47,6 +47,8 @@ import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.logging.FileHandler; +import java.util.logging.Level; import java.util.logging.Logger; public class MpMasterService extends Service { @@ -56,6 +58,8 @@ public class MpMasterService extends Service { public static final String TAG = "MpMaster"; + public Logger logger; + public final static int MSG_WHAT_SENDING_HB = 40; public static final int NOTIFICATION_ID_FOREGROUND_SERVICE = 8466503; public static final String ACTION_MSG_BROADCAST = "ACT_MSG_BROADCAST"; @@ -124,6 +128,38 @@ public class MpMasterService extends Service { loadConfig(); + logger = Logger.getLogger("com.xypower.mpmaster.logger"); + logger.setLevel(Level.ALL); + // LogFormatter.installFormatter(logger); + LogFormatter logFormatter = new LogFormatter(); + + if (BuildConfig.DEBUG) { + LogcatHandler logcatHandler = new LogcatHandler(); + logcatHandler.setFormatter(logFormatter); + logger.addHandler(logcatHandler); + } + + FileHandler fileHandler = null; + try { + String appPath = MicroPhotoContext.buildMasterAppDir(getApplicationContext()); + String logPath = appPath + "logs"; + File fi = new File(logPath); + if (!fi.exists()) { + fi.mkdirs(); + } + + File logFile = new File(fi, "log.txt"); + + fileHandler = new FileHandler(logFile.getAbsolutePath(), true);//true表示日志内容在文件中追加 + fileHandler.setLevel(Level.ALL);//级别为ALL,记录所有消息 + + fileHandler.setFormatter(logFormatter); + logger.addHandler(fileHandler); + + } catch (Throwable e) { + System.out.println("创建文件失败!" + e.getMessage()); + } + try { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { mSerialNo = Build.getSerial(); @@ -144,6 +180,8 @@ public class MpMasterService extends Service { } mMpAppVersion = packageInfo == null ? "" : packageInfo.versionName; + logger.info("MpMaster started version=" + mMpMasterVersion); + mHander = new ServiceHandler(); mNotificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); @@ -187,7 +225,7 @@ public class MpMasterService extends Service { mStateService = STATE_SERVICE.NOT_CONNECTED; - Log.w(TAG, "MicroPhotoService::onDestroy called"); + logger.warning("MicroPhotoService::onDestroy called"); unregisterReceiver(mAlarmReceiver); unregisterReceiver(mScreenaAtionReceiver); @@ -256,7 +294,7 @@ public class MpMasterService extends Service { } if ((ts - modifiedTimeOfDb) > mTimeOfMpAppAlive) { // greater than 30m - // Logger. + logger.warning("Start MpAPP as it is NOT running"); MicroPhotoContext.restartMpApp(context); mTimeToStartMpApp = ts; } @@ -295,6 +333,10 @@ public class MpMasterService extends Service { return mSerialNo; } + static String convertSwitch(boolean swtch) { + return swtch ? "ON" : "OFF"; + } + public void setMntnMode(boolean mntnMode, boolean quickHbMode) { boolean oldMntnMode = mMntnMode; boolean oldQuickHbMode = mQuickHbMode; @@ -309,6 +351,9 @@ public class MpMasterService extends Service { masterConfig.quickHbMode = quickHbMode ? 1 : 0; MicroPhotoContext.saveMasterConfig(getApplicationContext(), masterConfig); + + logger.warning("MNTN Mode Changed from " + convertSwitch(oldMntnMode) + " to " + convertSwitch(mntnMode) + + " QuickHB from" + convertSwitch(oldQuickHbMode) + " to " + convertSwitch(quickHbMode)); } if (oldQuickHbMode != quickHbMode) { @@ -331,6 +376,8 @@ public class MpMasterService extends Service { MicroPhotoContext.AppConfig appConfig = MicroPhotoContext.getMpAppConfig(getApplicationContext()); + logger.warning("Start Mntn report:" + masterUrl); + AppMaster appMaster = new AppMaster(this, masterUrl, appConfig.cmdid); appMaster.start(); } @@ -346,7 +393,7 @@ public class MpMasterService extends Service { public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (TextUtils.equals(ACTION_HEARTBEAT, action)) { - Log.i(TAG, "HB Timer Fired ACTION=" + action); + mService.logger.info("HB Timer Fired ACTION=" + action); mService.registerHeartbeatTimer(); @@ -355,7 +402,7 @@ public class MpMasterService extends Service { } else if (TextUtils.equals(ACTION_UPDATE_CONFIGS, action)) { int restart = intent.getIntExtra("restart", 0); - Log.i(TAG, "UPD CFG Fired ACTION=" + action + " restart=" + restart); + mService.logger.info("UPD CFG Fired ACTION=" + action + " restart=" + restart); if (restart != 0) { mService.restartApp(context, context.getPackageName()); } else { @@ -391,35 +438,6 @@ public class MpMasterService extends Service { alarmManager.setExactAndAllowWhileIdle(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() + timeout * 1000, pendingIntent); } - private static void registerPhotoTimer(Context context, int channel, int preset, long ts, long timeout, List schedules) { - - // 创建延迟意图 - Intent alarmIntent = new Intent(); - alarmIntent.setAction(ACTION_TAKE_PHOTO); - int cnt = schedules.size(); - alarmIntent.putExtra(EXTRA_PARAM_SCHEDULES, cnt); - String channelStr = ""; - for (int idx = 0; idx < cnt; idx++) { - long val = schedules.get(idx).longValue(); - alarmIntent.putExtra(EXTRA_PARAM_SCHEDULE + idx, schedules.get(idx).longValue()); - channelStr += "CH=" + ((val & 0XFF0000) >> 16) + "-PR=" + ((val & 0XFF00) >> 8) + " "; - } - - alarmIntent.putExtra(EXTRA_PARAM_TIME, ts); - - PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, alarmIntent, PendingIntent.FLAG_UPDATE_CURRENT); - - AlarmManager alarmManager = (AlarmManager) context.getSystemService(ALARM_SERVICE); - - long currentTimeMillis = System.currentTimeMillis(); - Date date = new Date(currentTimeMillis + timeout); - String dateStr = (String) DateFormat.format("MM-dd kk:mm:ss", date); - Log.d(TAG, "PhotoTimer Reg: " + dateStr + " currentTimeMillis=" + currentTimeMillis + " timeout=" + timeout + " Channels=" + channelStr); - - alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + timeout, pendingIntent); - } - - @Override public int onStartCommand(Intent intent, int flags, int startId) { @@ -738,7 +756,6 @@ public class MpMasterService extends Service { SysApi.selectSimCard4Data(getApplicationContext(), num); } - public native static int getInt(int cmd); public native static int[] getStats(long ts);