Unable to instantiate application xxx.xxx.HolidayApplication: java.lang.ClassNotFoundException: Didn't find class "xxx.xxx.HolidayApplication" on path: DexPathList[[zip file "/data/app/com.example.travalholiday-H0IMJI12auib7KNCt_OdJA==/base.apk"],nativeLibraryDirectories=[/data/app/com.example.travalholiday-H0IMJI12auib7KNCt_OdJA==/lib/arm, /data/app/com.example.travalholiday-H0IMJI12auib7KNCt_OdJA==/base.apk!/lib/armeabi-v7a, /system/lib, /hw_product/lib]]
从网上找了很多资料,总结起来就是两种:
1:打开设置:file->settings,搜索Instant Run,取消勾选Enable?Instant Run
对于这种方法,可能针对android studio2.x的版本才有,而现在都是android studio 4.x ,在setting版面都没有这个选项了。所以该方法无效。
2:更新gradle版本。
3.5.0 - 3.5.4 5.4.1+
3.6.0 - 3.6.4 5.6.4+
4.0.0+ 6.1.1+
4.1.0+ 6.5+
上面是部分的插件版本与gradle的对应版本,因为现在一般都是用3.5.0的插件,前面的就不一一列举,如果想了解,请看:
https://developer.android.google.cn/studio/releases/gradle-plugin#updating-plugin
又是一顿操作,结果还是不行。
最后,找到是因为使用了aspectj的原因。
把对应的aspectj的什么都注释掉,运行成功了。
但是具体的原因是啥,也是不清楚,记录下来,就是给大家一些提示。以后遇到这个问题可以往这个方向考虑。
前面没有时间研究这个具体的原因,后面有时间,仔细的研究了一下,是因为aspectj这个第三方会导致application这个类在mainDex找不到,我们都知道,一般启动相关的类都会打入maindex中,但是由于找不到application,所以才会报上面的错误。
我也按照网上的方法操作了一番,既然我们在miandex上找不到,那我们就将指定的.class打包到mainDex中。
https://blog.csdn.net/weixin_30649859/article/details/99307011
但是本人不才,试了很多种,都没有效果。
后面改用了另外一种方法,不用第三方,直接用最原始的引用。
classpath 'org.aspectj:aspectjtools:1.8.9'
classpath 'org.aspectj:aspectjweaver:1.8.9'
import org.aspectj.bridge.IMessage
import org.aspectj.bridge.MessageHandler
import org.aspectj.tools.ajc.Main
final def log = project.logger
final def variants = project.android.applicationVariants
variants.all { variant ->
if (!variant.buildType.isDebuggable()) {
log.debug("Skipping non-debuggable build type '${variant.buildType.name}'.")
return;
}
JavaCompile javaCompile = variant.javaCompile
javaCompile.doLast {
String[] args = ["-showWeaveInfo",
"-1.8",
"-inpath", javaCompile.destinationDir.toString(),
"-aspectpath", javaCompile.classpath.asPath,
"-d", javaCompile.destinationDir.toString(),
"-classpath", javaCompile.classpath.asPath,
"-bootclasspath", project.android.bootClasspath.join(File.pathSeparator)]
log.debug "ajc args: " + Arrays.toString(args)
MessageHandler handler = new MessageHandler(true);
new Main().run(args, handler);
for (IMessage message : handler.getMessages(null, true)) {
switch (message.getKind()) {
case IMessage.ABORT:
case IMessage.ERROR:
case IMessage.FAIL:
log.error message.message, message.thrown
break;
case IMessage.WARNING:
log.warn message.message, message.thrown
break;
case IMessage.INFO:
log.info message.message, message.thrown
break;
case IMessage.DEBUG:
log.debug message.message, message.thrown
break;
}
}
}
}
按照上面的这种方式,问题解决了。
网友评论