我正在使用SugarORM Library构建一个应用程序但是当我尝试为API 17构建项目时(没有检查其他人)它显示了构建错误。
Information:Gradle tasks [:app:assembleDebug]
:app:preBuild UP-TO-DATE
:app:preDebugBuild UP-TO-DATE
:app:checkDebugManifest
:app:preReleaseBuild UP-TO-DATE
:app:prepareComAndroidSupportAnimatedVectorDrawable2330Library UP-TO-DATE
:app:prepareComAndroidSupportAppcompatV72330Library UP-TO-DATE
:app:prepareComAndroidSupportCardviewV72330Library UP-TO-DATE
:app:prepareComAndroidSupportDesign2330Library UP-TO-DATE
:app:prepareComAndroidSupportMediarouterV72300Library UP-TO-DATE
:app:prepareComAndroidSupportRecyclerviewV72330Library UP-TO-DATE
:app:prepareComAndroidSupportSupportV42330Library UP-TO-DATE
:app:prepareComAndroidSupportSupportVectorDrawable2330Library UP-TO-DATE
:app:prepareComAndroidVolleyVolley100Library UP-TO-DATE
:app:prepareComGithubSatyanSugar14Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServices840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesAds840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesAnalytics840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesAppindexing840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesAppinvite840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesAppstate840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesAuth840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesBase840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesBasement840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesCast840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesDrive840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesFitness840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesGames840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesGcm840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesIdentity840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesLocation840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesMaps840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesMeasurement840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesNearby840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesPanorama840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesPlus840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesSafetynet840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesVision840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesWallet840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesWearable840Library UP-TO-DATE
:app:prepareMeDrakeetMaterialdialogLibrary131Library UP-TO-DATE
:app:prepareDebugDependencies
:app:compileDebugAidl UP-TO-DATE
:app:compileDebugRenderscript UP-TO-DATE
:app:generateDebugBuildConfig UP-TO-DATE
:app:generateDebugAssets UP-TO-DATE
:app:mergeDebugAssets UP-TO-DATE
:app:generateDebugResValues UP-TO-DATE
:app:generateDebugResources UP-TO-DATE
:app:mergeDebugResources UP-TO-DATE
:app:processDebugManifest UP-TO-DATE
:app:processDebugResources UP-TO-DATE
:app:generateDebugSources UP-TO-DATE
:app:compileDebugJavaWithJavac
Note: Some input files use or override a deprecated API.
Note: Recompile with -Xlint:deprecation for details.
:app:compileDebugNdk UP-TO-DATE
:app:compileDebugSources
:app:prePackageMarkerForDebug
:app:transformClassesWithDexForDebug
Error:The number of method references in a .dex file cannot exceed 64K.
Learn how to resolve this issue at https://developer.android.com/tools/building/multidex.html
Error:Execution failed for task ':app:transformClassesWithDexForDebug'.
> com.android.build.api.transform.TransformException: com.android.ide.common.process.ProcessException: java.util.concurrent.ExecutionException: com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process 'command '/Library/Java/JavaVirtualMachines/jdk1.8.0_51.jdk/Contents/Home/bin/java'' finished with non-zero exit value 2
Information:BUILD FAILED
Information:Total time: 21.663 secs
Information:2 errors
Information:0 warnings
Information:See complete output in console
但是当我为android v5.0或更高版本构建这个项目时,它运行正常。如果我删除SugarORM gradle依赖项,它对于设备v4.2.2和v5.0都可以正常工作。
答案 0 :(得分:221)
你有太多的方法。 dex 只能有 65536种方法。
根据建议您可以使用multidex support。
只需在build.gradle
:
android {
defaultConfig {
...
// Enabling multidex support.
multiDexEnabled true
}
...
}
dependencies {
compile 'com.android.support:multidex:1.0.0'
}
同样在您的Manifest
中,将多索引支持库中的MultiDexApplication
类添加到应用程序元素
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.android.multidex.myapplication">
<application
...
android:name="android.support.multidex.MultiDexApplication">
<!--If you are using your own custom Application class then extend -->
<!--MultiDexApplication and change above line as-->
android:name=".YourCustomApplicationClass">
...
</application>
</manifest>
覆盖attachBaseContext方法
@Override
protected void attachBaseContext(Context newBase) {
super.attachBaseContext(newBase);
MultiDex.install(this);
}
如果您使用自己的Application
课程,请将父课程从Application
更改为MultiDexApplication
。
另一种解决方案是尝试使用 ProGuard 删除未使用的代码 - 为应用配置ProGuard设置以运行ProGuard,并确保为发布版本启用了缩减功能。
答案 1 :(得分:72)
在android / app / build.gradle中
android {
compileSdkVersion 23
buildToolsVersion '23.0.0'
defaultConfig {
applicationId "com.dkm.example"
minSdkVersion 15
targetSdkVersion 23
versionCode 1
versionName "1.0"
multiDexEnabled true
}
multiDexEnabled true
它对我有用
答案 2 :(得分:18)
我收到此错误消息是因为在我的build.gradle
文件中对项目进行编码时自动更新编译版本:
android {
...
buildToolsVersion "23.0.2"
...
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.4.0'
compile 'com.android.support:design:23.4.0' }
通过更正版本来解决它:
android {
...
buildToolsVersion "23.0.2"
...
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.0.1'
compile 'com.android.support:design:23.0.1'
}
答案 3 :(得分:12)
这对我有用:
这是因为有太多未使用的方法。 大多数这些方法来自build.gradle中包含的库
使用minify和shrink资源来解决这个问题,同时使用gradle并同时清理代码。
buildTypes {
release {
minifyEnabled true
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
debug {
minifyEnabled true
shrinkResources true
}
}
答案 4 :(得分:11)
当您仅使用afew加载所有Google Play服务时,也会发生此错误。
正如谷歌所述:&#34;在6.5之前的Google Play服务版本中,您必须将整个API包编译到您的应用中。在某些情况下,这样做会使您的应用程序中的方法数量(包括框架API,库方法和您自己的代码)更难以保持65,536的限制。
从版本6.5开始,您可以选择性地将Google Play服务API编译到您的应用中。&#34;
例如,当您的应用需要播放服务地图,播放服务位置时。您只需在应用级别的build.gradle文件中添加两个api,如下所示:
compile 'com.google.android.gms:play-services-maps:10.2.1'
compile 'com.google.android.gms:play-services-location:10.2.1'
而不是:
compile 'com.google.android.gms:play-services:10.2.1'
有关完整文档和Google Play服务列表,请点击here
答案 5 :(得分:6)
我一直面临同样的问题,对于multidex支持,你必须记住应用程序的 minSdkVersion 。如果您使用 minSdkVersion 21 或更高版本,那么只需写下 multiDexEnabled true 就像这样
defaultConfig {
applicationId *******************
minSdkVersion 21
targetSdkVersion 24
versionCode 1
versionName "1.0"
multiDexEnabled true
}
它对我有用,如果您使用 minSdkVersion 低于21( lolipop ),那么您必须做两件额外的简单事情
1。首先添加此依赖项
编译'com.android.support:multidex:1.0.1'
在build.gradle中。
2。上一行和第二行将以下一行添加到清单
中的应用程序中机器人:名称= “android.support.multidex.MultiDexApplication”
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:name="android.support.multidex.MultiDexApplication"
android:theme="@style/AppTheme" >
<activity android:name=".MainActivity" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
Bingo然后它也将在较低版本中工作.. :) 快乐的编码
答案 6 :(得分:1)
**
**
如果有人因为此错误出现在其Unity项目中而来到这里,请转到文件->构建设置->播放器设置->播放器。转到发布设置,然后在“构建”标签下,启用“自定义启动器Gradle模板”。路径将显示在该文本下方。转到路径,并添加multiDexEnabled true像这样:
defaultConfig {
minSdkVersion **MINSDKVERSION**
targetSdkVersion **TARGETSDKVERSION**
applicationId '**APPLICATIONID**'
ndk {
abiFilters **ABIFILTERS**
}
versionCode **VERSIONCODE**
versionName '**VERSIONNAME**'
multiDexEnabled true
}
答案 7 :(得分:1)
对于Flutter用户,可以通过使用应用级的build.gradle来解决
var array1 = ['a', 'b', 'c'];
var iterator1 = array1.entries();
let result = iterator1.next()
while (!result.done) {
let [k, v] = result.value
console.log(k, v)
result = iterator1.next()
}
对我有用。
答案 8 :(得分:1)
当您的应用引用超过 65,536 个方法时,您会遇到一个构建错误,表明您的应用已达到Android构建体系结构的限制
Android 5.0之前的Multidex支持
Android 5.0(API级别21)之前的平台版本使用Dalvik运行时执行应用程序代码。默认情况下,Dalvik将应用程序限制为每个APK仅包含一个classes.dex字节码文件。为了解决此限制,您可以将multidex支持库添加到您的项目中:
dependencies {
implementation 'com.android.support:multidex:1.0.3'
}
对Android 5.0及更高版本的Multidex支持
Android 5.0(API级别21)及更高版本使用称为ART的运行时,该运行时本机支持从APK文件加载多个DEX文件。因此,如果您的minSdkVersion为21或更高,则 不需要multidex 支持库。
避免64K限制
为应用配置
如果将minSdkVersion设置为21或更高,则只需在模块级build.gradle文件中将multiDexEnabled设置为true
android {
defaultConfig {
...
minSdkVersion 21
targetSdkVersion 28
multiDexEnabled true
}
...
}
如果您的minSdkVersion设置为20或更低,则必须使用multidex支持库
android {
defaultConfig {
...
minSdkVersion 15
targetSdkVersion 28
multiDexEnabled true
}
...
}
dependencies {
compile 'com.android.support:multidex:1.0.3'
}
重写Application类,将其更改为扩展 MultiDexApplication (如果可能),如下所示:
public class MyApplication extends MultiDexApplication { ... }
添加到清单文件
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.myapp">
<application
android:name="MyApplication" >
...
</application>
</manifest>
答案 9 :(得分:0)
我将 minSdkVersion 更改为 20,它对我有用。查看https://developer.android.com/studio/build/multidex#mdex-gradle了解更多详情
答案 10 :(得分:0)
添加此选项可避免React Native或任何android项目出现multidex问题
android {
defaultConfig {
...
// Enabling multidex support.
multiDexEnabled true
}
}
dependencies {
implementation 'com.android.support:multidex:1.0.3' //with support libraries
//implementation 'androidx.multidex:multidex:2.0.1' //with androidx libraries
答案 11 :(得分:0)
只是附带说明,在添加对multidex的支持之前-确保您没有添加不必要的依赖项。
例如In the official Facebook analytics guide
他们明确指出您应该添加以下依赖项:
implementation 'com.facebook.android:facebook-android-sdk:[4,5)'
实际上是整个 FacebookSDK-因此,例如,如果您仅需要Google Analytics(分析),则需要将其替换为:
implementation 'com.facebook.android:facebook-core:5.+'
答案 12 :(得分:0)
Android 5.0之前的Multidex支持
Android 5.0(API级别21)之前的平台版本使用 Dalvik 运行时来执行应用程序代码。默认情况下,Dalvik将应用程序限制为每个APK的单个classes.dex字节码文件。为了解决此限制,请阅读configure your app for multidex
针对Android 5.0及更高版本的Multidex支持
Android 5.0(API级别21)及更高版本使用名为ART的运行时,它本身支持从APK文件加载多个DEX文件。 ART在应用程序安装时执行预编译,扫描 classesN.dex 文件并将它们编译为单个.oat文件,以供Android设备执行。因此,如果 minSdkVersion 为21或更高,则不需要multidex支持库。您需要做的就是在模块级build.gradle中将 multiDexEnabled 设置为 true
在此处阅读更多内容 - https://developer.android.com/studio/build/multidex
答案 13 :(得分:0)
也可以试试这个:
android{
.
.
// to avoid DexIndexOverflowException
dexOptions {
jumboMode true
}
}
希望它有所帮助。感谢
答案 14 :(得分:0)
对我来说升级Gradle的作品。在Android Website寻找更新 然后将它添加到build.gradle(Project)中,就像这样
dependencies {
classpath 'com.android.tools.build:gradle:2.2.0-alpha4'
....
}
然后用gradle文件同步项目加上它有时可能会因为java.exe(在我的情况下)只是强制从Windows中的任务管理器杀死java.exe然后重新运行程序
答案 15 :(得分:-1)
您可以在Android Studio上启用“即时运行”以获得多索支持。
答案 16 :(得分:-3)
这样做,它有效:
defaultConfig {
applicationId "com.example.maps"
minSdkVersion 15
targetSdkVersion 24
versionCode 1
versionName "1.0"
multiDexEnabled true
}