項目依賴新的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.
解決思路
- 檢查項目是否 進行了分包處理
- 重複包處理
- 是否也使用了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’ )
結束
至此 問題解決,有任何不對的地方歡迎大家一起探讨。