From: snickersun Date: Sun, 2 Jul 2023 03:16:01 +0000 (+0800) Subject: release ICL02Sport_V44_202307021108_release.apk X-Git-Url: http://git.snicker.com.cn/Users/apple/Desktop/static/gitweb.css?a=commitdiff_plain;h=65db74400b0730abb14befd485c97d74c51d4113;p=ichardware.git release ICL02Sport_V44_202307021108_release.apk 计步适配mt2 workservice ,修复日志记录 --- diff --git a/app/build.gradle b/app/build.gradle index 66cf261..2113f7e 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -137,6 +137,8 @@ dependencies { implementation 'androidx.viewpager2:viewpager2:1.0.0' - implementation files('libs/ICLoger-release.aar') - + implementation files('libs/android-logging-log4j-1.0.3.jar', + 'libs/ftp4j-1.7.2.jar', + 'libs/log4j-1.2.17.jar', + 'libs/okio-2.4.3.jar') } diff --git a/app/libs/ICLoger-release.aar b/app/libs/ICLoger-release.aar deleted file mode 100644 index ad31ae2..0000000 Binary files a/app/libs/ICLoger-release.aar and /dev/null differ diff --git a/app/libs/android-logging-log4j-1.0.3.jar b/app/libs/android-logging-log4j-1.0.3.jar new file mode 100644 index 0000000..7d4146f Binary files /dev/null and b/app/libs/android-logging-log4j-1.0.3.jar differ diff --git a/app/libs/ftp4j-1.7.2.jar b/app/libs/ftp4j-1.7.2.jar new file mode 100644 index 0000000..fca26ec Binary files /dev/null and b/app/libs/ftp4j-1.7.2.jar differ diff --git a/app/libs/log4j-1.2.17.jar b/app/libs/log4j-1.2.17.jar new file mode 100644 index 0000000..068867e Binary files /dev/null and b/app/libs/log4j-1.2.17.jar differ diff --git a/app/libs/okio-2.4.3.jar b/app/libs/okio-2.4.3.jar new file mode 100644 index 0000000..6289cf6 Binary files /dev/null and b/app/libs/okio-2.4.3.jar differ diff --git a/app/release/ICL02Sport_V44_202307021108_release.apk b/app/release/ICL02Sport_V44_202307021108_release.apk new file mode 100644 index 0000000..4054855 Binary files /dev/null and b/app/release/ICL02Sport_V44_202307021108_release.apk differ diff --git a/app/release/output.json b/app/release/output.json index f6bea12..495d44f 100644 --- a/app/release/output.json +++ b/app/release/output.json @@ -1 +1 @@ -[{"outputType":{"type":"APK"},"apkData":{"type":"MAIN","splits":[],"versionCode":21,"versionName":"202012040920","enabled":true,"outputFile":"ICL02Hardware_V21_202012040920_release.apk","fullName":"release","baseName":"release"},"path":"ICL02Hardware_V21_202012040920_release.apk","properties":{}}] \ No newline at end of file +[{"outputType":{"type":"APK"},"apkData":{"type":"MAIN","splits":[],"versionCode":44,"versionName":"202307021108","enabled":true,"outputFile":"ICL02Sport_V44_202307021108_release.apk","fullName":"release","baseName":"release"},"path":"ICL02Sport_V44_202307021108_release.apk","properties":{}}] \ No newline at end of file diff --git a/app/src/main/java/com/ic/sport/App.java b/app/src/main/java/com/ic/sport/App.java index 17c27d1..6cc3cad 100644 --- a/app/src/main/java/com/ic/sport/App.java +++ b/app/src/main/java/com/ic/sport/App.java @@ -2,8 +2,8 @@ package com.ic.sport; import android.app.Application; -import com.ic.iclooger.CrashHandler; -import com.ic.iclooger.ICLogger; +import com.ic.sport.util.CrashHandler; +import com.ic.sport.util.ICLogger; import com.ic.sport.util.IcLog; import com.jakewharton.threetenabp.AndroidThreeTen; diff --git a/app/src/main/java/com/ic/sport/PedometerActivity.java b/app/src/main/java/com/ic/sport/PedometerActivity.java index b830e2d..f5d051d 100644 --- a/app/src/main/java/com/ic/sport/PedometerActivity.java +++ b/app/src/main/java/com/ic/sport/PedometerActivity.java @@ -9,6 +9,7 @@ import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import androidx.viewpager2.widget.ViewPager2; +import com.ic.sport.util.ICLogger; import com.ic.sport.adapter.FragmentAdapter; import com.ic.sport.adapter.IndicatorAdapter; import com.ic.sport.fragment.pedometer.PedMainFragment; diff --git a/app/src/main/java/com/ic/sport/fragment/pedometer/PedMainFragment.java b/app/src/main/java/com/ic/sport/fragment/pedometer/PedMainFragment.java index bc2aacf..3d17e13 100644 --- a/app/src/main/java/com/ic/sport/fragment/pedometer/PedMainFragment.java +++ b/app/src/main/java/com/ic/sport/fragment/pedometer/PedMainFragment.java @@ -15,7 +15,7 @@ import android.widget.TextView; import androidx.annotation.NonNull; import androidx.fragment.app.Fragment; -import com.ic.iclooger.ICLogger; +import com.ic.sport.util.ICLogger; import com.ic.sport.App; import com.ic.sport.R; import com.ic.sport.databinding.FragmentPedMainBinding; diff --git a/app/src/main/java/com/ic/sport/fragment/pedometer/PedSetupDialogFragment.java b/app/src/main/java/com/ic/sport/fragment/pedometer/PedSetupDialogFragment.java index 051aab9..8a6f337 100644 --- a/app/src/main/java/com/ic/sport/fragment/pedometer/PedSetupDialogFragment.java +++ b/app/src/main/java/com/ic/sport/fragment/pedometer/PedSetupDialogFragment.java @@ -15,7 +15,7 @@ import androidx.annotation.Nullable; import androidx.collection.ArrayMap; import androidx.fragment.app.DialogFragment; -import com.ic.iclooger.ICLogger; +import com.ic.sport.util.ICLogger; import com.ic.sport.R; import com.ic.sport.util.SPUtils; import com.ic.sport.widget.picker.NumericWheelAdapter; diff --git a/app/src/main/java/com/ic/sport/model/PedometerModel.java b/app/src/main/java/com/ic/sport/model/PedometerModel.java index 709cef9..d5e6902 100644 --- a/app/src/main/java/com/ic/sport/model/PedometerModel.java +++ b/app/src/main/java/com/ic/sport/model/PedometerModel.java @@ -15,7 +15,7 @@ import androidx.lifecycle.ViewModel; import androidx.lifecycle.ViewModelProvider; import com.ic.aidl.ped.RecordParcelable; -import com.ic.iclooger.ICLogger; +import com.ic.sport.util.ICLogger; import com.ic.sport.presenter.PedometerPresenter; import com.ic.sport.util.IcLog; diff --git a/app/src/main/java/com/ic/sport/presenter/PedometerPresenter.java b/app/src/main/java/com/ic/sport/presenter/PedometerPresenter.java index 1d27b21..b52fc93 100644 --- a/app/src/main/java/com/ic/sport/presenter/PedometerPresenter.java +++ b/app/src/main/java/com/ic/sport/presenter/PedometerPresenter.java @@ -5,6 +5,7 @@ import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; import android.os.IBinder; +import android.os.Messenger; import androidx.lifecycle.LiveData; import androidx.lifecycle.MutableLiveData; @@ -12,6 +13,7 @@ import androidx.lifecycle.MutableLiveData; import com.ic.aidl.ped.IPedAidlInterface; import com.ic.aidl.ped.IPedRemoteService; import com.ic.aidl.ped.RecordParcelable; +import com.ic.sport.util.ICLogger; import com.ic.sport.util.IcLog; import java.util.Collections; @@ -64,10 +66,21 @@ public class PedometerPresenter { }; public void bindService() { + + ComponentName componentName = new ComponentName( + "com.ic.work", + "com.ic.work.WorkService"); Intent intent = new Intent("com.ic.action.WORK_SERVICE"); - intent.setPackage("com.ic.work"); + intent.setPackage("com.ic.sport"); + intent.setComponent(componentName); intent.putExtra("target", "sport"); - mContext.bindService(intent, connection, Context.BIND_AUTO_CREATE); + ICLogger.d("bindService "+intent); + if (mContext.bindService(intent, connection, Context.BIND_AUTO_CREATE)) + { + ICLogger.d("bind success"); + }else{ + ICLogger.e("bind failed"); + } } public void unbindService() { diff --git a/app/src/main/java/com/ic/sport/util/CrashHandler.java b/app/src/main/java/com/ic/sport/util/CrashHandler.java new file mode 100644 index 0000000..db00637 --- /dev/null +++ b/app/src/main/java/com/ic/sport/util/CrashHandler.java @@ -0,0 +1,214 @@ +package com.ic.sport.util; + +import android.content.Context; +import android.content.pm.PackageInfo; +import android.content.pm.PackageManager; +import android.os.Build; +import android.os.Environment; +import android.os.Looper; +import android.util.Log; +import android.widget.Toast; + +import com.ic.sport.R; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.PrintWriter; +import java.io.StringWriter; +import java.io.Writer; +import java.lang.reflect.Field; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.HashMap; +import java.util.Locale; +import java.util.Map; + +/** + * Created by Administrator on 2017/5/18. + */ + +public class CrashHandler implements Thread.UncaughtExceptionHandler { + public static final String TAG = com.ic.sport.util.CrashHandler.class.getName(); + + // 系统默认的UncaughtException处理类 + private Thread.UncaughtExceptionHandler mDefaultHandler; + // CrashHandler实例 + private static com.ic.sport.util.CrashHandler INSTANCE = new com.ic.sport.util.CrashHandler(); + // 程序的Context对象 + private Context mContext; + // 用来存储设备信息和异常信息 + private Map infos = new HashMap(); + // 用于格式化日期,作为日志文件名的一部分 + private DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss SSS", Locale.getDefault()); + private DateFormat dateFormatDate = new SimpleDateFormat("yyyy-MM-dd", Locale.getDefault()); + + /** + * 保证只有一个CrashHandler实例 + */ + private CrashHandler() { + } + + /** + * 获取CrashHandler实例 ,单例模式 + */ + public static com.ic.sport.util.CrashHandler getInstance() { + return INSTANCE; + } + + /** + * 初始化 + * + * @param context + * @param string + */ + public void init(Context context, String string) { + mContext = context; + // 获取系统默认的UncaughtException处理器 + mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler(); + // 设置该CrashHandler为程序的默认处理器 + Thread.setDefaultUncaughtExceptionHandler(this); + } + + /** + * 当UncaughtException发生时会转入该函数来处理 + */ + @Override + public void uncaughtException(Thread thread, Throwable ex) { + if (!handleException(ex) && mDefaultHandler != null) { + // 如果用户没有处理则让系统默认的异常处理器来处理 + mDefaultHandler.uncaughtException(thread, ex); + } else { + try { + Thread.sleep(3000); + } catch (InterruptedException e) { +// Log.e(TAG, "error : " + e); + e.printStackTrace(); + } + } + + // 退出程序 + ex.printStackTrace(); + android.os.Process.killProcess(android.os.Process.myPid()); + System.exit(1); + } + + /** + * 自定义错误处理,收集错误信息 发送错误报告等操作均在此完成. + * + * @param ex + * @return true:如果处理了该异常信息;否则返回false. + */ + private boolean handleException(Throwable ex) { + if (ex == null) { + return false; + } + // 使用Toast来显示异常信息 + new Thread() { + @Override + public void run() { + Looper.prepare(); + if (mContext != null) { + Toast.makeText(mContext, R.string.program_abnormal, Toast.LENGTH_LONG) + .show(); + Looper.loop(); + } + } + }.start(); + // 收集设备参数信息 + collectDeviceInfo(mContext); + // 保存日志文件 + saveCrashInfo2File(ex); + return true; + } + + /** + * 收集设备参数信息 + * + * @param ctx + */ + public void collectDeviceInfo(Context ctx) { + infos.clear(); + infos.put("===", " PackageInfo ==="); + try { + PackageManager pm = ctx.getPackageManager(); + PackageInfo pi = pm.getPackageInfo(ctx.getPackageName(), PackageManager.GET_ACTIVITIES); + + if (pi != null) { + String versionName = pi.versionName; + String versionCode = pi.versionCode + ""; + infos.put("versionName", versionName); + infos.put("versionCode", versionCode); + } + } catch (PackageManager.NameNotFoundException e) { + Log.e(TAG, "an error occured when collect package info " + e); + } + + infos.put("===", " Build ==="); + Field[] fields = Build.class.getDeclaredFields(); + for (Field field : fields) { + try { + field.setAccessible(true); + infos.put(field.getName(), field.get(null).toString()); + Log.d(TAG, field.getName() + ":" + field.get(null)); + } catch (Exception e) { + Log.e(TAG, "an error occured when collect crash info," + e); + } + } + } + + /** + * 保存错误信息到文件中 + * + * @param ex + * @return 返回文件名称, 便于将文件传送到服务器 + */ + private String saveCrashInfo2File(Throwable ex) { + + String time = formatter.format(new Date()); + StringBuilder sb = new StringBuilder(); + sb.append("=== ").append(time).append(" ===\n"); + + Writer writer = new StringWriter(); + PrintWriter printWriter = new PrintWriter(writer); + ex.printStackTrace(printWriter); +// ex.printStackTrace(); + Throwable cause = ex.getCause(); + while (cause != null) { + cause.printStackTrace(printWriter); + cause = cause.getCause(); +// cause.printStackTrace(); + } + printWriter.close(); + String result = writer.toString(); + sb.append(result); + sb.append("\n"); + + sb.append("--- DEVICE INFO ---\n"); + for (Map.Entry entry : infos.entrySet()) { + String key = entry.getKey(); + String value = entry.getValue(); + sb.append(key).append("=").append(value).append("\n"); + } + sb.append("\n\n"); + + try { + String fileName = "IcWorkService-" + dateFormatDate.format(new Date()) + ".log"; + if (Environment.getExternalStorageState().equals( + Environment.MEDIA_MOUNTED)) { + File dir = new File(Environment.getExternalStorageDirectory().getPath(), "Android/ic/crash/IcWorkService"); + String path = dir.getPath(); + if (!dir.exists()) { + dir.mkdirs(); + } + FileOutputStream fos = new FileOutputStream(new File(path, fileName), true); + fos.write(sb.toString().getBytes()); + fos.close(); + } + return fileName; + } catch (Exception e) { + Log.e(TAG, "an error occured while writing file...," + e); + } + return null; + } +} diff --git a/app/src/main/java/com/ic/sport/util/ICLogger.java b/app/src/main/java/com/ic/sport/util/ICLogger.java new file mode 100644 index 0000000..424387c --- /dev/null +++ b/app/src/main/java/com/ic/sport/util/ICLogger.java @@ -0,0 +1,267 @@ +package com.ic.sport.util; + +import android.content.Context; + +import org.apache.log4j.Level; +import org.apache.log4j.Logger; +import org.apache.log4j.PatternLayout; +import org.apache.log4j.RollingFileAppender; + +import java.io.File; +import java.io.IOException; +import java.io.OutputStream; +import java.io.PrintStream; + +import de.mindpipe.android.logging.log4j.LogConfigurator; + +import static org.apache.log4j.Logger.getLogger; + + +public class ICLogger { + + private static boolean isInitConfig = false; + private static Context mContext = null; + + private static Logger Log = null; + // private static java.util.logging.Logger originLog= getLogger(ICLogger.class.getSimpleName()); + private static final boolean DEBUG = true; //BuildConfig.DEBUG; + + public static void setContext(Context context) { + mContext = context; + } + + private static String getFunctionName() { + StackTraceElement[] currentStack = Thread.currentThread().getStackTrace(); + if (currentStack == null) { + return null; + } else { + int stackLen = currentStack.length; + + for (int i = 0; i < stackLen; ++i) { + StackTraceElement stackElement = currentStack[i]; + if (!stackElement.isNativeMethod() && + !stackElement.getClassName().equals(Thread.class.getName()) && + !stackElement.getClassName().equals(com.ic.sport.util.ICLogger.class.getName())) { + StringBuilder sb = new StringBuilder(); + sb.append("[ "); + sb.append(Thread.currentThread().getName()); + sb.append(": "); + sb.append(stackElement.getFileName()); + sb.append(":"); + sb.append(stackElement.getLineNumber()); + sb.append(" "); + sb.append(stackElement.getMethodName()); + sb.append(" ]"); + return sb.toString(); + } + } + + return null; + } + } + + /** + * 初始化与配置Logger Log4j + * 日志信息格式中符号所代表的含义 + * (1)-X号: X信息输出时左对齐。 + * (2)%p: 输出日志信息优先级,即DEBUG,INFO,WARN,ERROR,FATAL。 + * (3)%d: 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},输出类似:2002å¹´10月18日 22:10:28,921。 + * (4)%r: 输出自应用启动到输出该log信息耗费的毫秒数。 + * (5)%c: 输出日志信息所属的类目,通常就是所在类的全名。 + * (6)%t: 输出产生该日志事件的线程名。 + * (7)%l: 输出日志事件的发生位置,相当于%C.%M(%F:%L)的组合,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main(TestLog4.java:10)。 + * (8)%x: 输出和当前线程相关联的NDC(嵌套诊断环境),尤其用到像java servlets这样的多客户多线程的应用中。 + * (9)%%: 输出一个"%"字符。 + * (10)%F: 输出日志消息产生时所在的文件名称。 + * (11)%L: 输出代码中的行号。 + * (12)%m: 输出代码中指定的消息,产生的日志具体信息。 + * (13)%n: 输出一个回车换行符,Windows平台为"\r\n",Unix平台为"\n"输出日志信息换行。 + * 可以在%与模式字符之间加上修饰符来控制其最小宽度、最大宽度、和文本的对齐方式。如: + * (1)%20c:指定输出category的名称,最小的宽度是20,如果category的名称小于20的话,默认的情况下右对齐。 + * (2)%-20c:指定输出category的名称,最小的宽度是20,如果category的名称小于20的话,"-"号指定左对齐。 + * (3)%.30c:指定输出category的名称,最大的宽度是30,如果category的名称大于30的话,就会将左边多出的字符截掉,但小于30的话也不会有空格。 + * (4)%20.30c:如果category的名称小于20就补空格,并且右对齐,如果其名称长于30字符,就从左边交远销出的字符截掉。 + */ + private static void initConfig() { + if (!isInitConfig) { + + LogConfigurator logConfigurator = new LogConfigurator(); + + String filename = StorageUtils.getExternalStorageLogDir() + File.separator + "ICSportlog.txt"; + logConfigurator.setFileName(filename); // 日志存储路径,如果该路径没有会自动创建文件 + logConfigurator.setRootLevel(Level.ALL); + + logConfigurator.setLevel("log", Level.ALL); + // logConfigurator.setFilePattern("%d %-5p [%c{2}]-[%L] %m%n");// 设置文件输出模式 + logConfigurator.setFilePattern("%d %m%n ");// 设置文件输出模式 +// 02-29 16:28:38.195 4629-4658/com.enqualcomm.support E/com.enqualcomm.support.utils.ICLogger: + logConfigurator.setMaxBackupSize(2); // 设置最大备份数量 + logConfigurator.setMaxFileSize(1024 * 1024 * 20);// 设置最大文件大小 20MB + logConfigurator.setImmediateFlush(true);// 设置是否立即刷新 + logConfigurator.setUseFileAppender(true); // 设置用户文件输出器 + logConfigurator.setInternalDebugging(false); //控制console是否输出 + logConfigurator.setUseLogCatAppender(true); + logConfigurator.setLogCatPattern("%m%n"); + logConfigurator.configure();// 设置提交 + + +// String logfilelist[]={"Log","GPS","Nmea","APILog","alarmCycle","Battery","LBS"}; + + //Log 和log目前是同一个配置 + Log = getLogger("log"); + //Log.info("init Logger " + Log.getName()); + Log.addAppender( getRollingFileAppender("log","%d %m%n ")); + Log.info("init Logger "+Log.getName()+" "+((RollingFileAppender)Log.getAppender("log")).getFile()); + isInitConfig = true; + } + } + + public static void logRAWtoFile(String filename, String msg) { + Log.info(msg); + } + + public static void logToFile(String filename, String msg) { + Log.info(msg); + } + + private static RollingFileAppender getRollingFileAppender(String name, String layoutpattern) { + PatternLayout fileLayout = new PatternLayout(layoutpattern); + String filename = StorageUtils.getExternalStorageLogDir() + File.separator + "IcSport"+name + ".txt"; + RollingFileAppender rollingFileAppender = null; + try { + rollingFileAppender = new RollingFileAppender(fileLayout, filename); + } catch (IOException e) { + e.printStackTrace(); + com.ic.sport.util.ICLogger.e(e.getMessage(), e); + return null; + } + rollingFileAppender.setName(name); + rollingFileAppender.setMaxBackupIndex(2); //最多3个备份文件 + rollingFileAppender.setMaximumFileSize(20 * 1024 * 1024); //10M 大小 + rollingFileAppender.setImmediateFlush(true); + + return rollingFileAppender; + } + + public static void v(String msg) { + initConfig(); + if (Log != null) + Log.debug(buildMessage(msg)); + } + + public static void v(String msg, Throwable thr) { + initConfig(); + if (Log != null) + Log.debug(buildMessage(msg), thr); + } + + public static void d(String msg) { + initConfig(); + if (Log != null) + Log.debug(buildMessage(msg)); + } + + public static void d(String msg, Throwable thr) { + initConfig(); + if (Log != null) + Log.debug(buildMessage(msg), thr); + } + + public static void i(String msg) { + initConfig(); + if (Log != null) + Log.info(buildMessage(msg)); + } + + public static void i(String msg, Throwable thr) { + initConfig(); + if (Log != null) + Log.info(buildMessage(msg), thr); + } + + public static void w(String msg) { + initConfig(); + if (Log != null) + Log.warn(buildMessage(msg)); + } + + public static void w(String msg, Throwable thr) { + initConfig(); + if (Log != null) + Log.warn(buildMessage(msg), thr); + } + + public static void w(Throwable thr) { + initConfig(); + if (Log != null) + Log.warn(buildMessage(""), thr); + } + + public static void e(String msg) { + initConfig(); + if (Log != null) + Log.error(buildMessage(msg)); + } + + public static void e(String msg, Throwable thr) { + initConfig(); + if (Log != null) + Log.error(buildMessage(msg), thr); + } + + public static void PrintExceptionStackTrace(Exception e) { + + StringBuffer sb = new StringBuffer(); + sb.append(e.getMessage()).append("\n"); + e.printStackTrace(new PrintStream(new OutputStream() { + @Override + public void write(int b) throws IOException { + sb.append((char) b); + } + })); + i(sb.toString()); + } + + /** + * 生成消息 + * + * @param msg + * @return + */ + protected static String buildMessage(String msg) { + initConfig(); + if (DEBUG && msg != null) { + String var1 = getFunctionName(); + if (var1 != null) { + StringBuilder sb = new StringBuilder(); + sb.append(var1); + sb.append(" - "); + sb.append(msg); + return sb.toString(); + } else { + return "functionName is null"; + } + } else { + return "msg is null"; + } + } + + public static void log(String TAG, String msg) { + if (DEBUG) { + if (Log != null) Log.debug(TAG + " " + msg); + + } + } + + public static void log(String TAG, String funcName, String msg) { + if (DEBUG) { + if (Log != null) + Log.debug(TAG + " [" + funcName + "]" + msg); + + } + } + + public static void init(Context applicationContext, String icSport) { + } +} + diff --git a/app/src/main/java/com/ic/sport/util/IcLog.java b/app/src/main/java/com/ic/sport/util/IcLog.java index cdc1671..0b37d06 100644 --- a/app/src/main/java/com/ic/sport/util/IcLog.java +++ b/app/src/main/java/com/ic/sport/util/IcLog.java @@ -1,7 +1,4 @@ package com.ic.sport.util; - -import com.ic.iclooger.ICLogger; - /** * @author RyanLee * @date 2018/2/2 diff --git a/app/version_code.properties b/app/version_code.properties index 3a6edfd..22c74c3 100644 --- a/app/version_code.properties +++ b/app/version_code.properties @@ -1,2 +1,2 @@ -#Fri Oct 29 16:44:19 CST 2021 -VERSION_CODE=43 +#Sun Jul 02 11:08:42 CST 2023 +VERSION_CODE=44