diff --git a/tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/patch/DexDiffPatchInternal.java b/tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/patch/DexDiffPatchInternal.java index 765c6da1..4fb22928 100644 --- a/tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/patch/DexDiffPatchInternal.java +++ b/tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/patch/DexDiffPatchInternal.java @@ -43,6 +43,8 @@ import java.util.zip.ZipInputStream; import java.util.zip.ZipOutputStream; +import dalvik.system.DexFile; + /** * Created by zhangshaowen on 16/4/12. */ @@ -95,10 +97,10 @@ private static boolean patchDexExtractViaDexDiff(Context context, String patchVe boolean isSuccess = TinkerParallelDexOptimizer.optimizeAll( files, optimizeDexDirectoryFile, new TinkerParallelDexOptimizer.ResultCallback() { - long start; + long startTime; @Override public void onStart(File dexFile, File optimizedDir) { - start = System.currentTimeMillis(); + startTime = System.currentTimeMillis(); TinkerLog.i(TAG, "start to optimize dex %s", dexFile.getPath()); } @@ -106,19 +108,43 @@ public void onStart(File dexFile, File optimizedDir) { public void onSuccess(File dexFile, File optimizedDir) { // Do nothing. TinkerLog.i(TAG, "success to optimize dex %s use time %d", - dexFile.getPath(), (System.currentTimeMillis() - start)); + dexFile.getPath(), (System.currentTimeMillis() - startTime)); } @Override public void onFailed(File dexFile, File optimizedDir, Throwable thr) { TinkerLog.i(TAG, "fail to optimize dex %s use time %d", - dexFile.getPath(), (System.currentTimeMillis() - start)); - + dexFile.getPath(), (System.currentTimeMillis() - startTime)); SharePatchFileUtil.safeDeleteFile(dexFile); manager.getPatchReporter().onPatchDexOptFail(patchFile, dexFile, optimizeDexDirectory, dexFile.getName(), thr); } } ); + //list again + if (isSuccess) { + for (File file : files) { + try { + if (!SharePatchFileUtil.isLegalFile(file)) { + TinkerLog.e(TAG, "single dex optimizer file %s is not exist, just return false", file); + return false; + } + String outputPathName = SharePatchFileUtil.optimizedPathFor(file, optimizeDexDirectoryFile); + File outputFile = new File(outputPathName); + if (!SharePatchFileUtil.isLegalFile(outputFile)) { + TinkerLog.e(TAG, "parallel dex optimizer file %s fail, optimize again", outputPathName); + long start = System.currentTimeMillis(); + DexFile.loadDex(file.getAbsolutePath(), outputPathName, 0); + TinkerLog.i(TAG, "success single dex optimize file, path: %s, use time: %d", file.getPath(), (System.currentTimeMillis() - start)); + } + } catch (Throwable e) { + TinkerLog.e(TAG, "dex optimize or load failed, path:" + file.getPath()); + //delete file + SharePatchFileUtil.safeDeleteFile(file); + manager.getPatchReporter().onPatchDexOptFail(patchFile, file, optimizeDexDirectory, file.getName(), e); + return false; + } + } + } return isSuccess; } diff --git a/tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/service/TinkerPatchService.java b/tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/service/TinkerPatchService.java index f8773c5a..db7d4526 100644 --- a/tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/service/TinkerPatchService.java +++ b/tinker-android/tinker-android-lib/src/main/java/com/tencent/tinker/lib/service/TinkerPatchService.java @@ -55,10 +55,14 @@ public TinkerPatchService() { } public static void runPatchService(Context context, String path) { - Intent intent = new Intent(context, TinkerPatchService.class); - intent.putExtra(PATCH_PATH_EXTRA, path); - intent.putExtra(RESULT_CLASS_EXTRA, resultServiceClass.getName()); - context.startService(intent); + try { + Intent intent = new Intent(context, TinkerPatchService.class); + intent.putExtra(PATCH_PATH_EXTRA, path); + intent.putExtra(RESULT_CLASS_EXTRA, resultServiceClass.getName()); + context.startService(intent); + } catch (Throwable throwable) { + TinkerLog.e(TAG, "start patch service fail, exception:" + throwable); + } } public static void setPatchProcessor(AbstractPatch upgradePatch, Class serviceClass) { diff --git a/tinker-build/tinker-patch-gradle-plugin/build.gradle b/tinker-build/tinker-patch-gradle-plugin/build.gradle index 1930bac6..fa4fb4e2 100644 --- a/tinker-build/tinker-patch-gradle-plugin/build.gradle +++ b/tinker-build/tinker-patch-gradle-plugin/build.gradle @@ -9,7 +9,7 @@ dependencies { compile localGroovy() // compile fileTree(dir: 'libs', include: ['*.jar']) compile project(':tinker-build:tinker-patch-lib') - compile 'com.google.gradle:osdetector-gradle-plugin:1.4.0' + compile 'com.google.gradle:osdetector-gradle-plugin:1.2.1' compile 'com.android.tools.build:gradle:2.1.0' } diff --git a/tinker-build/tinker-patch-gradle-plugin/src/main/groovy/com/tencent/tinker/build/gradle/TinkerPatchPlugin.groovy b/tinker-build/tinker-patch-gradle-plugin/src/main/groovy/com/tencent/tinker/build/gradle/TinkerPatchPlugin.groovy index 5d7518a6..ac12f3ff 100644 --- a/tinker-build/tinker-patch-gradle-plugin/src/main/groovy/com/tencent/tinker/build/gradle/TinkerPatchPlugin.groovy +++ b/tinker-build/tinker-patch-gradle-plugin/src/main/groovy/com/tencent/tinker/build/gradle/TinkerPatchPlugin.groovy @@ -36,7 +36,12 @@ class TinkerPatchPlugin implements Plugin { @Override public void apply(Project project) { - project.apply plugin: 'com.google.osdetector' + //osdetector change its plugin name in 1.4.0 + try { + project.apply plugin: 'osdetector' + } catch (Throwable e) { + project.apply plugin: 'com.google.osdetector' + } project.extensions.create('tinkerPatch', TinkerPatchExtension) diff --git a/tinker-sample-android/app/src/main/java/tinker/sample/android/reporter/SampleLoadReporter.java b/tinker-sample-android/app/src/main/java/tinker/sample/android/reporter/SampleLoadReporter.java index 7b85a465..6e310d37 100644 --- a/tinker-sample-android/app/src/main/java/tinker/sample/android/reporter/SampleLoadReporter.java +++ b/tinker-sample-android/app/src/main/java/tinker/sample/android/reporter/SampleLoadReporter.java @@ -17,12 +17,14 @@ package tinker.sample.android.reporter; import android.content.Context; -import android.os.Handler; import android.os.Looper; import android.os.MessageQueue; import com.tencent.tinker.lib.reporter.DefaultLoadReporter; +import com.tencent.tinker.lib.util.TinkerLog; import com.tencent.tinker.loader.shareutil.ShareConstants; +import com.tencent.tinker.loader.shareutil.SharePatchFileUtil; +import com.tencent.tinker.loader.shareutil.ShareTinkerInternals; import java.io.File; @@ -33,7 +35,7 @@ * Created by zhangshaowen on 16/4/13. */ public class SampleLoadReporter extends DefaultLoadReporter { - private Handler handler = new Handler(); + private final static String TAG = "Tinker.SampleLoadReporter"; public SampleLoadReporter(Context context) { super(context); @@ -63,6 +65,17 @@ public void onLoadResult(File patchDirectory, int loadCode, long cost) { @Override public void onLoadException(Throwable e, int errorCode) { super.onLoadException(e, errorCode); + switch (errorCode) { + case ShareConstants.ERROR_LOAD_EXCEPTION_UNCAUGHT: + String uncaughtString = SharePatchFileUtil.checkTinkerLastUncaughtCrash(context); + if (!ShareTinkerInternals.isNullOrNil(uncaughtString)) { + File laseCrashFile = SharePatchFileUtil.getPatchLastCrashFile(context); + SharePatchFileUtil.safeDeleteFile(laseCrashFile); + // found really crash reason + TinkerLog.e(TAG, "tinker uncaught real exception:" + uncaughtString); + } + break; + } SampleTinkerReport.onLoadException(e, errorCode); } diff --git a/tinker-sample-android/app/src/main/java/tinker/sample/android/util/UpgradePatchRetry.java b/tinker-sample-android/app/src/main/java/tinker/sample/android/util/UpgradePatchRetry.java index e7a33595..a714b94f 100644 --- a/tinker-sample-android/app/src/main/java/tinker/sample/android/util/UpgradePatchRetry.java +++ b/tinker-sample-android/app/src/main/java/tinker/sample/android/util/UpgradePatchRetry.java @@ -214,6 +214,7 @@ private void copyToTempFile(File patchFile) { try { SharePatchFileUtil.copyFileUsingStream(patchFile, tempPatchFile); } catch (IOException e) { + TinkerLog.e(TAG, "fail to copy file: %s to %s", patchFile.getAbsolutePath(), tempPatchFile.getAbsolutePath()); } } @@ -238,7 +239,7 @@ static RetryInfo readRetryProperty(File infoFile) { md5 = properties.getProperty(RETRY_FILE_MD5_PROPERTY); times = properties.getProperty(RETRY_COUNT_PROPERTY); } catch (IOException e) { - e.printStackTrace(); + TinkerLog.e(TAG, "fail to readRetryProperty:" + e); } finally { SharePatchFileUtil.closeQuietly(inputStream); }