项目依赖新的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’ )
结束
至此 问题解决,有任何不对的地方欢迎大家一起探讨。