天天看點

Too many classes in --main-dex-list, main dex capacity exceeded.項目配置

項目依賴新的SDK遇到的gradle版本問題

項目配置

我的項目中 使用的開發工具:Android Studio V2.3.3,項目中內建過AR功能 ,是以需要配置JNI環境,正是因為這個而導緻出現問題。

錯誤如下

UNEXPECTED TOP-LEVEL EXCEPTION:

com.android.dex.DexException: Too many classes in --main-dex-list, main dex capacity exceeded

at com.android.dx.command.dexer.Main.processAllFiles(Main.java:548)

at com.android.dx.command.dexer.Main.runMultiDex(Main.java:368)

at com.android.dx.command.dexer.Main.runDx(Main.java:289)

at com.android.dx.command.dexer.Main.main(Main.java:247)

at com.android.dx.command.Main.main(Main.java:94)

FAILED

FAILURE: Build failed with an exception.

  • What went wrong:

    Execution failed for task ‘:app:transformClassesWithDexForArmDebug’.

com.android.build.api.transform.TransformException: com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process ‘command ‘D:\jdk18\bin\java.exe’’ finished with non-zero exit value 2
  • Try:

    Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.

解決思路

  1. 檢查項目是否 進行了分包處理
  2. 重複包處理
  3. 是否也使用了JNI環境 classpath ‘com.android.tools.build:gradle-experimental:0.X.0’

如果 以上 1、2 都不是 那麼你就得查查是否和我一樣配置了JNI ,如果 是 往下看。

檢查 工程下 build.gradle

buildscript {

repositories {

jcenter()

}

dependencies {

classpath ‘com.android.tools.build:gradle-experimental:0.4.0’

// classpath ‘com.android.tools.build:gradle:2.3.0’

classpath ‘com.novoda:bintray-release:0.3.4’

classpath ‘com.github.dcendents:android-maven-gradle-plugin:1.3’

}

}

看到這裡 你會發現 這是 JNI配置 , 沒錯 網上一大堆的JNI配置 但是都是像上面一樣 0.4.0版本或者0.2.0版本的配置方法

繼續看0.4.0版本 application build.gradle 配置

apply plugin: ‘com.android.model.application’

model {

android {

compileSdkVersion = 23

buildToolsVersion = “23.0.2”

defaultConfig.with {
        applicationId = "com.zyp.ndktest"
        minSdkVersion.apiLevel  = 19  // Unable to load class com.android.build.gradle.managed.ProductFlavor_Impl
        targetSdkVersion.apiLevel = 23
        versionCode = 1
        versionName = "1.0"
    }

}
android.buildTypes {
    release {
        minifyEnabled = false
        proguardFiles += file('proguard-rules.pro')
    }
}


compileOptions.with {
    sourceCompatibility = JavaVersion.VERSION_1_7
    targetCompatibility = JavaVersion.VERSION_1_7
}
android.ndk {
    moduleName = "NdkSample"
    cppFlags += "-std=c++11"
    cppFlags += "-fexceptions"
    cppFlags += "-I${file("src/main/jni//include")}".toString()
    ldLibs += ["android", "log"]
    stl = "gnustl_shared"
}

android.productFlavors {
    create("arm7") {
        ndk.abiFilters.add("armeabi-v7a")
    }
    create("arm8") {
        ndk.abiFilters.add("arm64-v8a")
    }

}
           

}

dependencies {

compile fileTree(dir: ‘libs’, include: [’*.jar’])

compile ‘com.android.support:appcompat-v7:23.1.0’

}

以上的配置 JNI application gradle 的配置 熟悉對吧 (這裡推薦一篇文章 https://www.cnblogs.com/zhuyp1015/p/4976116.html JNI 0.4.0 配置 很詳細 感謝部落客)

提升 build:gradle-experimental 版本

當你項目中 使用的build:gradle-experimental:0.4.0版本時,想要提升到0.6.0/0.7.0/0.8.0/0.9.0 或其他有可能會遇到問題。

錯誤資訊如下:

Error:Gradle DSL method not found: ‘library()’

這個是什麼導緻的呢?

你得看看你的項目中有沒有這段配置

android.sources {

main {

jni {

dependencies {

library file(“src/main/jniLibs/armeabi-v7a/aaaa.so”) abi “armeabi-v7a”

}

}

}

}

如果有以上這種配置 往下看教你解決方法。

解決方法

原因:build:gradle-experimental:0.4.0 提升到0.6.0/0.7.0/0.8.0/0.9.0 版本 有一個配置需要調整。(你到網上一搜發現 大多都是0.4.0或者0.2.0的配置方法 ,dependencies library 這段配置 不好找)

處理方式(1個SO):

android.sources {

main {

jni {

dependencies {

library ‘aaaa’ linkage ‘shared’

}

}

}

}

repositories {

libs(PrebuiltLibraries) {

aaaa{

binaries.withType(SharedLibraryBinary) {

sharedLibraryFile = file(“src/main/jniLibs/armeabi-v7a/aaaa.so”)

}

}

}

}

注意: aaaa.so aaaa 這是對應的

處理方式(多個SO):

repositories {

libs(PrebuiltLibraries) {

aaaa{

binaries.withType(SharedLibraryBinary) {

sharedLibraryFile = file(“src/main/jniLibs/armeabi-v7a/aaaa.so”)

}

}

bbbb{

binaries.withType(SharedLibraryBinary) {

sharedLibraryFile = file(“src/main/jniLibs/armeabi-v7a/bbbb.so”)

}

}

}

}

android.sources {

main {

jni {

dependencies {

library ‘aaaa’ linkage ‘shared’

library ‘bbbb’ linkage ‘shared’

}

}

}

}

注意: 多個SO 這個不同 (library ‘bbbb’) 這個地方是相同的( linkage ‘shared’ )

結束

至此 問題解決,有任何不對的地方歡迎大家一起探讨。