Giter Site home page Giter Site logo

tencent / tinker Goto Github PK

View Code? Open in Web Editor NEW
17.0K 697.0 3.3K 6.85 MB

Tinker is a hot-fix solution library for Android, it supports dex, library and resources update without reinstall apk.

License: Other

Java 92.66% Groovy 6.56% Shell 0.12% Python 0.65% AIDL 0.01%
android dynamic hotfix wechat

tinker's Introduction

Tinker

license Release Version PRs Welcome WeChat Approved

中文说明

Tinker is a hot-fix solution library for Android, it supports dex, library and resources update without reinstalling apk.

tinker.png

Getting started

Add tinker-gradle-plugin as a dependency in your main build.gradle in the root of your project:

buildscript {
    dependencies {
        classpath ('com.tencent.tinker:tinker-patch-gradle-plugin:1.9.1')
    }
}

Then you need to "apply" the plugin and add dependencies by adding the following lines to your app/build.gradle.

dependencies {
    //optional, help to generate the final application
    provided('com.tencent.tinker:tinker-android-anno:1.9.1')
    //tinker's main Android lib
    compile('com.tencent.tinker:tinker-android-lib:1.9.1')
}
...
...
apply plugin: 'com.tencent.tinker.patch'

If your app has a class that subclasses android.app.Application, then you need to modify that class, and move all its implements to SampleApplicationLike rather than Application:

-public class YourApplication extends Application {
+public class SampleApplicationLike extends DefaultApplicationLike {

Now you should change your Application class, make it a subclass of TinkerApplication. As you can see from its API, it is an abstract class that does not have a default constructor, so you must define a no-arg constructor:

public class SampleApplication extends TinkerApplication {
    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.app.SampleApplicationLike");
    }
}

Use tinker-android-anno to generate your Application is recommended, you just need to add an annotation for your SampleApplicationLike class

@DefaultLifeCycle(
application = "tinker.sample.android.app.SampleApplication",             //application name to generate
flags = ShareConstants.TINKER_ENABLE_ALL)                                //tinkerFlags above
public class SampleApplicationLike extends DefaultApplicationLike

How to install tinker? learn more at the sample SampleApplicationLike.

For proguard, we have already made the proguard config automatic, and tinker will also generate the multiDex keep proguard file for you.

For more tinker configurations, learn more at the sample app/build.gradle.

Ark Support

How to run tinker on the Ark?

building patch

Just use the following command:

bash build_patch_dexdiff.sh old=xxx new=xxx
  • old indicates the absolute path of android apk(not compiled by Ark) with bugs
  • new indicates the absolute path of android apk(not compiled by Ark) with fixing

The patch file is packaged in APK.

compiling in Ark

TODO

At present it's compiled by Ark compiler team. The output patch is still packaged in APK format without signature.

packaging the patch

For tinker-cli, add the following lines to your tinker_config.xml. Otherwise, the default configure will be used.

<issue id="arkHot">
   <path value="arkHot"/>         // path of patch
   <name value="patch.apk"/>      // name of patch
</issue>

For gradle, add the following lines to your app/build.gradle. Otherwise, the default configure will be used.

ark {
   path = "arkHot"         // path of patch
   name = "patch.apk"      // name of patch
}

The patch is compiled by Ark and placed on the above path. all subsequent operations are same as tinker-cli or gradle.

The ultimated patch APK consists of two patch files:

  • classes.dex for android
  • patch.apk with so for Ark.

Tinker Known Issues

There are some issues which Tinker can't dynamic update.

  1. Can't update AndroidManifest.xml, such as add Android Component.
  2. Do not support some Samsung models with os version android-21.
  3. Due to Google Play Developer Distribution Agreement, we can't dynamic update our apk.

Tinker Support

Any problem?

  1. Learn more from tinker-sample-android.
  2. Read the source code.
  3. Read the wiki or FAQ for help.
  4. Contact us for help.

Contributing

For more information about contributing issues or pull requests, see our Tinker Contributing Guide.

License

Tinker is under the BSD license. See the LICENSE file for details.

tinker's People

Contributors

android-notes avatar burone avatar coofee avatar dodola avatar dotcink avatar fa-shing avatar farmerjohngit avatar fengdai avatar fmoda3 avatar h3r3x3 avatar hk-tang avatar iluhcm avatar jinguang-dong avatar junyuecao avatar kaedea avatar liuling07 avatar lizhangqu avatar ltshddx avatar nalecy avatar noproxy avatar sanjay-f avatar shwenzhang avatar simpleton avatar tp7309 avatar tys282000 avatar wanghanlin avatar wstczlt avatar xingstarx avatar xxnjdlys avatar yanbober avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

tinker's Issues

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。

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

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

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)

用法问题

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

在setting.gradle里面添加sample

include ':tinker-sample-android:app'

,并且将gradle-wrapper.properties修改

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

即可跑起demo

tinkerPatchDebug生成不了补丁包

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

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

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

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

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'.

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

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

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

多谢

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

Wiki Clerical Error

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

自定义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

一直报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
来的

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

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

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

多渠道打包怎么处理

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

task:tinkerPatchVariantName 嘛意思

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

关于文档

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

GetApplicationContent == null

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

这边获得的context 是 null。

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

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

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

tinkerPatchDebug task

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

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

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

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

三星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

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

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提示,求教

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.

kotlin会支持吗?

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

编译报错tinkerId is not set

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

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.