Tinker: 关于 com.tencent.tinker.loader.TinkerRuntimeException: Tinker Exception:createDelegate failed

Created on 28 Sep 2016  ·  57Comments  ·  Source: Tencent/tinker

关于集成到项目中然后打release包 安装运行后,报 createDelegate 失败 throw new TinkerRuntimeException("createDelegate failed", e); 请帮帮忙~

Most helpful comment

是不是需要在proguard中加上
-keep class com.tencent.tinker.loader.** {
*;
}

-keep class tinker.sample.android.app.SampleApplication {
*;
}

-keep public class * implements com.tencent.tinker.loader.app.ApplicationLifeCycle {
*;
}

-keep public class * extends com.tencent.tinker.loader.TinkerLoader {
*;
}

-keep public class * extends com.tencent.tinker.loader.app.TinkerApplication {
*;
}
这几句啊

All 57 comments

将详细错误打出来吧

qq 20160928105430
qq 20160928104940

qq 20160928105722

就是Class not found,请确定是否已经将那个class编译进去了

应该编译进去了啊·我APPliciton 是用注解方式的,该怎么检查没有将该class编译进去呢,请指教
@DefaultLifeCycle(
application = "xxxxxx.MySampleAppliction", //application类名
flags = ShareConstants.TINKER_ENABLE_ALL, //tinkerFlags tinker运行时支持的补丁包中的文件类型:
loaderClass = "com.tencent.tinker.loader.TinkerLoader", //loaderClassName, 我们这里使用默认即可!
loadVerifyFlag = false)

ClassNotFound的类是什么?

猜测和混淆有关,是不是没有把相关的class keep住

我在打次试试,

ClassNotFount的类是继承 DefaultApplicationLike 的类,我使用 gradlew assembleDebug
生成的包 可以安装运行后不报错,而签名文件打包就会出现上面这个错误。

@zzwwws 混淆的我也加了你们 keep_in_main_dex.txt 这个文件

。。混淆怎么可以加 keep_in_main_dex.txt。。。那个是主dex配置

我加了这句啊, multiDexKeepProguard file("keep_in_main_dex.txt")

。可能我理解错了

multiDexKeepProguard file("keep_in_main_dex.txt") 这个是对的,不过这个是maindex配置。但是proguard配置在编译的时候应该已经自动加上了

我现在是 gradlew assembleDebug 出来的包 能正常运行,而加了混淆签名的包就 报上面的错,说找不到
xxxxxxApplication extends DefaultApplicationLike 的类

image

这个规则应该就会主动包括所有的applicationLike类

@shwenzhang 我记得要keep子类的话,我们一般这么写,不知道上面的那个能不能keep住

 -keep public class * implements com.tencent.tinker.loader.app.ApplicationLiefCycle{
*;
}

我debug 成功了 生成补丁包 。而且执行成功,

现在我再试试,Release版本

@dodola ,我截图截错了。
image

这2个文件不是都在keep_in_main_dex.txt 中? 那么应该会keep住我们的类啊、

keep_in_main_dex.txt 不是那个作用的

那我们还需要在proguard-project.txt 中加keep? 应该不需要了吧!

我重新签名打Release包 这个问题还是存在啊·

@shwenzhang 问题已经解决,谢谢·

问题的原因是什么?

好像问题又出现。。。。。。。还需要

为什么会出现这么奇怪的现象·,,有时release打包成功后运行不报错,有时又不可以了报上面一样的错误?请帮忙帮忙。

  1. 你要确保class not found的类依然在main dex 2. 你要确保那个类名没有被混淆; 3. 你要确保那个类你传递参数的时候传递对了

1 和3 应该都是正确的,1 extends DefaultApplicationLike 3.@DefaultLifeCycle(
application = "com.xx.xx.MySampleApplication",
flags = ShareConstants.TINKER_ENABLE_ALL)

我想请问下注解的Application 打包时 会 生成?还是需要build一下才会生成~

build的时候会生成

我这个错还是存在,10分之一概率能好。

发自网易邮箱大师
在2016年09月28日 21:22,shwenzhang 写道:

build的时候会生成


You are receiving this because you modified the open/close state.
Reply to this email directly, view it on GitHub, or mute the thread.

代码不存在随机性的,要找到真正的原因

是啊,找不到原因啊

发自网易邮箱大师
在2016年09月28日 21:28,shwenzhang 写道:

代码不存在随机性的,要找到真正的原因


You are receiving this because you modified the open/close state.
Reply to this email directly, view it on GitHub, or mute the thread.

你把包的dex通过dex2jar解开,看看是否真的有那个类不是可以了吗?

@shwenzhang 我手动keep住我的那个类,然后反编译解开是有的·,现在报下面的这个错了
image

你看看这个method是不是被proguard优化掉了

private Object a()
{
try
{
Class localClass = Class.forName(this.c, false, getClassLoader());
Class[] arrayOfClass = new Class[9];
arrayOfClass[0] = Application.class;
arrayOfClass[1] = Integer.TYPE;
arrayOfClass[2] = Boolean.TYPE;
arrayOfClass[3] = Long.TYPE;
arrayOfClass[4] = Long.TYPE;
arrayOfClass[5] = Intent.class;
arrayOfClass[6] = [Landroid.content.res.Resources.class;
arrayOfClass[7] = [Ljava.lang.ClassLoader.class;
arrayOfClass[8] = [Landroid.content.res.AssetManager.class;
Constructor localConstructor = localClass.getConstructor(arrayOfClass);
Object[] arrayOfObject = new Object[9];
arrayOfObject[0] = this;
arrayOfObject[1] = Integer.valueOf(this.a);
arrayOfObject[2] = Boolean.valueOf(this.b);
arrayOfObject[3] = Long.valueOf(this.k);
arrayOfObject[4] = Long.valueOf(this.l);
arrayOfObject[5] = this.f;
arrayOfObject[6] = this.h;
arrayOfObject[7] = this.i;
arrayOfObject[8] = this.j;
Object localObject = localConstructor.newInstance(arrayOfObject);
return localObject;
}
catch (Throwable localThrowable)
{
}
throw new TinkerRuntimeException("createDelegate failed", localThrowable);
}

反编译后变成这样了

要反编译的是找不到方法那个类

找不到方法的那个类是TinkerApplication

我能运行成功的包 我反编译后 private Object createDelegate()
{
try
{
Class localClass = Class.forName(this.delegateClassName, false, getClassLoader());
Class[] arrayOfClass = new Class[9];
arrayOfClass[0] = Application.class;
arrayOfClass[1] = Integer.TYPE;
arrayOfClass[2] = Boolean.TYPE;
arrayOfClass[3] = Long.TYPE;
arrayOfClass[4] = Long.TYPE;
arrayOfClass[5] = Intent.class;
arrayOfClass[6] = [Landroid.content.res.Resources.class;
arrayOfClass[7] = [Ljava.lang.ClassLoader.class;
arrayOfClass[8] = [Landroid.content.res.AssetManager.class;
Constructor localConstructor = localClass.getConstructor(arrayOfClass);
Object[] arrayOfObject = new Object[9];
arrayOfObject[0] = this;
arrayOfObject[1] = Integer.valueOf(this.tinkerFlags);
arrayOfObject[2] = Boolean.valueOf(this.tinkerLoadVerifyFlag);
arrayOfObject[3] = Long.valueOf(this.applicationStartElapsedTime);
arrayOfObject[4] = Long.valueOf(this.applicationStartMillisTime);
arrayOfObject[5] = this.tinkerResultIntent;
arrayOfObject[6] = this.resources;
arrayOfObject[7] = this.classLoader;
arrayOfObject[8] = this.assetManager;
Object localObject = localConstructor.newInstance(arrayOfObject);
return localObject;
}
catch (Throwable localThrowable)
{
}
throw new TinkerRuntimeException("createDelegate failed", localThrowable);
}
是这样的

是不是需要在proguard中加上
-keep class com.tencent.tinker.loader.** {
*;
}

-keep class tinker.sample.android.app.SampleApplication {
*;
}

-keep public class * implements com.tencent.tinker.loader.app.ApplicationLifeCycle {
*;
}

-keep public class * extends com.tencent.tinker.loader.TinkerLoader {
*;
}

-keep public class * extends com.tencent.tinker.loader.app.TinkerApplication {
*;
}
这几句啊

我加上这几句keep 打包3个 都能运行成功~,请问需要这样做?

事情上,如果你用tinker gradle plugin编译,上面的都已经自动加入了。我不知道你那边是为什么没有生效,还是你那边做了什么特殊的事情

也就是说··用了tinker gradle plugin 这个编译上面的keep 都会加上,那么我现在proguard 上加这几句 ,会有问题?

因为在我这边没生效·的情况,加上这几句有问题? 我这边再找找没生效的原因

是不是跟别的plugin有冲突啊,我这边如何不加上的keep几句的话,就会报错的

这边确实是plugin 插件效果没执行啊,还是需要手动加上keep几句到proguard中

image

自己通过源码看一下是为什么不生效即可

ok

今天我也出现了,反编译项目发现SampleApplicationLike这个类被混淆了。。

@guosen gradle编译的吗?应该会自动keep的

en打release包的时候出现,SampleApplicationLike是新建的,不是通过注解生成的,我keep到proguard.txt里面去,就可以了

我也遇到了这个问题,让我百思不得其解,连续三天了,没一点眉目,试过各种方法,就是不行。最后同事那边有突破了,原来这个问题并不是 tinker 的问题,而是在分包的时候,这个类依赖的类,没有被打到主 dex 里面,所以要排查 这个类 继承的类,还有实现的类,是否都在主 dex 里面。

具体问题错误原因是: 找不到依赖的类,所以无法初始化该类,抛出了找不到类异常。

其实你的错误根本原因是找不到 对应的 自定义 Application。 而你自定义的 Application 又继承 和依赖了 其他的类,这些类没有被你放到主 dex 里面,所以提示这个错误。

总结就是:遇到找不到类的错误,不一定是 真的找不到这个类(大多数是这个),也可能是这个类依赖的类找不到。

我的问题就是,CallBack 没有在主 Dex 里面。
image

我也出现楼主的情况,debug包正常,release 安装就崩溃

Was this page helpful?
0 / 5 - 0 ratings

Related issues

xingstarx picture xingstarx  ·  5Comments

taofaqi picture taofaqi  ·  5Comments

AndwareSsj picture AndwareSsj  ·  5Comments

liuguoquan727 picture liuguoquan727  ·  3Comments

devzwy picture devzwy  ·  5Comments