Git Product home page Git Product logo

tinker's Issues

install 方法的错误

如下两方法

 public static void install(ApplicationLike applicationLike) {
        Tinker tinker = new Tinker.Builder(applicationLike.getApplication()).build();
        tinker.install(applicationLike.getTinkerResultIntent());
    }
public static void install(ApplicationLike applicationLike, LoadReporter loadReporter, PatchReporter patchReporter,
                               PatchListener listener, Class<? extends AbstractResultService> resultServiceClass,
                               AbstractPatch upgradePatchProcessor, AbstractPatch repairPatchProcessor) {

        Tinker tinker = new Tinker.Builder(applicationLike.getApplication())
            .tinkerFlags(applicationLike.getTinkerFlags())
            .loadReport(loadReporter)
            .listener(listener)
            .patchReporter(patchReporter)
            .tinkerLoadVerifyFlag(applicationLike.getTinkerLoadVerifyFlag()).build();

        Tinker.create(tinker);
        tinker.install(applicationLike.getTinkerResultIntent(), resultServiceClass, upgradePatchProcessor, repairPatchProcessor);
    }

使用默认的install方法有问题;少了个 : Tinker.create(tinker);

public static void create(Tinker tinker) {
        if (sInstance != null) {
            throw new TinkerRuntimeException("Tinker instance is already set.");
        }
        sInstance = tinker;
    }

使用install(ApplicationLike applicationLike)这样会造成Tinker中 sInstance 无值
那么在某些地方调用

public static Tinker with(Context context) {
        if (!installed) {
            throw new TinkerRuntimeException("you must install tinker before get tinker sInstance");
        }
        if (sInstance == null) {
            synchronized (Tinker.class) {
                if (sInstance == null) {
                    sInstance = new Builder(context).build();
                }
            }
        }
        return sInstance;
    }

会重新创建,而这个新的对象没有调用过install方法。
比如在:
UpgradePatch#tryPatch 类中的:

  SharePatchInfo oldInfo = manager.getTinkerLoadResultIfPresent().patchInfo;

出现空指针,因为getTinkerLoadResultIfPresent是需要调用了install方法后才存在的:

tinkerLoadResult = new TinkerLoadResult();
tinkerLoadResult.parseTinkerResult(getContext(), intentResult);

错误如下

09-26 18:37:28.178 4464-4490/com.test:patch E/Tinker.DefaultPatchReporter: tinker patch exception  java.lang.NullPointerException: Attempt to read from field 'com.tencent.tinker.loader.shareutil.SharePatchInfo com.tencent.tinker.lib.tinker.TinkerLoadResult.patchInfo' on a null object reference
                                                                               at com.tencent.tinker.lib.patch.UpgradePatch.tryPatch(UpgradePatch.java:70)
                                                                               at com.tencent.tinker.lib.service.TinkerPatchService.onHandleIntent(TinkerPatchService.java:122)
                                                                               at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:65)
                                                                               at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                               at android.os.Looper.loop(Looper.java:135)
                                                                               at android.os.HandlerThread.run(HandlerThread.java:61)



09-26 18:37:28.226 19352-4495/com.test I/Tinker.DefaultTinkerResultService: DefaultTinkerResultService received a result:
PatchResult: 
isUpgradePatch:true
isSuccess:false
rawPatchFilePath:/storage/emulated/0/patch_signed_7zip.apk
costTime:61
patchVersion:null
patchTinkerID:mytinkerId
baseTinkerID:mytinkerId
Throwable:Attempt to read from field 'com.tencent.tinker.loader.shareutil.SharePatchInfo com.tencent.tinker.lib.tinker.TinkerLoadResult.patchInfo' on a null object reference

onPatchPackageCheckFail

我创建了一个工程

...
buildConfig {
   applyMapping = getApplyMappingPath()
   applyResourceMapping = getApplyResourceMappingPath()
   tinkerId = "1.0"
}
...

配置和sample基本上一致,只对自己定义的某些东西进行了修改的。
tinkerId 写死为1.0
Application只进行了默认

@Override
public void onBaseContextAttached(Context base) {
        super.onBaseContextAttached(base);
        TinkerInstaller.install(this);
}

但是始终无法成功,请问还有哪些需要注意的地方吗?

E/Tinker.UpgradePatch: UpgradePatch tryPatch:onPatchPackageCheckFail
I/Tinker.DefaultPatchReporter: patchReporter: package check failed. path:/storage/emulated/0/patch_signed_7zip.apk, isUpgrade:true, code:-7

一直报ERROR_PATCH_RUNNING错误

09-26 17:28:49.766 9526-9526/com.test.android.app I/Tinker.SamplePatchListener: receive a patch file: /storage/emulated/0/patch_signed_7zip.apk, isUpgrade:true, file size:5855
09-26 17:28:49.778 9526-9526/com.test.android.app I/Tinker.DefaultLoadReporter: patch load Reporter: patch receive fail:/storage/emulated/0/patch_signed_7zip.apk, code:-3, isUpgrade:true
09-26 17:29:23.842 9526-9526/com.test.android.app I/Tinker.SamplePatchListener: receive a patch file: /storage/emulated/0/patch_signed_7zip.apk, isUpgrade:true, file size:5855
09-26 17:29:23.846 9526-9526/com.test.android.app I/Tinker.DefaultLoadReporter: patch load Reporter: patch receive fail:/storage/emulated/0/patch_signed_7zip.apk, code:-3, isUpgrade:true
09-26 17:29:49.781 9526-9526/com.test.android.app I/Tinker.SamplePatchListener: receive a patch file: /storage/emulated/0/patch_signed_7zip.apk, isUpgrade:true, file size:5855
09-26 17:29:49.793 9526-9526/com.test.android.app I/Tinker.DefaultLoadReporter: patch load Reporter: patch receive fail:/storage/emulated/0/patch_signed_7zip.apk, code:-3, isUpgrade:true
09-26 17:30:23.847 9526-9526/com.test.android.app I/Tinker.SamplePatchListener: receive a patch file: /storage/emulated/0/patch_signed_7zip.apk, isUpgrade:true, file size:5855
09-26 17:30:23.850 9526-9526/com.test.android.app I/Tinker.DefaultLoadReporter: patch load Reporter: patch receive fail:/storage/emulated/0/patch_signed_7zip.apk, code:-3, isUpgrade:true
看代码是

if (TinkerServiceInternals.isTinkerPatchServiceRunning(context)) { return ShareConstants.ERROR_PATCH_RUNNING; }

被执行,求解如何解决?是什么地方调出了问题?按照tinker Sample
来的

NumberFormatException: For input string: "0x20000"

java.lang.NumberFormatException: For input string: "0x20000"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.lang.Integer.parseInt(Integer.java:580)
at java.lang.Integer.valueOf(Integer.java:766)
at net.dongliu.apk.parser.struct.xml.Attributes.getInt(Attributes.java:40)
at net.dongliu.apk.parser.parser.ApkMetaTranslator.onStartTag(ApkMetaTranslator.java:56)
at net.dongliu.apk.parser.parser.CompositeXmlStreamer.onStartTag(CompositeXmlStreamer.java:19)
at net.dongliu.apk.parser.parser.BinaryXmlParser.readXmlNodeStartTag(BinaryXmlParser.java:189)
at net.dongliu.apk.parser.parser.BinaryXmlParser.parse(BinaryXmlParser.java:101)
at net.dongliu.apk.parser.AbstractApkParser.transBinaryXml(AbstractApkParser.java:164)
at net.dongliu.apk.parser.AbstractApkParser.parseManifestXml(AbstractApkParser.java:123)
at net.dongliu.apk.parser.AbstractApkParser.parseApkMeta(AbstractApkParser.java:105)
at net.dongliu.apk.parser.AbstractApkParser.getApkMeta(AbstractApkParser.java:56)
at com.tencent.tinker.build.apkparser.AndroidManifest.getAndroidManifest(AndroidManifest.java:66)

apkParser有bug,不能识别0x20000

Wiki Clerical Error

Original : "非gradle编译用户的命行版本: tinker-patch-cli.jar"

Public symbol string/com_crashlytics_android_build_id declared here is not defined.

项目使用了twitter开源的的Fabric

apply plugin: 'io.fabric'

gradle build的时候出现以下错误:

tinker gen resource public.xml in build/intermediates/tinker_intermediates/public.xml
tinker gen resource idx.xml in build/intermediates/tinker_intermediates/idx.xml
:app:processDebugResources
/tinker/tinker-sample-android/app/build/intermediates/res/merged/debug/values/public.xml
Error:(473) Public symbol string/com_crashlytics_android_build_id declared here is not defined.
Error:Execution failed for task ':app:processDebugResources'.

Sample工程无法生成patch_signed_7zip.apk

环境: androidStudio 2.2
gradle plugin version 2.2.0
gradle version 2.14.1

刚开始运行工程,报tinkerId not set , 后面我设置为:

tinkerId = '560'
tinkerOldApkPath = "${bakPath}/app-debug-0927-11-44-48.apk"
执行:tinkerPatchDebug 其他文件,文件夹都有app-debug,thinker_result,log.txt等, 但是就是没生成:patch_signed_7zip.apk。。 任务一直卡在app:tinkerPatchDebug。

Tinker.SamplePatchListener: get platform:all之后一直没有回调结果

下面是:patch进程的Log,(应该是找到了补丁文件),之后一直是onTrimMemory level:60这样的Log。

09-26 23:13:09.964 24843-24856/com.example.testtinker:patch I/Tinker.DefaultPatchReporter: patchReporter: patch service start
09-26 23:13:09.968 24843-24856/com.example.testtinker:patch W/Tinker.UpgradePatchRetry: try copy file: /storage/emulated/0/QQBrowser/跨屏穿越/patch_signed_7zip.apk to /data/user/0/com.example.testtinker/tinker/temp.apk
09-26 23:13:09.971 24843-24856/com.example.testtinker:patch I/Tinker.TinkerPatchService: try to increase patch process priority
09-26 23:13:09.999 24843-24856/com.example.testtinker:patch I/Tinker.UpgradePatch: UpgradePatch tryPatch:dexDiffMd5:6452e78ed10bcd0cd2a8dcd5f21d61ac
09-26 23:13:09.999 24843-24856/com.example.testtinker:patch I/Tinker.UpgradePatch: UpgradePatch tryPatch:patchVersionDirectory:/data/user/0/com.example.testtinker/tinker/patch-6452e78e
09-26 23:13:10.000 24843-24856/com.example.testtinker:patch W/Tinker.UpgradePatch: UpgradePatch after /storage/emulated/0/QQBrowser/跨屏穿越/patch_signed_7zip.apk size:4001, /data/user/0/com.example.testtinker/tinker/patch-6452e78e/patch-6452e78e.apk size:4001
09-26 23:13:10.283 24843-24856/com.example.testtinker:patch I/art: Starting a blocking GC Explicit
09-26 23:13:10.292 24843-24856/com.example.testtinker:patch I/art: Explicit concurrent mark sweep GC freed 67518(2MB) AllocSpace objects, 1(16KB) LOS objects, 40% free, 20MB/33MB, paused 77us total 8.915ms
09-26 23:13:10.353 24843-24856/com.example.testtinker:patch I/art: Starting a blocking GC Explicit
09-26 23:13:10.361 24843-24856/com.example.testtinker:patch I/art: Explicit concurrent mark sweep GC freed 62098(1710KB) AllocSpace objects, 0(0B) LOS objects, 40% free, 20MB/34MB, paused 86us total 8.024ms
09-26 23:13:11.180 24843-24856/com.example.testtinker:patch I/art: Starting a blocking GC Explicit
09-26 23:13:11.189 24843-24856/com.example.testtinker:patch I/art: Explicit concurrent mark sweep GC freed 68042(2MB) AllocSpace objects, 0(0B) LOS objects, 40% free, 20MB/34MB, paused 95us total 8.699ms
09-26 23:13:11.263 24843-24856/com.example.testtinker:patch I/art: Starting a blocking GC Explicit
09-26 23:13:11.272 24843-24856/com.example.testtinker:patch I/art: Explicit concurrent mark sweep GC freed 70475(2020KB) AllocSpace objects, 0(0B) LOS objects, 40% free, 20MB/34MB, paused 92us total 8.292ms
09-26 23:13:11.274 24843-24856/com.example.testtinker:patch W/Tinker.DexDiffPatchInternal: success recover dex file: /data/user/0/com.example.testtinker/tinker/patch-6452e78e/dex/classes.dex.jar, use time: 1270
09-26 23:13:11.275 24843-24856/com.example.testtinker:patch I/Tinker.DexDiffPatchInternal: try Extracting /data/user/0/com.example.testtinker/tinker/patch-6452e78e/dex/test.dex.jar
09-26 23:13:11.276 24843-24856/com.example.testtinker:patch I/Tinker.DexDiffPatchInternal: isExtractionSuccessful: true
09-26 23:13:11.342 24843-24856/com.example.testtinker:patch I/Tinker.DexDiffPatchInternal: success dex optimize file, path: /data/user/0/com.example.testtinker/tinker/patch-6452e78e/dex/classes.dex.jar, use time: 66
09-26 23:13:11.393 24843-24856/com.example.testtinker:patch I/Tinker.DexDiffPatchInternal: success dex optimize file, path: /data/user/0/com.example.testtinker/tinker/patch-6452e78e/dex/test.dex.jar, use time: 51
09-26 23:13:11.393 24843-24856/com.example.testtinker:patch I/Tinker.DexDiffPatchInternal: recover dex result:true, cost:1393, isUpgradePatch:true
09-26 23:13:11.393 24843-24856/com.example.testtinker:patch W/Tinker.BsDiffPatchInternal: patch recover, library is not contained
09-26 23:13:11.394 24843-24856/com.example.testtinker:patch W/Tinker.ResDiffPatchInternal: patch recover, resource is not contained
09-26 23:13:11.394 24843-24856/com.example.testtinker:patch I/PatchInfo: rewritePatchInfoFile file path:/data/user/0/com.example.testtinker/tinker/patch.info , oldVer:, newVer:6452e78ed10bcd0cd2a8dcd5f21d61ac
09-26 23:13:11.395 24843-24856/com.example.testtinker:patch W/Tinker.UpgradePatch: UpgradePatch tryPatch: done, it is ok
09-26 23:13:11.396 24843-24856/com.example.testtinker:patch I/Tinker.DefaultPatchReporter: patchReporter: patch all result path:/storage/emulated/0/QQBrowser/跨屏穿越/patch_signed_7zip.apk, success:true, cost:1425, isUpgrade:true
09-26 23:13:11.396 24843-24856/com.example.testtinker:patch I/Tinker.PatchFileUtil: safeDeleteFile, try to delete path: /data/user/0/com.example.testtinker/tinker/patch.retry
09-26 23:13:11.396 24843-24856/com.example.testtinker:patch I/Tinker.PatchFileUtil: safeDeleteFile, try to delete path: /data/user/0/com.example.testtinker/tinker/temp.apk
09-26 23:13:11.405 24843-24843/com.example.testtinker:patch D/Tinker.DefaultAppLike: onTrimMemory level:80
09-26 23:13:54.945 24843-24843/com.example.testtinker:patch D/Tinker.DefaultAppLike: onTrimMemory level:80
09-26 23:13:54.959 24843-24843/com.example.testtinker:patch D/Tinker.DefaultAppLike: onTrimMemory level:80
09-26 23:13:55.254 24843-24843/com.example.testtinker:patch D/Tinker.DefaultAppLike: onTrimMemory level:80
09-26 23:14:29.629 24843-24843/com.example.testtinker:patch D/Tinker.DefaultAppLike: onTrimMemory level:60
09-26 23:14:29.662 24843-24843/com.example.testtinker:patch D/Tinker.DefaultAppLike: onTrimMemory level:60
09-26 23:14:29.679 24843-24843/com.example.testtinker:patch D/Tinker.DefaultAppLike: onTrimMemory level:60
09-26 23:14:38.529 24843-24843/com.example.testtinker:patch D/Tinker.DefaultAppLike: onTrimMemory level:60

app进程的Log:

09-26 23:13:09.870 24690-24690/com.example.testtinker I/Tinker.SamplePatchListener: receive a patch file: /storage/emulated/0/QQBrowser/跨屏穿越/patch_signed_7zip.apk, isUpgrade:true, file size:4001
09-26 23:13:09.883 24690-24690/com.example.testtinker I/Tinker.SamplePatchListener: get platform:all

就一直不往下走了。正常应该出现重启App的Toast提示,求教

用法问题

什么时候可以有空录个视频呗,让我们少爬点坑....

如何把更新的so库也加入到补丁中去?

如果so库出了问题,替换了so库后,如何把更新的so库也加入到补丁中去?而且做到加载patch时会自动加载新的so库,我的试了新,答案是no,patch包只有k,没有加入so库。请问正确的步骤是如何

自定义SampleApplication时,文档的路径描述有误

自定义SampleApplication,在构造中需要加:
public SampleApplication(){ super( //tinkerFlags, which types is supported //dex only, library only, all support ShareConstants.TINKER_ENABLE_ALL, // This is passed as a string so the shell application does not // have a binary dependency on your ApplicationLifeCycle class. "tinker.sample.android.SampleApplicationLike"); }
参数二路径应该为:tinker.sample.android.app.SampleApplicationLike

三星S4 SHV-E330K Android:5.01 测试失败

Load patch日志:
09-26 17:51:16.399 19944-19951/tinker.sample.android I/art: Debugger is no longer active
09-26 17:51:20.609 19944-19951/tinker.sample.android I/art: Debugger is no longer active
09-26 17:50:25.409 19944-19951/tinker.sample.android I/art: Debugger is no longer active
09-26 17:50:43.929 19944-19944/tinker.sample.android E/Tinker.MainActivity: i am on onCreate classloader:dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/tinker.sample.android-1/base.apk"],nativeLibraryDirectories=[/data/app/tinker.sample.android-1/lib/arm, /vendor/lib, /system/lib]]]
09-26 17:50:43.929 19944-19944/tinker.sample.android E/Tinker.MainActivity: i am on onCreate string:I am in the base apk
09-26 17:50:43.929 19944-19944/tinker.sample.android D/Activity: performCreate Call secproduct feature valuefalse
09-26 17:50:43.929 19944-19944/tinker.sample.android D/Activity: performCreate Call debug elastic valuetrue
09-26 17:50:43.929 19944-19944/tinker.sample.android E/Tinker.MainActivity: i am on onResume
09-26 17:50:44.019 19944-19944/tinker.sample.android I/Timeline: Timeline: Activity_idle id: android.os.BinderProxy@63c9da2 time:704055
09-26 17:50:49.879 19944-19944/tinker.sample.android V/ActivityThread: updateVisibility : ActivityRecord{29de7d1c token=android.os.BinderProxy@63c9da2 {tinker.sample.android/tinker.sample.android.app.MainActivity}} show : false
09-26 17:50:49.899 19944-19944/tinker.sample.android D/Tinker.DefaultAppLike: onTrimMemory level:20
09-26 17:51:16.399 19944-19951/tinker.sample.android I/art: Debugger is no longer active
09-26 17:51:20.609 19944-19951/tinker.sample.android I/art: Debugger is no longer active
09-26 17:51:28.579 19944-19951/tinker.sample.android I/art: Debugger is no longer active
09-26 17:52:03.709 19944-19944/tinker.sample.android E/Tinker.MainActivity: i am on onResume
09-26 17:52:03.779 19944-19944/tinker.sample.android I/Timeline: Timeline: Activity_idle id: android.os.BinderProxy@63c9da2 time:783815
09-26 17:52:06.109 19944-19944/tinker.sample.android D/ViewRootImpl: ViewPostImeInputStage ACTION_DOWN
09-26 17:52:06.129 19944-19944/tinker.sample.android I/Tinker.SamplePatchListener: receive a patch file: /storage/emulated/0/patch_signed_7zip.apk, isUpgrade:true, file size:133685
09-26 17:52:06.159 19944-19944/tinker.sample.android I/Tinker.SamplePatchListener: get platform:all
09-26 17:52:08.679 19944-23960/tinker.sample.android I/Tinker.SampleResultService: SampleResultService receive result:
PatchResult:
isUpgradePatch:true
isSuccess:true
rawPatchFilePath:/storage/emulated/0/patch_signed_7zip.apk
costTime:2280
patchVersion:fa92bf3c68b862fb10c1782efb0de761
patchTinkerID:a22a4da
baseTinkerID:a22a4da
Throwable: null
09-26 17:52:08.689 19944-23960/tinker.sample.android I/Process: Sending signal. PID: 23885 SIG: 9
09-26 17:52:08.689 19944-23960/tinker.sample.android I/Tinker.SampleResultService: save delete raw patch file
09-26 17:52:08.689 19944-23960/tinker.sample.android I/Tinker.PatchFileUtil: safeDeleteFile, try to delete path: /storage/emulated/0/patch_signed_7zip.apk
09-26 17:52:08.689 19944-23960/tinker.sample.android I/Tinker.SampleResultService: tinker wait screen to restart process
09-26 17:52:43.679 19944-19944/tinker.sample.android D/Tinker.DefaultAppLike: onTrimMemory level:20
09-26 17:52:46.889 19944-19944/tinker.sample.android E/Tinker.MainActivity: i am on onCreate classloader:dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/tinker.sample.android-1/base.apk"],nativeLibraryDirectories=[/data/app/tinker.sample.android-1/lib/arm, /vendor/lib, /system/lib]]]
09-26 17:52:46.889 19944-19944/tinker.sample.android E/Tinker.MainActivity: i am on onCreate string:I am in the base apk
09-26 17:52:46.889 19944-19944/tinker.sample.android D/Activity: performCreate Call secproduct feature valuefalse
09-26 17:52:46.889 19944-19944/tinker.sample.android D/Activity: performCreate Call debug elastic valuetrue
09-26 17:52:46.889 19944-19944/tinker.sample.android E/Tinker.MainActivity: i am on onResume
09-26 17:52:46.949 19944-19944/tinker.sample.android I/Timeline: Timeline: Activity_idle id: android.os.BinderProxy@1fae0212 time:826986
09-26 17:52:50.099 19944-19944/tinker.sample.android D/ViewRootImpl: ViewPostImeInputStage ACTION_DOWN
09-26 17:52:50.149 19944-19944/tinker.sample.android I/Process: Sending signal. PID: 19944 SIG: 9

---------------------------------------------分割线------------------------------------
kill 重新启动后日志:
09-26 17:52:51.289 25202-25202/? E/Zygote: MountEmulatedStorage()
09-26 17:52:51.289 25202-25202/? E/Zygote: v2
09-26 17:52:51.289 25202-25202/? I/libpersona: KNOX_SDCARD checking this for 10856
09-26 17:52:51.289 25202-25202/? I/libpersona: KNOX_SDCARD not a persona
09-26 17:52:51.289 25202-25202/? I/SELinux: Function: selinux_compare_spd_ram , priority [2] , priority version is VE=SEPF_SHV-E330K_5.0.1_0017
09-26 17:52:51.289 25202-25202/? E/SELinux: [DEBUG] get_category: variable seinfo: default sensitivity: NULL, cateogry: NULL
09-26 17:52:51.289 25202-25202/? I/art: Late-enabling -Xcheck:jni
09-26 17:52:51.359 25202-25202/tinker.sample.android D/ResourcesManager: creating new AssetManager and set to /data/app/tinker.sample.android-1/base.apk
09-26 17:52:51.509 25202-25202/tinker.sample.android W/Tinker.TinkerLoader: tryLoadPatchFiles:isEnabledForResource:true
09-26 17:52:51.509 25202-25202/tinker.sample.android I/PatchInfo: rewritePatchInfoFile file path:/data/data/tinker.sample.android/tinker/patch.info , oldVer:fa92bf3c68b862fb10c1782efb0de761, newVer:fa92bf3c68b862fb10c1782efb0de761
09-26 17:52:51.519 25202-25202/tinker.sample.android W/Tinker.TinkerLoader: tinker safe mode preferName:tinker_own_config_tinker.sample.android count:0
09-26 17:52:51.559 25202-25202/tinker.sample.android W/Tinker.TinkerLoader: after tinker safe mode count:1
09-26 17:52:51.559 25202-25202/tinker.sample.android I/Tinker.TinkerDexLoader: classloader: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/tinker.sample.android-1/base.apk"],nativeLibraryDirectories=[/data/app/tinker.sample.android-1/lib/arm, /vendor/lib, /system/lib]]]
09-26 17:52:51.569 25202-25202/tinker.sample.android W/Tinker.ClassLoaderAdder: checkDexInstall result:false
09-26 17:52:51.569 25202-25202/tinker.sample.android E/Tinker.TinkerDexLoader: install dexes failed
09-26 17:52:51.569 25202-25202/tinker.sample.android W/Tinker.TinkerLoader: tryLoadPatchFiles:onPatchLoadDexesFail
09-26 17:52:51.569 25202-25202/tinker.sample.android D/Tinker.DefaultAppLike: onBaseContextAttached:
09-26 17:52:51.569 25202-25202/tinker.sample.android I/MultiDex: VM with version 2.1.0 has multidex support
09-26 17:52:51.569 25202-25202/tinker.sample.android I/MultiDex: install
09-26 17:52:51.569 25202-25202/tinker.sample.android I/MultiDex: VM has multidex support, MultiDex support library is disabled.
09-26 17:52:51.569 25202-25202/tinker.sample.android I/Tinker.SamplePatchListener: application maxMemory:128
09-26 17:52:51.569 25202-25202/tinker.sample.android W/Tinker.Tinker: tinker patch directory: /data/data/tinker.sample.android/tinker
09-26 17:52:51.569 25202-25202/tinker.sample.android I/Tinker.TinkerLoadResult: parseTinkerResult loadCode:-15
09-26 17:52:51.569 25202-25202/tinker.sample.android I/Tinker.TinkerLoadResult: parseTinkerResult oldVersion:, newVersion:fa92bf3c68b862fb10c1782efb0de761, current:fa92bf3c68b862fb10c1782efb0de761
09-26 17:52:51.569 25202-25202/tinker.sample.android I/Tinker.TinkerLoadResult: Tinker load have exception loadCode:-15
09-26 17:52:51.569 25202-25202/tinker.sample.android E/Tinker.DefaultLoadReporter: tinker dex check fail:Tinker Exception:checkDexInstall failed
09-26 17:52:51.599 25202-25202/tinker.sample.android I/Tinker.DefaultLoadReporter: dex exception disable tinker forever with sp
09-26 17:52:51.629 25202-25202/tinker.sample.android E/Tinker.DefaultLoadReporter: tinker load exception com.tencent.tinker.loader.TinkerRuntimeException: Tinker Exception:checkDexInstall failed
at com.tencent.tinker.loader.SystemClassLoaderAdder.installDexes(SystemClassLoaderAdder.java:74)
at com.tencent.tinker.loader.TinkerDexLoader.loadTinkerJars(TinkerDexLoader.java:107)
at com.tencent.tinker.loader.TinkerLoader.tryLoadPatchFilesInternal(TinkerLoader.java:218)
at com.tencent.tinker.loader.TinkerLoader.tryLoad(TinkerLoader.java:56)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.tencent.tinker.loader.app.TinkerApplication.loadTinker(TinkerApplication.java:169)
at com.tencent.tinker.loader.app.TinkerApplication.onBaseContextAttached(TinkerApplication.java:134)
at com.tencent.tinker.loader.app.TinkerApplication.attachBaseContext(TinkerApplication.java:154)
at android.app.Application.attach(Application.java:205)
at android.app.Instrumentation.newApplication(Instrumentation.java:1004)
at android.app.Instrumentation.newApplication(Instrumentation.java:988)
at android.app.LoadedApk.makeApplication(LoadedApk.java:620)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5086)
at android.app.ActivityThread.access$1600(ActivityThread.java:177)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1509)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:145)
at android.app.ActivityThread.main(ActivityThread.java:5942)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1399)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194)
09-26 17:52:51.629 25202-25202/tinker.sample.android I/Tinker.PatchFileUtil: safeDeleteFile, try to delete path: /data/data/tinker.sample.android/tinker/patch-fa92bf3c/patch-fa92bf3c.apk
09-26 17:52:51.629 25202-25202/tinker.sample.android I/Tinker.PatchFileUtil: safeDeleteFile, try to delete path: /data/data/tinker.sample.android/tinker/patch-fa92bf3c/dex/classes.dex.jar
09-26 17:52:51.629 25202-25202/tinker.sample.android I/Tinker.PatchFileUtil: safeDeleteFile, try to delete path: /data/data/tinker.sample.android/tinker/patch-fa92bf3c/dex/test.dex.jar
09-26 17:52:51.629 25202-25202/tinker.sample.android I/Tinker.PatchFileUtil: safeDeleteFile, try to delete path: /data/data/tinker.sample.android/tinker/patch-fa92bf3c/dex
09-26 17:52:51.629 25202-25202/tinker.sample.android I/Tinker.PatchFileUtil: safeDeleteFile, try to delete path: /data/data/tinker.sample.android/tinker/patch-fa92bf3c/odex/classes.dex.dex
09-26 17:52:51.629 25202-25202/tinker.sample.android I/Tinker.PatchFileUtil: safeDeleteFile, try to delete path: /data/data/tinker.sample.android/tinker/patch-fa92bf3c/odex/test.dex.dex
09-26 17:52:51.629 25202-25202/tinker.sample.android I/Tinker.PatchFileUtil: safeDeleteFile, try to delete path: /data/data/tinker.sample.android/tinker/patch-fa92bf3c/odex
09-26 17:52:51.629 25202-25202/tinker.sample.android I/Tinker.PatchFileUtil: safeDeleteFile, try to delete path: /data/data/tinker.sample.android/tinker/patch-fa92bf3c/res/resources.apk
09-26 17:52:51.629 25202-25202/tinker.sample.android I/Tinker.PatchFileUtil: safeDeleteFile, try to delete path: /data/data/tinker.sample.android/tinker/patch-fa92bf3c/res
09-26 17:52:51.629 25202-25202/tinker.sample.android I/Tinker.PatchFileUtil: safeDeleteFile, try to delete path: /data/data/tinker.sample.android/tinker/patch-fa92bf3c
09-26 17:52:51.629 25202-25202/tinker.sample.android I/Tinker.PatchFileUtil: safeDeleteFile, try to delete path: /data/data/tinker.sample.android/tinker/info.lock
09-26 17:52:51.629 25202-25202/tinker.sample.android I/Tinker.PatchFileUtil: safeDeleteFile, try to delete path: /data/data/tinker.sample.android/tinker/patch.info
09-26 17:52:51.629 25202-25202/tinker.sample.android I/Tinker.PatchFileUtil: safeDeleteFile, try to delete path: /data/data/tinker.sample.android/tinker
09-26 17:52:51.629 25202-25202/tinker.sample.android I/Tinker.DefaultLoadReporter: patch load result, path:/data/data/tinker.sample.android/tinker, code:-15, cost:154
09-26 17:52:51.629 25202-25202/tinker.sample.android W/Tinker.Tinker: tinker load fail!
09-26 17:52:51.689 25202-25202/tinker.sample.android D/Tinker.DefaultAppLike: onCreate
09-26 17:52:51.799 25202-25202/tinker.sample.android E/Tinker.MainActivity: i am on onCreate classloader:dalvik.system.PathClassLoader[DexPathList[[zip file "/data/data/tinker.sample.android/tinker/patch-fa92bf3c/dex/classes.dex.jar", zip file "/data/data/tinker.sample.android/tinker/patch-fa92bf3c/dex/test.dex.jar", zip file "/data/app/tinker.sample.android-1/base.apk"],nativeLibraryDirectories=[/data/app/tinker.sample.android-1/lib/arm, /vendor/lib, /system/lib]]]
09-26 17:52:51.799 25202-25202/tinker.sample.android E/Tinker.MainActivity: i am on onCreate string:I am in the base apk
09-26 17:52:51.799 25202-25202/tinker.sample.android D/Activity: performCreate Call secproduct feature valuefalse
09-26 17:52:51.799 25202-25202/tinker.sample.android D/Activity: performCreate Call debug elastic valuetrue
09-26 17:52:51.799 25202-25202/tinker.sample.android E/Tinker.MainActivity: i am on onResume
09-26 17:52:51.819 25202-25235/tinker.sample.android D/OpenGLRenderer: Render dirty regions requested: true
09-26 17:52:51.889 25202-25235/tinker.sample.android I/Adreno-EGL: <qeglDrvAPI_eglInitialize:410>: EGL 1.4 QUALCOMM build: ()
OpenGL ES Shader Compiler Version: E031.25.01.03
Build Date: 01/08/15 Thu
Local Branch: LA.BF.1.1_RB1_20150108_025_1077123
Remote Branch:
Local Patches:
Reconstruct Branch:
09-26 17:52:51.899 25202-25235/tinker.sample.android I/OpenGLRenderer: Initialized EGL, version 1.4
09-26 17:52:51.929 25202-25235/tinker.sample.android D/OpenGLRenderer: Get maximum texture size. GL_MAX_TEXTURE_SIZE is 4096
09-26 17:52:51.929 25202-25235/tinker.sample.android D/OpenGLRenderer: Enabling debug mode 0
09-26 17:52:52.039 25202-25202/tinker.sample.android W/Tinker.UpgradePatchRetry: onPatchRetryLoad retry info not exist, just return
09-26 17:52:52.039 25202-25202/tinker.sample.android I/Timeline: Timeline: Activity_idle id: android.os.BinderProxy@390df7de time:832072

tinkerPatchDebug task

问下执行tinkerPatchDebug Task正常情况下需要多久 已经20m+了 感觉不大正常啊 还在一直执行

TinkerApplication代替后如何在DefaultApplicationLike获取原先在Application的字段

现在Application被TinkerApplication被代替,原Application有很多static 与global 字段,在各个Activity中用getApplication()获取。现在把业务逻辑都放在DefaultApplicationLike实现,要获取在自己实现的DefaultApplicationLike类中原Application的static 与global 字段方法如何实现。TinkerApplication的delegate是private的无法直接获取

Resource 修改不生效

工程中新增了R.mipmap.cc。
gradle中设置了正确的applyResourceMapping。

UnZipping apk to /Users/xiang/develop/studioSpace/Test2/sma/build/outputs/tinkerPatch/debug/sma-debug
Check for loader classes in dex: ../sma-debug-0927-10-32-53/classes.dex
Found modify resource: res/layout/activity_main.xml
Found add resource: res/mipmap-hdpi-v4/cc.png
Found large modify resource: resources.arsc size:192648

补丁包中存在这个资源

MacBook-Air:tinker xiang$ ls ~/develop/studioSpace/Test2/sma/build/outputs/tinkerPatch/debug/patch_signed_7zip/res/mipmap-hdpi-v4/
cc.png

push补丁包也加载成功了

DefaultTinkerResultService received a result:
PatchResult:
isUpgradePatch:true
isSuccess:true
rawPatchFilePath:/storage/emulated/0/patch_signed_7zip.apk
costTime:1114
patchVersion:ac7dd2f4c2d526ed599275db1092f22c
patchTinkerID:mytinkerId
baseTinkerID:mytinkerId

但是仍然Resources$NotFoundException。

以下是grep tinker.* 日志

I/Tinker.UpgradePatch(18975): UpgradePatch tryPatch:dexDiffMd5:ac7dd2f4c2d526ed599275db1092f22c
I/Tinker.UpgradePatch(18975): UpgradePatch tryPatch:patchVersionDirectory:/data/data/com.test/tinker/patch-ac7dd2f4
W/Tinker.UpgradePatch(18975): UpgradePatch after /storage/emulated/0/patch_signed_7zip.apk size:22867, /data/data/com.test/tinker/patch-ac7dd2f4/patch-ac7dd2f4.apk size:22867
W/Tinker.DexDiffPatchInternal(18975): success recover dex file: /data/data/com.test/tinker/patch-ac7dd2f4/dex/classes.dex.jar, use time: 715
I/Tinker.DexDiffPatchInternal(18975): try Extracting /data/data/com.test/tinker/patch-ac7dd2f4/dex/test.dex.jar
I/Tinker.DexDiffPatchInternal(18975): isExtractionSuccessful: true
I/Tinker.DexDiffPatchInternal(18975): success dex optimize file, path: /data/data/com.test/tinker/patch-ac7dd2f4/dex/classes.dex.jar, use time: 63
I/Tinker.DexDiffPatchInternal(18975): success dex optimize file, path: /data/data/com.test/tinker/patch-ac7dd2f4/dex/test.dex.jar, use time: 52
I/Tinker.DexDiffPatchInternal(18975): recover dex result:true, cost:848, isUpgradePatch:true
W/Tinker.BsDiffPatchInternal(18975): patch recover, library is not contained
I/Tinker.ResDiffPatchInternal(18975): res dir: /data/data/com.test/tinker/patch-ac7dd2f4/res/, meta: resArscMd5:0796b746b4eec787e687c3414391ab55
I/Tinker.ResDiffPatchInternal(18975): arscBaseCrc:3032886354
I/Tinker.ResDiffPatchInternal(18975): pattern:res/.*
I/Tinker.ResDiffPatchInternal(18975): pattern:assets/.*
I/Tinker.ResDiffPatchInternal(18975): pattern:resources\.arsc
I/Tinker.ResDiffPatchInternal(18975): addedSet:res/mipmap-hdpi-v4/cc.png
I/Tinker.ResDiffPatchInternal(18975): modifiedSet:res/layout/activity_main.xml
I/Tinker.ResDiffPatchInternal(18975): largeModifiedSet:resources.arsc
W/Tinker.ResDiffPatchInternal(18975): success recover large modify file:/data/data/com.test/tinker/patch-ac7dd2f4/res/resources.arsc , file size:192648, use time:82
W/Tinker.ResDiffPatchInternal(18975): success recover all large modify use time:86
I/Tinker.PatchFileUtil(18975): safeDeleteFile, try to delete path: /data/data/com.test/tinker/patch-ac7dd2f4/res/resources.arsc

我看了文档和日志没想到哪里出现问题。

tinkerPatchDebug生成不了补丁包

Sample工程,调用tinkerPatchDebug, 执行app: tinkerPatchDebug 20分钟都没有结束,无法生成补丁包。请问是什么原因,需要做什么修改。

java.io.IOException: Cannot run program "jarsigner": CreateProcess error=2, 系统找不到指定的文件。

当我执行java -jar tinker.jar -old old.apk -new new.apk -config tinker_config.xml -out output_path的时候,报错,need help

java -jar E:\work\app\10\test\tinker-patch-cli.jar -old E:\work\app\10\test\old.apk -new E:\work\app\10\test\new.apk -config E:\work\app\10\test\tinker_config.xml -out E:\work\app\10\test\aaa
special configFile file path:E:\work\app\10\test\tinker_config.xml
special output directory path: E:\work\app\10\test\aaa
reading config file, E:\work\app\10\test\tinker_config.xml
-----------------------Tinker patch begin-----------------------
configuration:
oldApk:E:\work\app\10\test\old.apk
newApk:E:\work\app\10\test\new.apk
outputFolder:E:\work\app\10\test\aaa
isIgnoreWarning:false
7-ZipPath:7za
useSignAPk:true
package meta fields:
filed name:patchMessage, filed value:classes.dex
dex configs:
dexMode: jar
dexPattern:classes..dex
dexPattern:assets/secondary-dex-..jar
dex loader:com.tencent.tinker.loader.

dex loader:tinker.sample.android.SampleApplication
lib configs:
libPattern:lib/armeabi/..so
resource configs:
resPattern:res/.

resPattern:resources.arsc
resPattern:AndroidManifest.xml
resPattern:assets/.*
resIgnore change:assets/sample_meta.txt
largeModSize:100kb
useApplyResource:false

Analyze old and new apk files:
old apk: old.apk, size=1325037, md5=3381f286679f2103071568f8c0efb527
new apk: new.apk, size=1325017, md5=49c48574a25bf0116adc7eef7d94f4fb

UnZipping apk to E:\work\app\10\test\aaa\old
UnZipping apk to E:\work\app\10\test\aaa\new
Check for loader classes in dex: ../old/classes.dex
Verifying if patched new dex is logically the same as original new dex: new/classes.dex ...
Gen classes.dex for dalvik full dex file:E:\work\app\10\test\aaa\tempPatchedDexes\full\classes.dex, size:2076496, md5:8c088c810aa6ca7809a302e61db9cca6
Start generating small patch info file...
Gen classes.dex for art small dex file:E:\work\app\10\test\aaa\tempPatchedDexes\small\classes.dex, size:648, md5:b2f4377d6a5bb39affb3a756113cef50
DexDecoder:write meta file data: classes.dex,,8c088c810aa6ca7809a302e61db9cca6,b2f4377d6a5bb39affb3a756113cef50,0a5c8e14727751b8a51672f5d96d7357,1784658777,jar
Add test install result dex: E:\work\app\10\test\aaa\tinker_result\test.dex, size:584
DexDecoder:write test dex meta file data: test.dex,,56900442eb5b7e1de45449d0685e6e00,56900442eb5b7e1de45449d0685e6e00,0,0,jar
General unsigned apk: patch_unsigned.apk
Signing apk: patch_signed.apk
java.io.IOException: Cannot run program "jarsigner": CreateProcess error=2, 系统找不到指定的文件。
at java.lang.ProcessBuilder.start(Unknown Source)
at java.lang.Runtime.exec(Unknown Source)
at java.lang.Runtime.exec(Unknown Source)
at java.lang.Runtime.exec(Unknown Source)
at com.tencent.tinker.build.builder.PatchBuilder.signApk(PatchBuilder.java:101)
at com.tencent.tinker.build.builder.PatchBuilder.buildPatch(PatchBuilder.java:58)
at com.tencent.tinker.build.patch.Runner.tinkerPatch(Runner.java:74)
at com.tencent.tinker.patch.CliMain.run(CliMain.java:103)
at com.tencent.tinker.patch.CliMain.main(CliMain.java:54)
Caused by: java.io.IOException: CreateProcess error=2, 系统找不到指定的文件。
at java.lang.ProcessImpl.create(Native Method)
at java.lang.ProcessImpl.(Unknown Source)
at java.lang.ProcessImpl.start(Unknown Source)
... 9 more

Usage: java -jar tinker.jar -old old.apk -new new.apk -config tinker_config.xml -out output_path

多渠道打包怎么处理

1.是否tinkerPatch出来的补丁只能用在同一个oldApk上。如MyApp版本1,有Patch1补丁,现在提交了新版本MyApp版本2到应用市场,有bug又生出了patch2补丁,请问patch2是一定不可以更新到MyApp版本1了?
2.多渠道打包中,oldApk应该怎么处理?例如,使用应用宝的渠道做oldApk,那么tinkerPatchRelease出来的tinkerPatch补丁就无法在别的渠道的更新了,请问正确的方案步骤是如何处理的。

多渠道打包patch无法更新问题

多渠道打包中,改变的的是AndroidManifest.xml的友盟渠道的变量

我的试验结果是仅仅改变了这一点,别的渠道的apk都无法更新patch,例如,使用应用宝的渠道做oldApk,那么tinkerPatchRelease出来的tinkerPatch补丁只可以更新到应用宝apk,baidu的apk就无法更新patch了,请问有什么方法可以处理这种情况吗。

在setting.gradle里面添加sample

include ':tinker-sample-android:app'

,并且将gradle-wrapper.properties修改

distributionUrl=https://services.gradle.org/distributions/gradle-2.11-all.zip

即可跑起demo

gradle tinkerPatchDebug 调用出错

在用simple的时候 调用报错
found modify resource: AndroidManifest.xml ,but it is AndroidManifest.xml, just ignore!
Warning:ignoreWarning is false, but we found all loader classes don't appear in old primary dex.
java.lang.RuntimeException: com.tencent.tinker.build.util.TinkerPatchException: all loader classes don't appear in old primary dex.
at com.tencent.tinker.build.decoder.ApkDecoder$ApkFilesVisitor.visitFile(ApkDecoder.java:179)
at com.tencent.tinker.build.decoder.ApkDecoder$ApkFilesVisitor.visitFile(ApkDecoder.java:138)
at java.nio.file.Files.walkFileTree(Files.java:2670)
at java.nio.file.Files.walkFileTree(Files.java:2742)
at com.tencent.tinker.build.decoder.ApkDecoder.patch(ApkDecoder.java:113)
at com.tencent.tinker.build.patch.Runner.tinkerPatch(Runner.java:65)
at com.tencent.tinker.build.patch.Runner.run(Runner.java:48)
at com.tencent.tinker.build.patch.Runner.gradleRun(Runner.java:41)
at com.tencent.tinker.build.patch.Runner$gradleRun.call(Unknown Source)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:113)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:125)
at com.tencent.tinker.build.gradle.task.TinkerPatchSchemaTask.tinkerPatch(TinkerPatchSchemaTask.groovy:84)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:75)
at org.gradle.api.internal.project.taskfactory.DefaultTaskClassInfoStore$StandardTaskAction.doExecute(DefaultTaskClassInfoStore.java:133)
at org.gradle.api.internal.project.taskfactory.DefaultTaskClassInfoStore$StandardTaskAction.execute(DefaultTaskClassInfoStore.java:126)
at org.gradle.api.internal.project.taskfactory.DefaultTaskClassInfoStore$StandardTaskAction.execute(DefaultTaskClassInfoStore.java:115)
at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:623)
at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:606)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:80)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:61)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:46)
at org.gradle.api.internal.tasks.execution.PostExecutionAnalysisTaskExecuter.execute(PostExecutionAnalysisTaskExecuter.java:35)
at org.gradle.api.internal.tasks.execution.SkipUpToDateTaskExecuter.execute(SkipUpToDateTaskExecuter.java:64)
at org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter.execute(ValidatingTaskExecuter.java:58)
at org.gradle.api.internal.tasks.execution.SkipEmptySourceFilesTaskExecuter.execute(SkipEmptySourceFilesTaskExecuter.java:52)
at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:52)
at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:53)
at org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter.execute(ExecuteAtMostOnceTaskExecuter.java:43)
at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker.execute(DefaultTaskGraphExecuter.java:203)
at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker.execute(DefaultTaskGraphExecuter.java:185)
at org.gradle.execution.taskgraph.AbstractTaskPlanExecutor$TaskExecutorWorker.processTask(AbstractTaskPlanExecutor.java:74)
at org.gradle.execution.taskgraph.AbstractTaskPlanExecutor$TaskExecutorWorker.run(AbstractTaskPlanExecutor.java:55)
at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:54)
at org.gradle.internal.concurrent.StoppableExecutorImpl$1.run(StoppableExecutorImpl.java:40)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
Caused by: com.tencent.tinker.build.util.TinkerPatchException: all loader classes don't appear in old primary dex.
at com.tencent.tinker.build.util.ExcludedClassModifiedChecker.checkIfExcludedClassWasModifiedInNewDex(ExcludedClassModifiedChecker.java:168)
at com.tencent.tinker.build.decoder.DexDiffDecoder.patch(DexDiffDecoder.java:117)
at com.tencent.tinker.build.decoder.UniqueDexDiffDecoder.patch(UniqueDexDiffDecoder.java:39)
at com.tencent.tinker.build.decoder.ApkDecoder$ApkFilesVisitor.visitFile(ApkDecoder.java:176)
... 41 more

FAILURE: Build failed with an exception.

sync 报错

由于代码命名不规范 导致color以及dimen命名里面有black_0.4_bg 之类的命名,貌似tinker有对这方面的检测,导致一直报错。

E:...\app\build\intermediates\res\merged_360\debug\values\public.xml
Error:(929) Public symbol dimen/common_font_sw320dp_of_10_5 declared here is not defined.
Error:(1023) Public symbol dimen/common_sw320dp_of_0_5 declared here is not defined.
Error:(1007) Public symbol dimen/common_sw320dp_of_12_5 declared here is not defined.
Error:(978) Public symbol dimen/common_sw320dp_of_1_5 declared here is not defined.
Error:(1080) Public symbol dimen/common_sw320dp_of_2_5 declared here is not defined.
Error:(950) Public symbol dimen/common_sw320dp_of_63_5 declared here is not defined.
Error:Execution failed for task ':app:process_360DebugResources'.

com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process 'command 'D:\AndroidStudio\sdk\build-tools\23.0.1\aapt.exe'' finished with non-zero exit value 1

kotlin会支持吗?

项目是用kotlin开发的,tinker支持吗?或者说会把对kotlin的支持规划进tinker的分支里?

patch fail please check reason

arm-v7a android 7.0 模拟器

09-26 14:00:56.515 6711-6718/tinker.sample.android W/art: Suspending all threads took: 7.684ms
09-26 14:02:25.296 6711-6711/tinker.sample.android I/Tinker.SamplePatchListener: receive a patch file: /storage/emulated/0/patch_signed_7zip.apk, isUpgrade:true, file size:4161
09-26 14:02:25.384 6711-6718/tinker.sample.android W/art: Suspending all threads took: 31.644ms
09-26 14:02:25.611 6711-6711/tinker.sample.android I/Tinker.SamplePatchListener: get platform:all
09-26 14:02:25.851 6711-6718/tinker.sample.android W/art: Suspending all threads took: 102.461ms
09-26 14:02:25.870 6711-6711/tinker.sample.android I/Choreographer: Skipped 46 frames! The application may be doing too much work on its main thread.
09-26 14:02:25.937 6711-6722/tinker.sample.android I/art: Background sticky concurrent mark sweep GC freed 20348(1446KB) AllocSpace objects, 9(936KB) LOS objects, 44% free, 4MB/8MB, paused 35.089ms total 392.529ms
09-26 14:02:25.952 6711-6722/tinker.sample.android W/art: Suspending all threads took: 14.166ms
09-26 14:02:29.293 6711-6711/tinker.sample.android I/Tinker.SamplePatchListener: receive a patch file: /storage/emulated/0/patch_signed_7zip.apk, isUpgrade:true, file size:4161
09-26 14:02:29.345 6711-6711/tinker.sample.android I/Tinker.DefaultLoadReporter: patch load Reporter: patch receive fail:/storage/emulated/0/patch_signed_7zip.apk, code:-3, isUpgrade:true
09-26 14:02:31.430 6711-6718/tinker.sample.android W/art: Suspending all threads took: 158.246ms
09-26 14:02:31.516 6711-10816/tinker.sample.android I/Tinker.SampleResultService: SampleResultService receive result:
PatchResult:
isUpgradePatch:true
isSuccess:false
rawPatchFilePath:/storage/emulated/0/patch_signed_7zip.apk
costTime:2465
patchVersion:6cafef544571321a5b8322f1342a2c0c
patchTinkerID:07af56e
baseTinkerID:07af56e
Throwable: null
09-26 14:02:31.550 6711-10816/tinker.sample.android I/Process: Sending signal. PID: 10778 SIG: 9

qq 20160926220241

patch fail, please check reason

Load Patch 提示
patch fail, please check reason
SampleResultService receive result:
PatchResult:
isUpgradePatch:true
isSuccess:false
rawPatchFilePath:/storage/emulated/0/patch_signed_7zip.apk
costTime:146
patchVersion:null
patchTinkerID:null
baseTinkerID:null
Throwable: null

task:tinkerPatchVariantName 嘛意思

直接使用task:tinkerPatchVariantName(例如tinkerPatchDebug、tinkerPatchRelease)即可自动根据Variant选择相应的编译类型
这句话是什么意思呢? 可以具体的展开吗? 有相关实例代码吗?

GetApplicationContent == null

SampleApplicationContext.application = getApplication();
SampleApplicationContext.context = getApplication().getApplicationContext();

这边获得的context 是 null。

编译报错tinkerId is not set

Error:Execution failed for task ':app:tinkerProcessDebugManifest'.
tinkerId is not set!!! 编译报这个错误,是什么原因?

关于文档

能出一个中文版的详细文档,包括做升级包的和整个流程。一直在关注,就是声音大雨点下,希望可以照顾下国内的开发者。英文版也行,关键就是要详细点

Release下打补丁

WIKI中提到的
Release的使用方法
Tinker的使用方式如下,以gradle接入的release包为例:
每次编译或发包将安装包与mapping文件备份;
若有补丁包的需要,按自身需要修改你的代码、库文件等;
将备份的基准安装包与mapping文件输入到tinkerPatch的配置中;

运行tinkerPatchRelease,即可自动编译最新的安装包,并与输入基准包作差异,得到最终的补丁包

Release下gradle打补丁包和Debug下不一样吗?
tinker-sample debug下补丁修复成功
release下补丁编译错误
release下 也是通过修改的tinkerOldApkPath = "${bakPath}/app-release-0927-12-54-38.apk"
错误LOG,谢谢~
UnZipping apk to /Users/lijunjiang/Documents/android/gitlabwidget/tinker/tinker-sample-android/app/build/outputs/tinkerPatch/release/app-release-0927-12-54-38
UnZipping apk to /Users/lijunjiang/Documents/android/gitlabwidget/tinker/tinker-sample-android/app/build/outputs/tinkerPatch/release/app-release
found modify resource: AndroidManifest.xml ,but it is AndroidManifest.xml, just ignore!
Check for loader classes in dex: ../app-release-0927-12-54-38/classes.dex
Warning:ignoreWarning is false, but we found some loader class has been changed in new dex. Such these changes will not take effect!! related classes: {Lcom/tencent/tinker/loader/AndroidNClassLoader;,Lcom/tencent/tinker/loader/TinkerLoader;,Lcom/tencent/tinker/loader/TinkerResourceLoader;}
java.lang.RuntimeException: com.tencent.tinker.build.util.TinkerPatchException: some loader class has been changed in new dex. Such these changes will not take effect!! related classes: {Lcom/tencent/tinker/loader/AndroidNClassLoader;,Lcom/tencent/tinker/loader/TinkerLoader;,Lcom/tencent/tinker/loader/TinkerResourceLoader;}
at com.tencent.tinker.build.decoder.ApkDecoder$ApkFilesVisitor.visitFile(ApkDecoder.java:179)
at com.tencent.tinker.build.decoder.ApkDecoder$ApkFilesVisitor.visitFile(ApkDecoder.java:138)
at java.nio.file.Files.walkFileTree(Files.java:2670)
at java.nio.file.Files.walkFileTree(Files.java:2742)
at com.tencent.tinker.build.decoder.ApkDecoder.patch(ApkDecoder.java:113)
at com.tencent.tinker.build.patch.Runner.tinkerPatch(Runner.java:65)
at com.tencent.tinker.build.patch.Runner.run(Runner.java:48)
at com.tencent.tinker.build.patch.Runner.gradleRun(Runner.java:41)
at com.tencent.tinker.build.patch.Runner$gradleRun.call(Unknown Source)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:113)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:125)
at com.tencent.tinker.build.gradle.task.TinkerPatchSchemaTask.tinkerPatch(TinkerPatchSchemaTask.groovy:84)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:75)
at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$StandardTaskAction.doExecute(AnnotationProcessingTaskFactory.java:227)
at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$StandardTaskAction.execute(AnnotationProcessingTaskFactory.java:220)
at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$StandardTaskAction.execute(AnnotationProcessingTaskFactory.java:209)
at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:585)
at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:568)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:80)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:61)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:46)
at org.gradle.api.internal.tasks.execution.PostExecutionAnalysisTaskExecuter.execute(PostExecutionAnalysisTaskExecuter.java:35)
at org.gradle.api.internal.tasks.execution.SkipUpToDateTaskExecuter.execute(SkipUpToDateTaskExecuter.java:64)
at org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter.execute(ValidatingTaskExecuter.java:58)
at org.gradle.api.internal.tasks.execution.SkipEmptySourceFilesTaskExecuter.execute(SkipEmptySourceFilesTaskExecuter.java:52)
at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:52)
at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:53)
at org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter.execute(ExecuteAtMostOnceTaskExecuter.java:43)
at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker.execute(DefaultTaskGraphExecuter.java:203)
at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker.execute(DefaultTaskGraphExecuter.java:185)
at org.gradle.execution.taskgraph.AbstractTaskPlanExecutor$TaskExecutorWorker.processTask(AbstractTaskPlanExecutor.java:66)
at org.gradle.execution.taskgraph.AbstractTaskPlanExecutor$TaskExecutorWorker.run(AbstractTaskPlanExecutor.java:50)
at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor.process(DefaultTaskPlanExecutor.java:25)
at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter.execute(DefaultTaskGraphExecuter.java:110)
at org.gradle.execution.SelectedTaskExecutionAction.execute(SelectedTaskExecutionAction.java:37)
at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:37)
at org.gradle.execution.DefaultBuildExecuter.access$000(DefaultBuildExecuter.java:23)
at org.gradle.execution.DefaultBuildExecuter$1.proceed(DefaultBuildExecuter.java:43)
at org.gradle.execution.DryRunBuildExecutionAction.execute(DryRunBuildExecutionAction.java:32)
at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:37)
at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:30)
at org.gradle.initialization.DefaultGradleLauncher$4.run(DefaultGradleLauncher.java:154)
at org.gradle.internal.Factories$1.create(Factories.java:22)
at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:90)
at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:52)
at org.gradle.initialization.DefaultGradleLauncher.doBuildStages(DefaultGradleLauncher.java:151)
at org.gradle.initialization.DefaultGradleLauncher.access$200(DefaultGradleLauncher.java:32)
at org.gradle.initialization.DefaultGradleLauncher$1.create(DefaultGradleLauncher.java:99)
at org.gradle.initialization.DefaultGradleLauncher$1.create(DefaultGradleLauncher.java:93)
at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:90)
at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:62)
at org.gradle.initialization.DefaultGradleLauncher.doBuild(DefaultGradleLauncher.java:93)
at org.gradle.initialization.DefaultGradleLauncher.run(DefaultGradleLauncher.java:82)
at org.gradle.launcher.exec.InProcessBuildActionExecuter$DefaultBuildController.run(InProcessBuildActionExecuter.java:94)
at org.gradle.tooling.internal.provider.runner.BuildModelActionRunner.run(BuildModelActionRunner.java:46)
at org.gradle.launcher.exec.ChainingBuildActionRunner.run(ChainingBuildActionRunner.java:35)
at org.gradle.tooling.internal.provider.runner.SubscribableBuildActionRunner.run(SubscribableBuildActionRunner.java:58)
at org.gradle.launcher.exec.ChainingBuildActionRunner.run(ChainingBuildActionRunner.java:35)
at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:43)
at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:28)
at org.gradle.launcher.exec.ContinuousBuildActionExecuter.execute(ContinuousBuildActionExecuter.java:78)
at org.gradle.launcher.exec.ContinuousBuildActionExecuter.execute(ContinuousBuildActionExecuter.java:48)
at org.gradle.launcher.daemon.server.exec.ExecuteBuild.doBuild(ExecuteBuild.java:52)
at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36)
at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
at org.gradle.launcher.daemon.server.exec.WatchForDisconnection.execute(WatchForDisconnection.java:37)
at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
at org.gradle.launcher.daemon.server.exec.ResetDeprecationLogger.execute(ResetDeprecationLogger.java:26)
at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
at org.gradle.launcher.daemon.server.exec.RequestStopIfSingleUsedDaemon.execute(RequestStopIfSingleUsedDaemon.java:34)
at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.call(ForwardClientInput.java:74)
at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.call(ForwardClientInput.java:72)
at org.gradle.util.Swapper.swap(Swapper.java:38)
at org.gradle.launcher.daemon.server.exec.ForwardClientInput.execute(ForwardClientInput.java:72)
at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
at org.gradle.launcher.daemon.server.health.DaemonHealthTracker.execute(DaemonHealthTracker.java:47)
at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
at org.gradle.launcher.daemon.server.exec.LogToClient.doBuild(LogToClient.java:66)
at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36)
at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
at org.gradle.launcher.daemon.server.exec.EstablishBuildEnvironment.doBuild(EstablishBuildEnvironment.java:72)
at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36)
at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
at org.gradle.launcher.daemon.server.health.HintGCAfterBuild.execute(HintGCAfterBuild.java:41)
at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
at org.gradle.launcher.daemon.server.exec.StartBuildOrRespondWithBusy$1.run(StartBuildOrRespondWithBusy.java:50)
at org.gradle.launcher.daemon.server.DaemonStateCoordinator$1.run(DaemonStateCoordinator.java:246)
at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:54)
at org.gradle.internal.concurrent.StoppableExecutorImpl$1.run(StoppableExecutorImpl.java:40)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
Caused by: com.tencent.tinker.build.util.TinkerPatchException: some loader class has been changed in new dex. Such these changes will not take effect!! related classes: {Lcom/tencent/tinker/loader/AndroidNClassLoader;,Lcom/tencent/tinker/loader/TinkerLoader;,Lcom/tencent/tinker/loader/TinkerResourceLoader;}
at com.tencent.tinker.build.util.ExcludedClassModifiedChecker.checkIfExcludedClassWasModifiedInNewDex(ExcludedClassModifiedChecker.java:190)
at com.tencent.tinker.build.decoder.DexDiffDecoder.patch(DexDiffDecoder.java:117)
at com.tencent.tinker.build.decoder.UniqueDexDiffDecoder.patch(UniqueDexDiffDecoder.java:39)
at com.tencent.tinker.build.decoder.ApkDecoder$ApkFilesVisitor.visitFile(ApkDecoder.java:176)
... 97 more
Gradle build daemon disappeared unexpectedly (it may have been killed or may have crashed)

关于AndroidManifest内容动态更新的问题?

你好,在demo中的配置文件中看到这样的注释
case 2: newly added Android Component in AndroidManifest.xml,
* it must be crash when load.

是不是对AndroidManifest.xml的内容 Android Component变化不支持? 如果支持怎么支持呢

多谢

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.