Giter Site home page Giter Site logo

tinker 接入 patch load成功,重启加载失败。patch包中的text.dex 的TinkerTestDexLoad isPatch值是true。但是重启加载检查checkDexInstall 中反射获取isPAatch一直是false。 about tinker HOT 2 OPEN

HeWenhui avatar HeWenhui commented on May 27, 2024
tinker 接入 patch load成功,重启加载失败。patch包中的text.dex 的TinkerTestDexLoad isPatch值是true。但是重启加载检查checkDexInstall 中反射获取isPAatch一直是false。

from tinker.

Comments (2)

woshishuxiong avatar woshishuxiong commented on May 27, 2024

之前遇到过类似的问题,是因为检查的时候拿到的是apk内自带的TinkerTestDexLoad,不是补丁包内的。临时解决方法是打包的时候把TinkerTestDexLoad去掉。

from tinker.

draty01 avatar draty01 commented on May 27, 2024

问题原因是,合成的tinker_classN.apk中,用来检测patch 的 test.dex 放在最后,class load 的时候,就被前面的抢先了。
不知道为啥他们这么设计

我自己简单改了下。


---
Index: tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/TinkerDexLoader.java
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
diff --git a/tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/TinkerDexLoader.java b/tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/TinkerDexLoader.java
--- a/tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/TinkerDexLoader.java	(revision a9c4b7aee1319bf4f4b524e2fe7d700ce1404382)
+++ b/tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/TinkerDexLoader.java	(date 1701688205021)
@@ -224,7 +224,7 @@
         HashMap<String, String> dexes = new HashMap<>();
 
         ShareDexDiffPatchInfo testInfo = null;
-
+        HashSet<ShareDexDiffPatchInfo> myClassNDexInfo = new HashSet<>();
         for (ShareDexDiffPatchInfo info : allDexInfo) {
             //for dalvik, ignore art support dex
             if (isJustArtSupportDex(info)) {
@@ -238,7 +238,7 @@
             if (isVmArt && info.rawName.startsWith(ShareConstants.TEST_DEX_NAME)) {
                 testInfo = info;
             } else if (isVmArt && ShareConstants.CLASS_N_PATTERN.matcher(info.realName).matches()) {
-                classNDexInfo.add(info);
+                myClassNDexInfo.add(info);
             } else {
                 dexes.put(info.realName, getInfoMd5(info));
                 LOAD_DEX_LIST.add(info);
@@ -246,12 +246,15 @@
         }
 
         if (isVmArt
-            && (testInfo != null || !classNDexInfo.isEmpty())) {
+            && (testInfo != null || !myClassNDexInfo.isEmpty())) {
             if (testInfo != null) {
                 classNDexInfo.add(ShareTinkerInternals.changeTestDexToClassN(testInfo, classNDexInfo.size() + 1));
             }
             dexes.put(ShareConstants.CLASS_N_APK_NAME, "");
         }
+        for (ShareDexDiffPatchInfo info : myClassNDexInfo) {
+            classNDexInfo.add(ShareTinkerInternals.changeDexToClassN(info, classNDexInfo.size() + 1));
+        }
         //tinker/patch.info/patch-641e634c/dex
         String dexDirectory = directory + "/" + DEX_PATH + "/";
 
Index: tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/shareutil/ShareTinkerInternals.java
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
diff --git a/tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/shareutil/ShareTinkerInternals.java b/tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/shareutil/ShareTinkerInternals.java
--- a/tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/shareutil/ShareTinkerInternals.java	(revision a9c4b7aee1319bf4f4b524e2fe7d700ce1404382)
+++ b/tinker-android/tinker-android-loader/src/main/java/com/tencent/tinker/loader/shareutil/ShareTinkerInternals.java	(date 1701688205037)
@@ -190,6 +190,17 @@
         return null;
     }
 
+    public static ShareDexDiffPatchInfo changeDexToClassN(ShareDexDiffPatchInfo rawDexInfo, int index){
+        String newName;
+        if (index != 1) {
+            newName = "classes" + index + ".dex";
+        } else {
+            newName = "classes.dex";
+        }
+        return new ShareDexDiffPatchInfo(newName, rawDexInfo.path, rawDexInfo.destMd5InDvm, rawDexInfo.destMd5InArt,
+                rawDexInfo.dexDiffMd5, rawDexInfo.oldDexCrC, rawDexInfo.newOrPatchedDexCrC, rawDexInfo.dexMode);
+    }
+
     public static boolean isNullOrNil(final String object) {
         if ((object == null) || (object.length() <= 0)) {
             return true;


from tinker.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.