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



就是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 的类

这个规则应该就会主动包括所有的applicationLike类
@shwenzhang 我记得要keep子类的话,我们一般这么写,不知道上面的那个能不能keep住
-keep public class * implements com.tencent.tinker.loader.app.ApplicationLiefCycle{
*;
}
我debug 成功了 生成补丁包 。而且执行成功,
现在我再试试,Release版本
@dodola ,我截图截错了。

这2个文件不是都在keep_in_main_dex.txt 中? 那么应该会keep住我们的类啊、
keep_in_main_dex.txt 不是那个作用的
那我们还需要在proguard-project.txt 中加keep? 应该不需要了吧!
我重新签名打Release包 这个问题还是存在啊·
@shwenzhang 问题已经解决,谢谢·
问题的原因是什么?
好像问题又出现。。。。。。。还需要
为什么会出现这么奇怪的现象·,,有时release打包成功后运行不报错,有时又不可以了报上面一样的错误?请帮忙帮忙。
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住我的那个类,然后反编译解开是有的·,现在报下面的这个错了

你看看这个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中

自己通过源码看一下是为什么不生效即可
ok
今天我也出现了,反编译项目发现SampleApplicationLike这个类被混淆了。。
@guosen gradle编译的吗?应该会自动keep的
en打release包的时候出现,SampleApplicationLike是新建的,不是通过注解生成的,我keep到proguard.txt里面去,就可以了
我也遇到了这个问题,让我百思不得其解,连续三天了,没一点眉目,试过各种方法,就是不行。最后同事那边有突破了,原来这个问题并不是 tinker 的问题,而是在分包的时候,这个类依赖的类,没有被打到主 dex 里面,所以要排查 这个类 继承的类,还有实现的类,是否都在主 dex 里面。
具体问题错误原因是: 找不到依赖的类,所以无法初始化该类,抛出了找不到类异常。
其实你的错误根本原因是找不到 对应的 自定义 Application。 而你自定义的 Application 又继承 和依赖了 其他的类,这些类没有被你放到主 dex 里面,所以提示这个错误。
总结就是:遇到找不到类的错误,不一定是 真的找不到这个类(大多数是这个),也可能是这个类依赖的类找不到。
我的问题就是,CallBack 没有在主 Dex 里面。

我也出现楼主的情况,debug包正常,release 安装就崩溃
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 {
*;
}
这几句啊