我的应用程序在 21 之前崩溃并java.lang.NoClassDefFoundError app.module.SomeClass出现错误。
我已经启用了 Multidex:
构建.gradle:
android {
defaultConfig {
...
multiDexEnabled true
}
}
dependencies {
...
implementation "androidx.multidex:multidex:2.0.1"
}
Run Code Online (Sandbox Code Playgroud)
我的应用程序类:
class App : DaggerApplication() {
...
override fun attachBaseContext(base: Context) {
super.attachBaseContext(base)
MultiDex.install(this)
}
Run Code Online (Sandbox Code Playgroud)
在阅读了主 DEX 文件中所需的声明类之后,我创建了multidex-config.pro文件以包含app.module.**在主 DEX 文件中:
-keep class app.module.** { *; }
Run Code Online (Sandbox Code Playgroud)
并在 build.gradle 中注册:
android {
buildTypes {
debug {
...
multiDexKeepProguard file('multidex-config.pro')
}
}
Run Code Online (Sandbox Code Playgroud)
我通过检查build/intermediates/legacy_multidex_main_dex_list/debug/mainDexList.txt和分析调试 apk(检查是否classes.dex包含app.module.SomeClass)来确认它。
但我仍然收到java.lang.NoClassDefFoundError …
从0.57 => 0.59迁移应用程序后,我需要修复第三方软件包的一些问题,现在我面临着 dex 问题。
构建.gradle
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
ext {
buildToolsVersion = "28.0.3"
minSdkVersion = 16
compileSdkVersion = 28
targetSdkVersion = 28
// supportLibVersion = "28.0.0"
// supportVersion = "28.0.0"
// googlePlayServicesVersion = "15.0.1"
// facebookSdkVersion = "4.37.0"
}
repositories {
google()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.4.2'
classpath 'com.google.gms:google-services:4.3.0'
// NOTE: Do not place your application dependencies here; they belong
// in the …Run Code Online (Sandbox Code Playgroud) 我按照https://developer.android.com/tools/building/multidex.html上的multidex指南进行操作
但是我发现这个错误没有找到Gradle DSL方法:'multiDexEnabled()'.我更新了Android内置工具,Android支持存储库和库.这是我的gradle.build文件.我在这里做错了吗?
Could not find method multiDexEnabled() for arguments [true] on ProductFlavorDsl_Decorated{name=main, minSdkVersion=ApiVersionImpl{mApiLevel=10, mCodename='null'}, targetSdkVersion=ApiVersionImpl{mApiLevel=17, mCodename='null'}, renderscriptTargetApi=-1, renderscriptSupportMode=null, renderscriptNdkMode=null, versionCode=-1, versionName=null, applicationId=test.com.app, testApplicationId=null, testInstrumentationRunner=null, testHandleProfiling=null, testFunctionalTest=null, signingConfig=null, resConfig=null}.
Run Code Online (Sandbox Code Playgroud)
的build.gradle
apply plugin: 'com.android.application'
android {
compileSdkVersion 19
buildToolsVersion "21.1.1"
defaultConfig {
applicationId "test.com.app"
minSdkVersion 10
targetSdkVersion 17
// Enabling multidex support.
multiDexEnabled true
}
buildTypes {
release {
runProguard false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
}
}
}
dependencies {
compile project(':addThisSDK')
compile project(':centeredContentButton')
compile project(':googleplayservices_lib') …Run Code Online (Sandbox Code Playgroud) android android-studio android-gradle-plugin android-multidex
当我在Android Studio中启用MultiDex功能时,就像文档所说,它会自动转换为两个或更多dex文件.我无法配置它.似乎在主dex文件中,方法的数量非常接近限制(65536).
问题是如何配置它,使主dex文件中的方法数量减少到一定数量,比如60k.我必须将apk上传到亚马逊appstore,亚马逊的人会在主要的dex文件中添加一些方法并使其超过65536的限制.
android android-studio android-gradle-plugin android-multidex
我正在使用使用SugarORM的Android项目.现在方法限制已经增加了很多,我必须激活multidex支持.但是现在我遇到了SugarORM的问题,它只创建了classes.dex文件中的表.它似乎完全忽略了classes2.dex.这真的是Sugar中的一个错误,是否有一些好方法可以绕过这个问题?
我MultiDex在我的android项目中启用了.它工作正常,直到我尝试启用proguard.我可以成功构建项目,但我在启动时遇到运行时异常.它无法找到Application类和MainActivity.在启用之前我遇到了同样的问题MultiDex.现在我想由于某种原因,MultiDex它无法正常使用ProGuard.这是我在logcat中得到的 -
02-17 19:01:09.749: I/MultiDex(2079): VM with version 2.1.0 has multidex support
02-17 19:01:09.749: I/MultiDex(2079): install
02-17 19:01:09.749: I/MultiDex(2079): VM has multidex support, MultiDex support library is disabled.
02-17 19:01:09.750: I/art(2079): Rejecting re-init on previously-failed class java.lang.Class<android.support.v4.app.FragmentActivity>
02-17 19:01:09.750: I/art(2079): Rejecting re-init on previously-failed class java.lang.Class<android.support.v4.app.FragmentActivity>
02-17 19:01:09.751: I/art(2079): Rejecting re-init on previously-failed class java.lang.Class<mypackage.activities.MainActivity>
02-17 19:01:09.751: I/art(2079): Rejecting re-init on previously-failed class java.lang.Class<mypackage.activities.MainActivity>
02-17 19:01:09.751: D/AndroidRuntime(2079): Shutting down VM …Run Code Online (Sandbox Code Playgroud) 我在Android Studio中生成签名的apk时遇到以下错误.
:app:shrinkReleaseMultiDexComponents FAILED
Error:Execution failed for task ':app:shrinkReleaseMultiDexComponents'.
> java.io.IOException: The output jar [E:\SVN_studio\100's\trunk\app\build\intermediates\multi-dex\release\componentClasses.jar] must be specified after an input jar, or it will be empty.
Information:BUILD FAILED
Information:1 error
Information:Total time: 35.975 secs
Information:159 warnings
Run Code Online (Sandbox Code Playgroud)
这是我的build.gradle文件
apply plugin: 'com.android.application'
apply plugin: 'com.google.gms.google-services'
android {
compileSdkVersion 21
buildToolsVersion "22.0.1"
defaultConfig {
applicationId "<packageName>"
minSdkVersion 16
targetSdkVersion 21
versionCode 1
versionName "1.0"
multiDexEnabled true
}
buildTypes {
release {
minifyEnabled true
shrinkResources true
}
}
packagingOptions {
exclude 'META-INF/LICENSE.txt'
} …Run Code Online (Sandbox Code Playgroud) 关于这个问题散布着不少帖子,但我的问题是:
有没有人设法成功构建一个支持MultiDex的应用程序,该应用程序利用将在Lollipop前设备上运行的自定义应用程序类?
对于想要了解更多信息的人,请继续阅读.
问题在于,在创建使用自定义应用程序类的MultiDex应用程序时(我猜绝大多数65k以上的应用程序都属于此类别),该类最终不会出现在导致设备的第一个dex文件中没有内置的MultiDex支持来崩溃错误
[AndroidRuntime] java.lang.RuntimeException:无法实例化应用程序md5a3fc106bb082f0a6c07b5025b0a464e3.MyApplication:java.lang.ClassNotFoundException:路径上没有找到类"md5a3fc106bb082f0a6c07b5025b0a464e3.MyApplication"
我已经尝试了所有列出的解决方案,包括来自Xamarin的支持,以便实现这一目标.
关于它的文章很多:
https://bugzilla.xamarin.com/show_bug.cgi?id=35491 https://forums.xamarin.com/discussion/57485/multiple-issues-with-library-project-and-multidex
我做了什么:
我已经使用mainDexClasses.bat文件的修改版本创建了一个自定义MultiDexMainDexList文件(根据文章).
然后我修改了Xamarin抛出的命令以使用完整路径名,因为Xamarin只是尝试使用"obj\Debug"
mainDexClasses_fixed.bat --output C:\ Users\bradl_000\Documents\blocke79\App\App\obj\Debug\multidex.keep"'C:\ Program Files(x86)\ Reference Assemblies\Microsoft\Framework\MonoAndroid\v6. 0\mono.android.jar ';' C:\ androidsdk \额外\机器人\支持\ multidex \库\库\机器人支撑-multidex.jar ';' C:\用户\ bradl_000 \文件\ blocke79 \应用\ App\obj\Debug__library_projects __\Aniways.AndroidBinding\library_project_imports\aniways-V2.3.08.jar'"(已修剪这个庞大的列表供阅读)
这将生成一个MultiDexMainDexList文件,其中包含项目中的所有类.然后我使用"MultiDexMainDexList"的新构建操作将其添加到我的项目中(仅在Alpha通道v6中可用).
这消除了有关应用程序类的错误,但抛出了一个关于无法找到PackageManager类的新错误.
java.lang.NoClassDefFoundError%3A + mono.MonoPackageManager_Resources
然后我开始考虑我应该减少MultiDexMainDexList文件中的整个类列表,并保留我认为我的自定义应用程序类需要加载的类.无论我对这个列表做了什么,我仍然得到有关PackageManager的错误.包含管理器类,我尝试使用类的顺序,以防有所作为.
单/ MonoPackageManager.class
有没有人走过同样的道路比我更成功?它甚至可能吗?
I have a Xamarin.Android app which I recently switched to use R8 code shrinker. Unfortunately, my app is crashing on startup with the following error:
java.lang.RuntimeException: Unable to get provider com.google.firebase.provider.FirebaseInitProvider: java.lang.ClassNotFoundException: Didn’t find class “com.google.firebase.provider.FirebaseInitProvider” on path: DexPathList[[zip file “/data/app/app-bundle-1/base.apk”],nativeLibraryDirectories=[/data/app/app-bundle-1/lib/arm64, /data/app/app-bundle-1/base.apk!/lib/arm64-v8a, /system/lib64, /vendor/lib64]]
at android.app.ActivityThread.installProvider(ActivityThread.java:6105)
at android.app.ActivityThread.installContentProviders(ActivityThread.java:5572)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5511)
at android.app.ActivityThread.-wrap2(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1611)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:165)
at android.app.ActivityThread.main(ActivityThread.java:6375)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:912)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:802)
Run Code Online (Sandbox Code Playgroud)
I found this article, it's more related to MultiDex and native android …
android xamarin.android android-multidex android-d8 android-r8
我已经更新了所有项目依赖项,并且收到了不同的 R8 错误。
AGPBI: {"kind":"error","text":"java.lang.NullPointerException","sources":[{}],"tool":"D8"}
org.gradle.workers.WorkerExecutionException: There was a failure while executing work items
at org.gradle.workers.internal.DefaultWorkerExecutor.workerExecutionException(DefaultWorkerExecutor.java:267)
at org.gradle.workers.internal.DefaultWorkerExecutor.await(DefaultWorkerExecutor.java:249)
at com.android.build.gradle.internal.tasks.DexArchiveBuilderTaskDelegate.doProcess(DexArchiveBuilderTaskDelegate.kt:227)
at com.android.build.gradle.internal.tasks.DexArchiveBuilderTask.doTaskAction(DexArchiveBuilderTask.kt:255)
at com.android.build.gradle.internal.tasks.NewIncrementalTask$taskAction$$inlined$recordTaskAction$1.invoke(BaseTask.kt:69)
at com.android.build.gradle.internal.tasks.Blocks.recordSpan(Blocks.java:51)
at com.android.build.gradle.internal.tasks.NewIncrementalTask.taskAction(NewIncrementalTask.kt:46)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:104)
at org.gradle.api.internal.project.taskfactory.IncrementalInputsTaskAction.doExecute(IncrementalInputsTaskAction.java:32)
at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:51)
at org.gradle.api.internal.project.taskfactory.AbstractIncrementalTaskAction.execute(AbstractIncrementalTaskAction.java:25)
at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:29)
at org.gradle.api.internal.tasks.execution.TaskExecution$3.run(TaskExecution.java:242)
at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:29)
at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:26)
at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:157)
at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
at org.gradle.internal.operations.DefaultBuildOperationRunner.run(DefaultBuildOperationRunner.java:47)
at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:68)
at org.gradle.api.internal.tasks.execution.TaskExecution.executeAction(TaskExecution.java:227)
at org.gradle.api.internal.tasks.execution.TaskExecution.executeActions(TaskExecution.java:210)
at org.gradle.api.internal.tasks.execution.TaskExecution.executeWithPreviousOutputFiles(TaskExecution.java:193)
at org.gradle.api.internal.tasks.execution.TaskExecution.execute(TaskExecution.java:171)
at org.gradle.internal.execution.steps.ExecuteStep.executeInternal(ExecuteStep.java:89)
at org.gradle.internal.execution.steps.ExecuteStep.access$000(ExecuteStep.java:40)
at org.gradle.internal.execution.steps.ExecuteStep$1.call(ExecuteStep.java:53)
at …Run Code Online (Sandbox Code Playgroud) android-multidex ×10
android ×9
android-d8 ×2
android-r8 ×2
gradle ×1
kotlin ×1
proguard ×1
react-native ×1
release ×1
sugarorm ×1