From e58073776104ff9c44a17b962be46e35dfce44a8 Mon Sep 17 00:00:00 2001 From: liuguijing <1440265357@qq.com> Date: Wed, 30 Apr 2025 15:20:15 +0800 Subject: [PATCH] =?UTF-8?q?=E8=BF=90=E7=BB=B4=E6=96=B0=E5=A2=9E=20=20?= =?UTF-8?q?=E4=B8=8B=E8=BD=BD=E5=A2=9E=E9=87=8F=E6=9B=B4=E6=96=B0=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/xypower/common/MD5Util.java | 24 +++++++ mpmaster/src/main/cpp/mpmaster.cpp | 2 +- .../java/com/xypower/mpmaster/AppMaster.java | 68 +++++++++++++++---- .../com/xypower/mpmaster/MainActivity.java | 14 ++-- .../com/xypower/mpmaster/MpMasterService.java | 3 + 5 files changed, 90 insertions(+), 21 deletions(-) diff --git a/common/src/main/java/com/xypower/common/MD5Util.java b/common/src/main/java/com/xypower/common/MD5Util.java index 8c37c761..025655f6 100644 --- a/common/src/main/java/com/xypower/common/MD5Util.java +++ b/common/src/main/java/com/xypower/common/MD5Util.java @@ -1,5 +1,8 @@ package com.xypower.common; +import android.content.Context; + +import java.io.FileInputStream; import java.security.MessageDigest; /* loaded from: ds_base_2.0.9_23030112.aar:classes.jar:com/dowse/base/util/MD5Util.class */ @@ -29,4 +32,25 @@ public class MD5Util { } return r.toString(); } + + public static String getFileMd5(String filePath) { + try (FileInputStream fis = new FileInputStream(filePath)) { + MessageDigest md = MessageDigest.getInstance("MD5"); + byte[] buffer = new byte[8192]; // 使用大缓冲区提升性能:ml-citation{ref="5,7" data="citationList"} + int len; + while ((len = fis.read(buffer)) != -1) { + md.update(buffer, 0, len); + } + byte[] digest = md.digest(); + StringBuilder sb = new StringBuilder(); + for (byte b : digest) { + sb.append(String.format("%02x", b & 0xff)); // 处理字节转十六进制:ml-citation{ref="3,7" data="citationList"} + } + return sb.toString(); + } catch (Exception e) { + e.printStackTrace(); + return ""; + } + } + } diff --git a/mpmaster/src/main/cpp/mpmaster.cpp b/mpmaster/src/main/cpp/mpmaster.cpp index 39522304..9d0723c9 100644 --- a/mpmaster/src/main/cpp/mpmaster.cpp +++ b/mpmaster/src/main/cpp/mpmaster.cpp @@ -215,5 +215,5 @@ Java_com_xypower_mpmaster_MpMasterService_applyDiff(JNIEnv *env, jclass clazz, j env->ReleaseStringUTFChars(patch_file, patchFile); env->ReleaseStringUTFChars(new_file, newFile); - return result; + return result == 0 ? JNI_TRUE : JNI_FALSE; } diff --git a/mpmaster/src/main/java/com/xypower/mpmaster/AppMaster.java b/mpmaster/src/main/java/com/xypower/mpmaster/AppMaster.java index 3cd24c8e..e85825be 100644 --- a/mpmaster/src/main/java/com/xypower/mpmaster/AppMaster.java +++ b/mpmaster/src/main/java/com/xypower/mpmaster/AppMaster.java @@ -22,6 +22,7 @@ import com.xypower.common.MD5Util; import com.xypower.common.MicroPhotoContext; import com.xypower.common.ThermalInfoUtil; import com.xypower.common.ZipUtils; +import com.xypower.mpmaster.sms.StringUtils; import org.json.JSONArray; import org.json.JSONObject; @@ -509,28 +510,26 @@ public class AppMaster { if (TextUtils.isEmpty(content)) { return; } - try { mService.logger.info(content); - JSONObject jsonObject = new JSONObject(content); int isUpgrade = jsonObject.optInt("isUpgrade", 0); + String oldMd5 = jsonObject.optString("oldMd5"); + String newMd5 = jsonObject.optString("newMd5"); String url = jsonObject.optString("url", null); long cid = jsonObject.optLong("cid", 0); - int mntnMode = jsonObject.optInt("yw", 0); int quickHbMode = jsonObject.optInt("kxt", 0); mService.setMntnMode(mntnMode != 0, quickHbMode != 0); - if (isUpgrade == 1 && !TextUtils.isEmpty(url)) { upgradeApp(cid, "upgrade", url); + } else if (isUpgrade == 2 && !TextUtils.isEmpty(url)) { + upgradeAppOta(cid,"upgrade",url,oldMd5,newMd5); } processCmd(cid, jsonObject); - JSONArray cmdObjects = jsonObject.optJSONArray("cmds"); - if (cmdObjects != null) { int cnt = cmdObjects.length(); for (int idx = 0; idx < cnt; idx++) { @@ -541,11 +540,9 @@ public class AppMaster { } } } - } catch (Exception e) { e.printStackTrace(); } - } private void sendResult(long cid, int result, String action, String content) { @@ -996,15 +993,12 @@ public class AppMaster { } private void upgradeApp(long cid, String action, String url) { - mService.logger.warning("Recv Upgrade Cmd: url=" + url); - FileDownloader dl = new FileDownloader(); File path = new File(MicroPhotoContext.buildAppDir(mService.getApplicationContext()), "packages"); if (!path.exists()) { path.mkdirs(); } - File file = new File(path, "app.apk"); if (file.exists()) { file.delete(); @@ -1014,7 +1008,6 @@ public class AppMaster { // sendResult(cid, 1, action, action + ":" + mCmdid); Context context = mService.getApplicationContext(); mService.logger.info("Upgrade APP: " + url); - SysApi.installApk(context, apkPath, context.getPackageName(), true); sendResult(cid, 1, action, action + ":" + mCmdid + " is installing"); } else { @@ -1023,6 +1016,57 @@ public class AppMaster { } } + private void upgradeAppOta(long cid, String action, String url,String oldMd5,String newMd5) { + mService.logger.warning("Recv upgradeAppOta Cmd: url=" + url); + if (StringUtils.isEmpty(oldMd5)|| StringUtils.isEmpty(newMd5)) { + mService.logger.warning("upgradeAppOta oldMd5或者newMd5缺失"); + return; + } + Context context = mService.getApplicationContext(); + String urlMd5 = MD5Util.md5(url);//获取URL的Md5 + File path = new File(MicroPhotoContext.buildAppDir(mService.getApplicationContext()), "packages"); + if (!path.exists()) { + path.mkdirs(); + } + //Patch存储路径 + File patchFile = new File(path, urlMd5+".PATCH"); + if (patchFile.exists()) { + patchFile.delete(); + } + String patchPath = patchFile.getAbsolutePath(); + + //老的Apk路径 + File oldApk = new File(path, oldMd5 + ".apk"); + if (!oldApk.exists()) { + mService.logger.warning("upgradeAppOta未找到对应apk:" + oldMd5); + return; + } + String oldApkPath = oldApk.getAbsolutePath(); + + //新的Apk路径 + File newApk = new File(path, newMd5 + ".apk"); + String newApkPath = newApk.getAbsolutePath(); + + //文件下载 + FileDownloader dl = new FileDownloader(); + if (dl.download(url, patchPath)) { + mService.logger.info("upgradeAppOta APP: " + url); + if (oldApk.exists()) { + boolean b = MpMasterService.applyPatch(oldApkPath, patchPath, newApkPath); + if (b ) { + String fileMd5 = MD5Util.getFileMd5(newApk.getAbsolutePath()); + if (newMd5.equals(fileMd5)) { + SysApi.installApk(context, newApkPath, context.getPackageName(), true); + sendResult(cid, 1, action, action + ":" + mCmdid + " is installing"); + } + } + } + } else { + mService.logger.warning("Failed to Download:" + url); + sendResult(cid, 1, action, action + ":" + mCmdid + " download failed"); + } + } + private void upgradeOta(long cid, String action, String url, String fileName, String md5) { mService.logger.warning("Recv Upgrade OTA: url=" + url); diff --git a/mpmaster/src/main/java/com/xypower/mpmaster/MainActivity.java b/mpmaster/src/main/java/com/xypower/mpmaster/MainActivity.java index 33513778..0818596e 100644 --- a/mpmaster/src/main/java/com/xypower/mpmaster/MainActivity.java +++ b/mpmaster/src/main/java/com/xypower/mpmaster/MainActivity.java @@ -177,18 +177,16 @@ public class MainActivity extends AppCompatActivity { // File pathFile = new File(path); // if (!pathFile.exists() && !pathFile.mkdirs()) { // } -// String old = pathFile.getAbsolutePath() + "/data/mpapp_v1.3.149_rel_20250429.apk"; -// String newapp = pathFile.getAbsolutePath() + "/data/mpapp_v1.3.150_rel_20250429.apk"; +// String old = pathFile.getAbsolutePath() + "/data/mpapp_v1.3.150_rel_20250430.apk"; +// String newapp = pathFile.getAbsolutePath() + "/data/mpapp_v1.3.151_rel_20250430.apk"; // String patch = pathFile.getAbsolutePath() + "/data/test.patch"; -// String newpatch = pathFile.getAbsolutePath() + "/data/111.patch"; // String newpath = pathFile.getAbsolutePath() + "/data/new.apk"; -// -// boolean b = MpMasterService.applyPatch(old, newpatch, newpath); +//// +// boolean b = MpMasterService.applyPatch(old, patch, newpath); // System.out.println("" + b); // -//// boolean b = MpMasterService.applyDiff(old, newapp, newpatch); -//// System.out.println("" + b); -// +// boolean b = MpMasterService.applyDiff(old, newapp, patch); +// System.out.println("ceshi ceshi" + b); // } // }).start(); diff --git a/mpmaster/src/main/java/com/xypower/mpmaster/MpMasterService.java b/mpmaster/src/main/java/com/xypower/mpmaster/MpMasterService.java index 8504f5cd..b1702c0a 100644 --- a/mpmaster/src/main/java/com/xypower/mpmaster/MpMasterService.java +++ b/mpmaster/src/main/java/com/xypower/mpmaster/MpMasterService.java @@ -1514,7 +1514,10 @@ public class MpMasterService extends Service { public native static void rebootDevice(); + //用于将差分包跟老app合并生成新App public native static boolean applyPatch(String oldFile, String patchFile, String newFile); + + //用于将新app跟老app计算生成差分包 public native static boolean applyDiff(String oldFile, String patchFile, String newFile);