使用 targetSdkVersion 25 和 minSdkVersion 19 构建 Android 应用
Building an Android app with targetSdkVersion of 25 and minSdkVersion 19
我有一个 Android 应用程序,其 targetSdkVersion
为 25
。它 运行 在 API 21+ 上很好用,但是,我正在尝试在 [=53 上将它修复为 运行 =] 19+(奇巧)。我的应用确实使用了 Material 设计,我知道它是在 API 21 中引入的,但是我已经看到 here 应该有一些方法可以返回移植它。
但是,当我构建 运行 时,出现错误:
Error:Execution failed for task ':app:transformClassesWithJarMergingForDebug'.
> com.android.build.api.transform.TransformException: java.util.zip.ZipException: duplicate entry: javax/activation/MimeTypeParseException.class
当我 运行 在 KitKat 模拟器上时。
有没有人在尝试回溯测试他们的应用程序时遇到过这个错误?
我的 gradle 文件有:
compile 'com.android.support:appcompat-v7:25.0.0'
compile 'com.android.support:design:25.0.0'
compile 'com.android.support:multidex:1.0.1'
compile 'com.android.support:percent:25.0.0'
compile 'com.android.support:palette-v7:25.0.0'
compile 'org.jetbrains:annotations-java5:15.0'
compile 'com.android.support:support-v4:25.0.0'
compile 'com.android.support:support-v13:25.0.0'
我可以提供哪些额外信息来帮助调试此问题?
更新
完整 gradle 代码:
buildscript {
repositories {
maven { url 'https://maven.fabric.io/public' }
}
dependencies {
classpath 'io.fabric.tools:gradle:1.+'
}
}
apply plugin: 'com.android.application'
apply plugin: 'idea'
apply plugin: 'com.neenbedankt.android-apt'
apply plugin: 'me.tatarka.retrolambda'
apply plugin: 'io.fabric'
android {
packagingOptions {
exclude 'META-INF/DEPENDENCIES'
exclude 'META-INF/NOTICE'
exclude 'META-INF/LICENSE'
exclude 'META-INF/LICENSE.txt'
exclude 'META-INF/NOTICE.txt'
exclude 'META-INF/mimetypes.default'
}
compileSdkVersion 25
buildToolsVersion '25.0.0'
defaultConfig {
applicationId "com.ohmd.ohmd"
minSdkVersion 19
targetSdkVersion 25
versionCode 10
versionName "2.2"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
multiDexEnabled true
vectorDrawables.useSupportLibrary = true
renderscriptTargetApi 25
renderscriptSupportModeEnabled true
}
dataBinding {
enabled = true
}
lintOptions {
abortOnError false
}
dexOptions {
javaMaxHeapSize "4g"
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
buildTypes {
release {
minifyEnabled false
debuggable true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
debug {
minifyEnabled false
debuggable true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
productFlavors {
}
compileSdkVersion 25
}
idea {
module {
downloadJavadoc = true
downloadSources = true
}
}
repositories {
jcenter()
maven { url 'http://repo1.maven.org/maven2' }
maven { url "https://maven.java.net/content/groups/public/" }
maven { url "https://jitpack.io" }
maven { url 'https://maven.fabric.io/public' }
}
configurations.all {
resolutionStrategy {
force 'junit:junit:4.12'
}
}
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
compile 'net.sf.flexjson:flexjson:2.1'
compile('org.apache.abdera:abdera-i18n:1.1.1') {
exclude module: 'support-v4'
}
compile('org.eclipse.paho:org.eclipse.paho.android.service:1.1.0') {
exclude module: 'support-v4'
transitive=true
}
compile('org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.1.0') {
exclude module: 'support-v4'
}
compile 'com.android.support:appcompat-v7:25.0.0'
compile 'com.android.support:design:25.0.0'
compile 'com.android.support:multidex:1.0.1'
compile 'com.android.support:percent:25.0.0'
compile 'com.android.support:palette-v7:25.0.0'
compile 'com.mcxiaoke.volley:library:1.0.19'
compile 'com.android.support:support-annotations:25.0.0'
compile 'com.android.support:support-v4:25.0.0'
compile 'com.sun.mail:android-mail:1.5.6'
compile 'com.sun.mail:android-activation:1.5.6'
compile 'com.afollestad.material-dialogs:core:0.9.0.2'
compile 'com.afollestad.material-dialogs:commons:0.9.0.2'
compile 'com.code-troopers.betterpickers:library:3.0.1'
compile 'commons-codec:commons-codec:1.10'
compile 'com.joanzapata.iconify:android-iconify-fontawesome:2.2.2'
compile 'com.joanzapata.iconify:android-iconify-material:2.2.2'
compile 'com.joanzapata.iconify:android-iconify-material-community:2.2.2'
compile 'com.google.code.gson:gson:2.2.4'
compile 'org.apache.commons:commons-lang3:3.4'
compile 'com.github.satyan:sugar:1.5'
compile 'org.apache.httpcomponents:httpcore:4.4.1'
compile 'com.fasterxml.jackson.core:jackson-core:2.7.3'
compile 'com.fasterxml.jackson.core:jackson-annotations:2.7.3'
compile 'com.fasterxml.jackson.core:jackson-databind:2.7.3'
compile 'com.github.boxme:asyncmanager:1.0.0'
compile 'com.miguelcatalan:materialsearchview:1.4.0'
compile 'com.squareup.picasso:picasso:2.5.2'
compile 'de.hdodenhof:circleimageview:2.1.0'
compile 'com.makeramen:roundedimageview:2.2.1'
compile 'joda-time:joda-time:2.9.5'
compile 'com.android.support:recyclerview-v7:25.0.0'
compile 'com.github.stfalcon:frescoimageviewer:0.3.1'
compile 'joda-time:joda-time:2.9.6'
compile 'com.liuzhuang.opensource:rcimageview:0.0.2'
compile 'com.uncopt:android.justified:1.0'
compile 'com.github.bumptech.glide:glide:3.7.0'
compile 'com.google.auto.value:auto-value:1.2'
compile 'com.karumi:dexter:2.3.0'
compile 'io.reactivex:rxandroid:1.2.1'
compile 'io.reactivex:rxjava:1.1.6'
compile 'com.google.auto.value:auto-value:1.2'
compile 'com.googlecode.libphonenumber:libphonenumber:7.2.2'
compile 'com.github.siyamed:android-shape-imageview:0.9.+@aar'
compile 'com.github.nekocode:Badge:1.6.2'
compile 'com.sjl:Foredroid:1.0.0'
compile 'com.kaopiz:kprogresshud:1.0.5'
compile 'com.wang.avi:library:2.1.3'
compile 'kr.pe.burt.android.lib:androidoperationqueue:0.0.2'
apt "com.google.auto.value:auto-value:1.2"
compile 'com.ryanharter.auto.value:auto-value-parcel:0.2.4-rc2'
apt 'com.ryanharter.auto.value:auto-value-parcel:0.2.4-rc2'
compile 'jp.wasabeef:recyclerview-animators:2.2.5'
compile 'me.leolin:ShortcutBadger:1.1.10@aar'
compile 'com.cocosw:bottomsheet:1.+@aar'
compile 'com.github.tajchert:nammu:1.1.1'
compile('com.frosquivel:magicalcamera:5.0.2@aar') {
transitive = false;
}
// Circular progress bar
compile 'com.github.castorflex.smoothprogressbar:library-circular:1.2.0'
// Google Play services (old versions, but they work)
compile 'com.google.android.gms:play-services:6.5.87'
// Secure shared preferences
compile 'online.devliving:securedpreferencestore:0.2.4'
// Included libraries
compile project(':animation-core')
compile project(':animation-abslistview')
compile project(':animation-circular-progress-button')
// Fabic
compile('com.crashlytics.sdk.android:crashlytics:2.6.5@aar') {
transitive = true;
}
compile('com.crashlytics.sdk.android:answers:1.3.10@aar') {
transitive = true;
}
// Segment
compile 'com.segment.analytics.android:analytics:4.+'
// Test components
testCompile 'junit:junit:4.12'
androidTestCompile 'com.android.support.test:runner:0.5'
androidTestCompile 'com.android.support.test:rules:0.5'
androidTestCompile 'com.android.support:support-annotations:25.0.0'
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
androidTestCompile('com.android.support.test.espresso:espresso-intents:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
androidTestCompile('com.android.support.test.espresso:espresso-web:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
}
更新 2
我已经能够通过从 Android Studio 2.2.2 启动一个新的 Android 分支应用程序并使用上面的 gradle 文件来重复这个确切的错误。所以它似乎与我应用程序中的实际代码无关(这并不奇怪)。
您不能添加两个支持库,因为它们相互重叠。
只用一个:support-v4.
您需要尝试使用 Support Annotations Library 而不是 jetbrains 注释。所以改变
compile 'org.jetbrains:annotations-java5:15.0'
到
compile 'com.android.support:support-annotations:25.0.0'
然后使用,
对于 @Nullable
注释:
import android.support.annotation.Nullable;
对于@NonNull
:
import android.support.annotation.NonNull;
加法:
不要忘记更改 buildToolsVersion
、targetSdkVersion
、compileSdkVersion
和 Support Library
以使用相同的 API 级别。
更新
您需要删除 apt
插件并使用 annotationProcessor
作为 documentation of android-apt 所说:
From apt to annotationProcessor
As of the Android Gradle plugin
version 2.2, all functionality that was previously provided by
android-apt is now available in the Android plugin. This means that
android-apt is officially obsolete ;) Here are the steps to migrate:
- Make sure you are on the Android Gradle 2.2 plugin or newer.
- Remove the android-apt plugin from your build scripts
Change all apt, androidTestApt and testApt dependencies to their new format:
dependencies {
compile 'com.google.dagger:dagger:2.0'
annotationProcessor 'com.google.dagger:dagger-compiler:2.0'
}
同时从您的 build.gradle 中删除 apt 插件,即:
apply plugin: 'com.neenbedankt.android-apt'
删除 joda-time 的重复条目,仅使用其中一个:
compile 'joda-time:joda-time:2.9.5'
compile 'joda-time:joda-time:2.9.6'
建议:
您需要删除一些具有类似目的的库:
compile 'de.hdodenhof:circleimageview:2.1.0'
compile 'com.makeramen:roundedimageview:2.2.1'
compile 'com.liuzhuang.opensource:rcimageview:0.0.2'
compile 'com.github.siyamed:android-shape-imageview:0.9.+@aar'
只选择一个真正适合您需要的。不要浪费您宝贵的时间来检查所有这些。
此外,您只需选择以下图片库中的一个:
compile 'com.squareup.picasso:picasso:2.5.2'
compile 'com.github.stfalcon:frescoimageviewer:0.3.1'
compile 'com.github.bumptech.glide:glide:3.7.0'
已解决。罪魁祸首是:
compile 'com.sun.mail:android-mail:1.5.6'
compile 'com.sun.mail:android-activation:1.5.6'
我不知道为什么,但是删除这两个包允许整个应用程序 运行 并部署到 < 21 版本的 Android。
昨天,我检查了我要求的 gradle 并删除了以下行 compile 'com.sun.mail:android-mail:1.5.6', compile 'com.sun.mail:android-activation:1.5.6'
并编译。它与任何 api 级别无关。发生这种情况是因为除了您删除的模块之外,还有另一个模块使用具有相同 class avax/activation/MimeTypeParseException.class
的相同包。您是否在申请中添加了以下内容 class?
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
MultiDex.install(this);
}
我有一个 Android 应用程序,其 targetSdkVersion
为 25
。它 运行 在 API 21+ 上很好用,但是,我正在尝试在 [=53 上将它修复为 运行 =] 19+(奇巧)。我的应用确实使用了 Material 设计,我知道它是在 API 21 中引入的,但是我已经看到 here 应该有一些方法可以返回移植它。
但是,当我构建 运行 时,出现错误:
Error:Execution failed for task ':app:transformClassesWithJarMergingForDebug'.
> com.android.build.api.transform.TransformException: java.util.zip.ZipException: duplicate entry: javax/activation/MimeTypeParseException.class
当我 运行 在 KitKat 模拟器上时。
有没有人在尝试回溯测试他们的应用程序时遇到过这个错误?
我的 gradle 文件有:
compile 'com.android.support:appcompat-v7:25.0.0'
compile 'com.android.support:design:25.0.0'
compile 'com.android.support:multidex:1.0.1'
compile 'com.android.support:percent:25.0.0'
compile 'com.android.support:palette-v7:25.0.0'
compile 'org.jetbrains:annotations-java5:15.0'
compile 'com.android.support:support-v4:25.0.0'
compile 'com.android.support:support-v13:25.0.0'
我可以提供哪些额外信息来帮助调试此问题?
更新 完整 gradle 代码:
buildscript {
repositories {
maven { url 'https://maven.fabric.io/public' }
}
dependencies {
classpath 'io.fabric.tools:gradle:1.+'
}
}
apply plugin: 'com.android.application'
apply plugin: 'idea'
apply plugin: 'com.neenbedankt.android-apt'
apply plugin: 'me.tatarka.retrolambda'
apply plugin: 'io.fabric'
android {
packagingOptions {
exclude 'META-INF/DEPENDENCIES'
exclude 'META-INF/NOTICE'
exclude 'META-INF/LICENSE'
exclude 'META-INF/LICENSE.txt'
exclude 'META-INF/NOTICE.txt'
exclude 'META-INF/mimetypes.default'
}
compileSdkVersion 25
buildToolsVersion '25.0.0'
defaultConfig {
applicationId "com.ohmd.ohmd"
minSdkVersion 19
targetSdkVersion 25
versionCode 10
versionName "2.2"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
multiDexEnabled true
vectorDrawables.useSupportLibrary = true
renderscriptTargetApi 25
renderscriptSupportModeEnabled true
}
dataBinding {
enabled = true
}
lintOptions {
abortOnError false
}
dexOptions {
javaMaxHeapSize "4g"
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
buildTypes {
release {
minifyEnabled false
debuggable true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
debug {
minifyEnabled false
debuggable true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
productFlavors {
}
compileSdkVersion 25
}
idea {
module {
downloadJavadoc = true
downloadSources = true
}
}
repositories {
jcenter()
maven { url 'http://repo1.maven.org/maven2' }
maven { url "https://maven.java.net/content/groups/public/" }
maven { url "https://jitpack.io" }
maven { url 'https://maven.fabric.io/public' }
}
configurations.all {
resolutionStrategy {
force 'junit:junit:4.12'
}
}
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
compile 'net.sf.flexjson:flexjson:2.1'
compile('org.apache.abdera:abdera-i18n:1.1.1') {
exclude module: 'support-v4'
}
compile('org.eclipse.paho:org.eclipse.paho.android.service:1.1.0') {
exclude module: 'support-v4'
transitive=true
}
compile('org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.1.0') {
exclude module: 'support-v4'
}
compile 'com.android.support:appcompat-v7:25.0.0'
compile 'com.android.support:design:25.0.0'
compile 'com.android.support:multidex:1.0.1'
compile 'com.android.support:percent:25.0.0'
compile 'com.android.support:palette-v7:25.0.0'
compile 'com.mcxiaoke.volley:library:1.0.19'
compile 'com.android.support:support-annotations:25.0.0'
compile 'com.android.support:support-v4:25.0.0'
compile 'com.sun.mail:android-mail:1.5.6'
compile 'com.sun.mail:android-activation:1.5.6'
compile 'com.afollestad.material-dialogs:core:0.9.0.2'
compile 'com.afollestad.material-dialogs:commons:0.9.0.2'
compile 'com.code-troopers.betterpickers:library:3.0.1'
compile 'commons-codec:commons-codec:1.10'
compile 'com.joanzapata.iconify:android-iconify-fontawesome:2.2.2'
compile 'com.joanzapata.iconify:android-iconify-material:2.2.2'
compile 'com.joanzapata.iconify:android-iconify-material-community:2.2.2'
compile 'com.google.code.gson:gson:2.2.4'
compile 'org.apache.commons:commons-lang3:3.4'
compile 'com.github.satyan:sugar:1.5'
compile 'org.apache.httpcomponents:httpcore:4.4.1'
compile 'com.fasterxml.jackson.core:jackson-core:2.7.3'
compile 'com.fasterxml.jackson.core:jackson-annotations:2.7.3'
compile 'com.fasterxml.jackson.core:jackson-databind:2.7.3'
compile 'com.github.boxme:asyncmanager:1.0.0'
compile 'com.miguelcatalan:materialsearchview:1.4.0'
compile 'com.squareup.picasso:picasso:2.5.2'
compile 'de.hdodenhof:circleimageview:2.1.0'
compile 'com.makeramen:roundedimageview:2.2.1'
compile 'joda-time:joda-time:2.9.5'
compile 'com.android.support:recyclerview-v7:25.0.0'
compile 'com.github.stfalcon:frescoimageviewer:0.3.1'
compile 'joda-time:joda-time:2.9.6'
compile 'com.liuzhuang.opensource:rcimageview:0.0.2'
compile 'com.uncopt:android.justified:1.0'
compile 'com.github.bumptech.glide:glide:3.7.0'
compile 'com.google.auto.value:auto-value:1.2'
compile 'com.karumi:dexter:2.3.0'
compile 'io.reactivex:rxandroid:1.2.1'
compile 'io.reactivex:rxjava:1.1.6'
compile 'com.google.auto.value:auto-value:1.2'
compile 'com.googlecode.libphonenumber:libphonenumber:7.2.2'
compile 'com.github.siyamed:android-shape-imageview:0.9.+@aar'
compile 'com.github.nekocode:Badge:1.6.2'
compile 'com.sjl:Foredroid:1.0.0'
compile 'com.kaopiz:kprogresshud:1.0.5'
compile 'com.wang.avi:library:2.1.3'
compile 'kr.pe.burt.android.lib:androidoperationqueue:0.0.2'
apt "com.google.auto.value:auto-value:1.2"
compile 'com.ryanharter.auto.value:auto-value-parcel:0.2.4-rc2'
apt 'com.ryanharter.auto.value:auto-value-parcel:0.2.4-rc2'
compile 'jp.wasabeef:recyclerview-animators:2.2.5'
compile 'me.leolin:ShortcutBadger:1.1.10@aar'
compile 'com.cocosw:bottomsheet:1.+@aar'
compile 'com.github.tajchert:nammu:1.1.1'
compile('com.frosquivel:magicalcamera:5.0.2@aar') {
transitive = false;
}
// Circular progress bar
compile 'com.github.castorflex.smoothprogressbar:library-circular:1.2.0'
// Google Play services (old versions, but they work)
compile 'com.google.android.gms:play-services:6.5.87'
// Secure shared preferences
compile 'online.devliving:securedpreferencestore:0.2.4'
// Included libraries
compile project(':animation-core')
compile project(':animation-abslistview')
compile project(':animation-circular-progress-button')
// Fabic
compile('com.crashlytics.sdk.android:crashlytics:2.6.5@aar') {
transitive = true;
}
compile('com.crashlytics.sdk.android:answers:1.3.10@aar') {
transitive = true;
}
// Segment
compile 'com.segment.analytics.android:analytics:4.+'
// Test components
testCompile 'junit:junit:4.12'
androidTestCompile 'com.android.support.test:runner:0.5'
androidTestCompile 'com.android.support.test:rules:0.5'
androidTestCompile 'com.android.support:support-annotations:25.0.0'
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
androidTestCompile('com.android.support.test.espresso:espresso-intents:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
androidTestCompile('com.android.support.test.espresso:espresso-web:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
}
更新 2
我已经能够通过从 Android Studio 2.2.2 启动一个新的 Android 分支应用程序并使用上面的 gradle 文件来重复这个确切的错误。所以它似乎与我应用程序中的实际代码无关(这并不奇怪)。
您不能添加两个支持库,因为它们相互重叠。 只用一个:support-v4.
您需要尝试使用 Support Annotations Library 而不是 jetbrains 注释。所以改变
compile 'org.jetbrains:annotations-java5:15.0'
到
compile 'com.android.support:support-annotations:25.0.0'
然后使用,
对于 @Nullable
注释:
import android.support.annotation.Nullable;
对于@NonNull
:
import android.support.annotation.NonNull;
加法:
不要忘记更改 buildToolsVersion
、targetSdkVersion
、compileSdkVersion
和 Support Library
以使用相同的 API 级别。
更新
您需要删除 apt
插件并使用 annotationProcessor
作为 documentation of android-apt 所说:
From apt to annotationProcessor
As of the Android Gradle plugin version 2.2, all functionality that was previously provided by android-apt is now available in the Android plugin. This means that android-apt is officially obsolete ;) Here are the steps to migrate:
- Make sure you are on the Android Gradle 2.2 plugin or newer.
- Remove the android-apt plugin from your build scripts
Change all apt, androidTestApt and testApt dependencies to their new format:
dependencies { compile 'com.google.dagger:dagger:2.0' annotationProcessor 'com.google.dagger:dagger-compiler:2.0' }
同时从您的 build.gradle 中删除 apt 插件,即:
apply plugin: 'com.neenbedankt.android-apt'
删除 joda-time 的重复条目,仅使用其中一个:
compile 'joda-time:joda-time:2.9.5'
compile 'joda-time:joda-time:2.9.6'
建议:
您需要删除一些具有类似目的的库:
compile 'de.hdodenhof:circleimageview:2.1.0'
compile 'com.makeramen:roundedimageview:2.2.1'
compile 'com.liuzhuang.opensource:rcimageview:0.0.2'
compile 'com.github.siyamed:android-shape-imageview:0.9.+@aar'
只选择一个真正适合您需要的。不要浪费您宝贵的时间来检查所有这些。
此外,您只需选择以下图片库中的一个:
compile 'com.squareup.picasso:picasso:2.5.2'
compile 'com.github.stfalcon:frescoimageviewer:0.3.1'
compile 'com.github.bumptech.glide:glide:3.7.0'
已解决。罪魁祸首是:
compile 'com.sun.mail:android-mail:1.5.6'
compile 'com.sun.mail:android-activation:1.5.6'
我不知道为什么,但是删除这两个包允许整个应用程序 运行 并部署到 < 21 版本的 Android。
昨天,我检查了我要求的 gradle 并删除了以下行 compile 'com.sun.mail:android-mail:1.5.6', compile 'com.sun.mail:android-activation:1.5.6'
并编译。它与任何 api 级别无关。发生这种情况是因为除了您删除的模块之外,还有另一个模块使用具有相同 class avax/activation/MimeTypeParseException.class
的相同包。您是否在申请中添加了以下内容 class?
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
MultiDex.install(this);
}