我正在尝试使用新的multidex选项,但是我收到以下错误:
Execution failed for task ':packageAll[Variant]TestClassesForMultiDex'.
> java.util.zip.ZipException: duplicate entry: android/support/multidex/BuildConfig.class
Run Code Online (Sandbox Code Playgroud)
我已经能够发现问题只发生在运行connectedAndroidTests任务时,而不是简单地构建项目(构建)时.
我最近发现了Android的新MultiDex功能,用于处理超过65,000个引用的应用程序.请参阅:https://developer.android.com/tools/building/multidex.html
有人可以帮我理解以下问题:
1)Gradle构建插件如何确定主要dex文件(classes.dex)与次要dex文件的放置内容?基于该文档,在主要dex中需要某些东西,但它没有给出任何示例.是否所有活动都必须在主要dex文件中?
引用文字:
在Dalvik运行时执行时,主要dex文件中需要哪些类有复杂的要求.Android构建工具更新处理Android需求,但其他包含的库可能还有其他依赖性要求,包括使用内省或从本机代码调用Java方法.在更新multidex构建工具之前,可能无法使用某些库,以允许您指定必须包含在主dex文件中的类.
2)仅针对Android API Level 21(Android L)及更高版本构建时,Gradle Build Plugin中存在不同的行为.它说它更快,因为它"将应用程序的每个模块(包括依赖项)构建为单独的dex文件.这通常被称为预先dexing." Android中模块的定义是什么?这是这里提到的Java库,Android库和Android应用程序模块:http://developer.android.com/sdk/installing/studio-build.html#projectModules?远程或本地二进制依赖项(例如:Jars)是否计为单独的模块,因此可以放入不同的dex文件中,还是根据它们包含在模块中?
android android-build android-activity android-gradle-plugin android-multidex
我有一个针对Android设备的multidex项目.我使用Flexjson.我已经用flexjson 3.3和2.x进行了测试.
它与Android 5.x完美配合,但在Android 4.4.4中崩溃.
看起来Dex支持库与旧的Android版本不合适但我无法分辨.
这是我的堆栈跟踪:
06-29 03:50:44.763 11884-11884/com.pigdroid.gameboard E/AndroidRuntime? FATAL EXCEPTION: main
Process: com.pigdroid.gameboard, PID: 11884
flexjson.JSONException: [ layers.values ]: Could not load com.pigdroid.game.board.tile.model.IntTileLayer
at flexjson.ObjectBinder.findClassInMap(ObjectBinder.java:250)
at flexjson.ObjectBinder.findClassName(ObjectBinder.java:213)
at flexjson.ObjectBinder.bind(ObjectBinder.java:92)
at flexjson.ObjectBinder.bindIntoCollection(ObjectBinder.java:110)
at flexjson.factories.ListObjectFactory.instantiate(ListObjectFactory.java:13)
at flexjson.ObjectBinder.bind(ObjectBinder.java:95)
at flexjson.ObjectBinder.bindIntoObject(ObjectBinder.java:149)
at flexjson.factories.ExistingObjectFactory.instantiate(ExistingObjectFactory.java:25)
at flexjson.ObjectBinder.bind(ObjectBinder.java:95)
at flexjson.ObjectBinder.bind(ObjectBinder.java:74)
at flexjson.JSONDeserializer.deserialize(JSONDeserializer.java:241)
at flexjson.JSONDeserializer.deserializeInto(JSONDeserializer.java:301)
at com.pigdroid.game.model.memento.UndoableObject.from(UndoableObject.java:35)
at com.pigdroid.game.controller.GameController.loadModelFromSerialized(GameController.java:108)
at com.pigdroid.gameboard.view.detail.game.tile.TileBoardGameFragmentController.setGame(TileBoardGameFragmentController.java:692)
at com.pigdroid.gameboard.view.detail.game.GameDetailFragment.onKickOff(GameDetailFragment.java:168)
at com.pigdroid.gameboard.view.ServiceFragment.kickOffIf(ServiceFragment.java:71)
at com.pigdroid.gameboard.view.detail.game.GameDetailFragment.kickOffIf(GameDetailFragment.java:159)
at com.pigdroid.gameboard.view.ServiceFragment$3.bound(ServiceFragment.java:52)
at com.pigdroid.gameboard.view.ServiceFragment$3.bound(ServiceFragment.java:48)
at com.pigdroid.android.hateaidl.HateAIDLConnection$3.onServiceConnected(HateAIDLConnection.java:118)
at android.app.LoadedApk$ServiceDispatcher.doConnected(LoadedApk.java:1101)
at android.app.LoadedApk$ServiceDispatcher$RunConnection.run(LoadedApk.java:1118)
at android.os.Handler.handleCallback(Handler.java:733)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5001) …Run Code Online (Sandbox Code Playgroud) 我创建了Xamarin Forms应用程序.我使用Android的multidex(许多库).我使用带有MultiDexMainDexList选项的multidex.keep文件.现在部署工作.但是我在调试模式下遇到异常:
System.ArgumentException: The offset and length have exceeded the bounds of the array or the counter value exceeds the number of elements from the pointer to the end of the original collection.
? System.Buffer.BlockCopy(Array src, Int32 srcOffset, Array dst, Int32 dstOffset, Int32 count)
? Mono.Cecil.Metadata.GuidHeap.Read(UInt32 index)
? Mono.Cecil.MetadataReader.InitializeCustomDebugInformations()
? Mono.Cecil.MetadataReader.GetCustomDebugInformation(ICustomDebugInformationProvider provider)
? Mono.Cecil.Cil.PortablePdbReader.Read(MethodDefinition method)
? Mono.Cecil.Cil.CodeReader.ReadMethodBody()
? Mono.Cecil.Cil.CodeReader.ReadMethodBody(MethodDefinition method)
? Mono.Cecil.MethodDefinition.<>c.<get_Body>b__41_0(MethodDefinition method, MetadataReader reader)
? Mono.Cecil.ModuleDefinition.Read[TItem,TRet](TRet& variable, TItem item, Func`3 read)
? Mono.Cecil.MethodDefinition.get_Body()
Mono.Cecil.MethodDefinition.get_DebugInformation()
? Mono.Debugging.Soft.SoftDebuggerSession.LoadPdbType(TypeDefinition type, Dictionary`2 fileToSourceFileInfos) …Run Code Online (Sandbox Code Playgroud) 找不到multidex.jar(com.android.support:multidex:1.0.2).在以下位置搜索:https: //jcenter.bintray.com/com/android/support/multidex/1.0.2/multidex
我刚刚安装了最新版本的Android Studio 3.1.3当我尝试同步我的项目时,显示无法解决:multidex
此外,我尝试https://jcenter.bintray.com/com/android/support/multidex/1.0.2/multidex此链接显示404错误.请帮忙
项目等级:
// Top-level build file where you can add configuration options common to all sub-projects/modules.
apply from: 'buildsystem/dependencies.gradle'
buildscript {
repositories {
jcenter()
mavenCentral()
maven { url 'https://maven.fabric.io/public' }
maven {
url 'https://maven.google.com'
}
}
dependencies {
classpath 'com.android.tools.build:gradle:3.0.1'
classpath 'com.frogermcs.androiddevmetrics:androiddevmetrics-plugin:0.5'
classpath 'com.google.gms:google-services:3.1.2'
classpath 'io.fabric.tools:gradle:1.25.1'
}
}
allprojects {
ext {
androidApplicationId = 'com.medikoe.connect'
androidVersionCode = 23
androidVersionName = "1.7.2"
testInstrumentationRunner = "android.support.test.runner.AndroidJUnitRunner"
testApplicationId = 'com.medikoe.test'
}
}
task clean(type: …Run Code Online (Sandbox Code Playgroud) 我已经到处搜索了这个问题,但仍然没有解决方案。
gradle 有 minSdkVersion 21 和 targetSdkVersion 29
我只在 API 29 中遇到错误,然后应用程序无法加载并显示空白屏幕。当我看到 logcat 它给出了这样的错误:
E/LoadedApk: Unable to instantiate appComponentFactory
java.lang.ClassNotFoundException: Didn't find class "androidx.core.app.CoreComponentFactory" on path: DexPathList[[],nativeLibraryDirectories=[/data/app/com.packagename.appname-BxS7Zs-h0IWwJAVhbjx7aQ==/lib/x86, /data/app/com.packagename.appname-BxS7Zs-h0IWwJAVhbjx7aQ==/base.apk!/lib/x86, /system/lib, /system/product/lib]]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:196)
at java.lang.ClassLoader.loadClass(ClassLoader.java:379)
at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
at android.app.LoadedApk.createAppFactory(LoadedApk.java:256)
at android.app.LoadedApk.updateApplicationInfo(LoadedApk.java:370)
at android.app.ActivityThread.handleDispatchPackageBroadcast(ActivityThread.java:5951)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1941)
at android.os.Handler.dispatchMessage(Handler.java:107)
at android.os.Looper.loop(Looper.java:214)
at com.android.server.SystemServer.run(SystemServer.java:541)
at com.android.server.SystemServer.main(SystemServer.java:349)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:908)
Run Code Online (Sandbox Code Playgroud)
我认为它似乎来自 multidex,然后我尝试将以下代码添加到 gradle app
multiDexKeepFile 文件('multidex-config.txt')
multiDexKeepProguard 文件('multidex-config.pro')
我的 multidex-config.txt
com/packagename/appname/androidx.class
Run Code Online (Sandbox Code Playgroud)
我的 multidex-config.pro
-keep class androidx.core.app.CoreComponentFactory { *; }
Run Code Online (Sandbox Code Playgroud)
我的 App …
我试图在eclipse中构建Multidex apk,但无法成功.
我尝试了以下步骤,在Android应用程序中配置Multidex支持:
我仍然无法建立apk.
Android开发人员 也没有任何关于在eclipse中构建Multidex apk的文档,它只有gradle和Android Studio的文档.
我们在我们的应用程序中使用multidex很长一段时间但最近使用最新更新它在android API <19上失败,例如带有api 16的模拟器它是标准的java.lang.NoClassDefFoundError.
如果我为缺少的类定义multidexKeepProguard,例如java.lang.NoClassDefFoundError.rx.plugins.RxJavaHooks异常
-keep class rx.plugins.**{*;}
Run Code Online (Sandbox Code Playgroud)
然后它会在不同的地方失败,原因与NoClassDefFound相同
这是跑步者,应用程序和清单设置:
https://gist.github.com/originx/1890599b57b0ee3e14a85a4732301cd9
logcat的:
https://gist.github.com/originx/887f80d405334f1903b3024eb5cd1024
建立环境设置:
Android Studio 2.2.2 Build#AI-145.3360264,建于2016年10月18日JRE:1.8.0_112-release-b05 x86_64 JVM:JetJrains sro的OpenJDK 64位服务器VM
编译选项
compile 'com.android.support:multidex:1.0.1'
Run Code Online (Sandbox Code Playgroud)
构建工具信息:
classpath 'com.android.tools.build:gradle:2.2.2'
compileSdkVersion 25
buildToolsVersion '25'
defaultConfig {
applicationId "app.packagename.com"
minSdkVersion 16
targetSdkVersion 25
testInstrumentationRunner "de.payback.app.CustomAndroidJUnitRunner"
multiDexEnabled true
}
dexOptions {
jumboMode true
preDexLibraries false
javaMaxHeapSize "4g"
maxProcessCount = 8
}
debug {
applicationIdSuffix '.debug'
versionNameSuffix '-debug'
signingConfig signingConfigs.debug
minifyEnabled false
shrinkResources debugShrinkResourcesEnabled
proguardFiles getDefaultProguardFile('proguard-android.txt'), '../proguardRules/proguard-rules.pro', '../proguardRules/proguard-debug-rules.pro'
// multiDexKeepProguard file('../proguardRules/multidex-proguard.pro')
testProguardFiles getDefaultProguardFile('proguard-android.txt'), …Run Code Online (Sandbox Code Playgroud) 我的应用程序在 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) android ×10
android-multidex ×10
gradle ×3
ant ×1
dex ×1
eclipse ×1
flexjson ×1
json ×1
kotlin ×1
react-native ×1