Plugin Android Gradle 0.7.0: Các tệp trùng lặp trong khi đóng gói APK


324

Sử dụng plugin Android Gradle 0.7.0 với các mục sau build.gradle:

buildscript {
    repositories {
        mavenCentral()
    }

    dependencies {
        classpath 'com.android.tools.build:gradle:0.7.0'
    }
}

apply plugin: 'android'

repositories {
    maven { url "https://android-rome-feed-reader.googlecode.com/svn/maven2/releases" }
    maven { url "http://dl.bintray.com/populov/maven" }
    mavenCentral()
}

android {
    compileSdkVersion 19
    buildToolsVersion '18.1.1'

    defaultConfig {
        minSdkVersion 9
        targetSdkVersion 19
    }
    buildTypes {
        release {
            runProguard true
            proguardFile getDefaultProguardFile('proguard-android-optimize.txt')
        }
    }
    productFlavors {
        defaultFlavor {
            proguardFile 'proguard-rules.txt'
        }
    }
    sourceSets {
        instrumentTest.setRoot('src/instrumentTest')
    }
}

configurations {
    apt
}

ext.androidAnnotationsVersion = '2.7.1';

dependencies {
    compile 'com.android.support:support-v4:18.0.0'

    compile 'com.viewpagerindicator:library:2.4.1@aar'

    compile 'com.google.code.android-rome-feed-reader:android-rome-feed-reader:1.0.0-r2'
    compile 'org.jdom:jdom:1.1.1-android-fork'

    apt "com.googlecode.androidannotations:androidannotations:${androidAnnotationsVersion}"
    compile "com.googlecode.androidannotations:androidannotations-api:${androidAnnotationsVersion}"

    compile 'com.google.code.gson:gson:2.2.4'
    compile 'com.j256.ormlite:ormlite-android:4.47'
    compile 'com.j256.ormlite:ormlite-core:4.47'
    compile 'org.springframework.android:spring-android-core:1.0.1.RELEASE'
    compile 'org.springframework.android:spring-android-rest-template:1.0.1.RELEASE'
    compile 'com.prolificinteractive:actionbarsherlock:4.3.1@aar'

    compile 'com.google.code.geocoder-java:geocoder-java:0.15'

    compile files('libs/CWAC-Pager.jar')
}

android.applicationVariants.all { variant ->
    aptOutput = file("${project.buildDir}/source/apt_generated/${variant.dirName}")
    println "****************************"
    println "variant: ${variant.name}"
    println "manifest:  ${variant.processResources.manifestFile}"
    println "aptOutput:  ${aptOutput}"
    println "****************************"

    variant.javaCompile.doFirst {
        println "*** compile doFirst ${variant.name}"
        aptOutput.mkdirs()
        variant.javaCompile.options.compilerArgs += [
                '-processorpath', configurations.apt.getAsPath(),
                '-AandroidManifestFile=' + variant.processResources.manifestFile,
                '-s', aptOutput
        ]
    }
}

đưa ra lỗi Duplicate files copied in APK META-INF/LICENSE.txt:

WARNING: Dependency commons-logging:commons-logging:1.0.4 is ignored for defaultFlavorDebug as it may be conflicting with the internal version provided by Android.
         In case of problem, please repackage it with jarjar to change the class packages
WARNING: Dependency commons-logging:commons-logging:1.0.4 is ignored for defaultFlavorRelease as it may be conflicting with the internal version provided by Android.
         In case of problem, please repackage it with jarjar to change the class packages
Creating properties on demand (a.k.a. dynamic properties) has been deprecated and is scheduled to be removed in Gradle 2.0. Please read http://gradle.org/docs/current/dsl/org.gradle.api.plugins.ExtraPropertiesExtension.html for information on the replacement for dynamic properties.
Deprecated dynamic property: "aptOutput" on "com.android.build.gradle.internal.api.ApplicationVariantImpl_Decorated@5705013c", value: "/Users/david/Developer...".
****************************
variant: defaultFlavorDebug
manifest:  /Users/david/Developer/.../build/manifests/defaultFlavor/debug/AndroidManifest.xml
aptOutput:  /Users/david/Developer/.../build/source/apt_generated/defaultFlavor/debug
****************************
Deprecated dynamic property "aptOutput" created in multiple locations.
****************************
variant: defaultFlavorRelease
manifest:  /Users/david/Developer/.../build/manifests/defaultFlavor/release/AndroidManifest.xml
aptOutput:  /Users/david/Developer/.../build/source/apt_generated/defaultFlavor/release
****************************
:TravelGuard:compileDefaultFlavorDebugNdk UP-TO-DATE
:TravelGuard:preBuild UP-TO-DATE
:TravelGuard:preDefaultFlavorDebugBuild UP-TO-DATE
:TravelGuard:preDefaultFlavorReleaseBuild UP-TO-DATE
:TravelGuard:prepareComProlificinteractiveActionbarsherlock431Library UP-TO-DATE
:TravelGuard:prepareComViewpagerindicatorLibrary241Library UP-TO-DATE
:TravelGuard:prepareDefaultFlavorDebugDependencies
:TravelGuard:compileDefaultFlavorDebugAidl UP-TO-DATE
:TravelGuard:compileDefaultFlavorDebugRenderscript UP-TO-DATE
:TravelGuard:generateDefaultFlavorDebugBuildConfig UP-TO-DATE
:TravelGuard:mergeDefaultFlavorDebugAssets UP-TO-DATE
:TravelGuard:mergeDefaultFlavorDebugResources UP-TO-DATE
:TravelGuard:processDefaultFlavorDebugManifest UP-TO-DATE
:TravelGuard:processDefaultFlavorDebugResources UP-TO-DATE
:TravelGuard:generateDefaultFlavorDebugSources UP-TO-DATE
:TravelGuard:compileDefaultFlavorDebugJava
*** compile doFirst defaultFlavorDebug
/Users/david/Developer/.../src/main/java/com/travelguard/service/TravelGuardService.java:53: cannot find symbol
symbol  : class TravelGuardPrefs_
location: class com.travelguard.service.TravelGuardService
    TravelGuardPrefs_ travelGuardPrefs;
    ^
/Users/david/Developer/.../src/main/java/com/travelguard/ui/CategoriesActivity.java:14: cannot find symbol
symbol  : class AssistanceFragment_
location: package com.travelguard.ui.fragments
import com.travelguard.ui.fragments.AssistanceFragment_;
                                   ^
/Users/david/Developer/.../src/main/java/com/travelguard/ui/CategoriesActivity.java:16: cannot find symbol
symbol  : class CategoryFragment_
location: package com.travelguard.ui.fragments
import com.travelguard.ui.fragments.CategoryFragment_;
                                   ^
/Users/david/Developer/.../src/main/java/com/travelguard/ui/CategoriesActivity.java:17: cannot find symbol
symbol  : class ContactFragment_
location: package com.travelguard.ui.fragments
import com.travelguard.ui.fragments.ContactFragment_;
                                   ^
/Users/david/Developer/.../src/main/java/com/travelguard/ui/CountriesActivity.java:25: cannot find symbol
symbol  : class TravelGuardPrefs_
location: package com.travelguard.service
import com.travelguard.service.TravelGuardPrefs_;
                              ^
/Users/david/Developer/.../src/main/java/com/travelguard/ui/CountriesActivity.java:44: cannot find symbol
symbol  : class TravelGuardPrefs_
location: class com.travelguard.ui.CountriesActivity
    TravelGuardPrefs_ travelGuardPrefs;
    ^
/Users/david/Developer/.../src/main/java/com/travelguard/ui/InstructionsActivity.java:18: cannot find symbol
symbol  : class AssistanceFragment_
location: package com.travelguard.ui.fragments
import com.travelguard.ui.fragments.AssistanceFragment_;
                                   ^
/Users/david/Developer/.../src/main/java/com/travelguard/ui/InstructionsActivity.java:19: cannot find symbol
symbol  : class ContactFragment_
location: package com.travelguard.ui.fragments
import com.travelguard.ui.fragments.ContactFragment_;
                                   ^
/Users/david/Developer/.../src/main/java/com/travelguard/ui/InstructionsActivity.java:21: cannot find symbol
symbol  : class InstructionsFragment_
location: package com.travelguard.ui.fragments
import com.travelguard.ui.fragments.InstructionsFragment_;
                                   ^
/Users/david/Developer/.../src/main/java/com/travelguard/ui/MainActivity.java:36: cannot find symbol
symbol  : class TravelGuardPrefs_
location: package com.travelguard.service
import com.travelguard.service.TravelGuardPrefs_;
                              ^
/Users/david/Developer/.../src/main/java/com/travelguard/ui/MainActivity.java:40: cannot find symbol
symbol  : class AssistanceFragment_
location: package com.travelguard.ui.fragments
import com.travelguard.ui.fragments.AssistanceFragment_;
                                   ^
/Users/david/Developer/.../src/main/java/com/travelguard/ui/MainActivity.java:41: cannot find symbol
symbol  : class ContactFragment_
location: package com.travelguard.ui.fragments
import com.travelguard.ui.fragments.ContactFragment_;
                                   ^
/Users/david/Developer/.../src/main/java/com/travelguard/ui/MainActivity.java:55: cannot find symbol
symbol  : class TravelGuardPrefs_
location: class com.travelguard.ui.MainActivity
    TravelGuardPrefs_ travelGuardPrefs;
    ^
/Users/david/Developer/.../src/main/java/com/travelguard/ui/TermsActivity.java:17: cannot find symbol
symbol  : class TravelGuardPrefs_
location: package com.travelguard.service
import com.travelguard.service.TravelGuardPrefs_;
                              ^
/Users/david/Developer/.../src/main/java/com/travelguard/ui/TermsActivity.java:23: cannot find symbol
symbol  : class TravelGuardPrefs_
location: class com.travelguard.ui.TermsActivity
    TravelGuardPrefs_ travelGuardPrefs;
    ^
Note: Starting AndroidAnnotations annotation processing
Note: AndroidManifest.xml file found: /Users/david/Developer/.../build/manifests/defaultFlavor/debug/AndroidManifest.xml
Note: Number of files generated by AndroidAnnotations: 22
Note: Generating source file: com.travelguard.service.SmartTravellerService_
Note: Generating source file: com.travelguard.service.SmartTravellerWebservice_
Note: Generating source file: com.travelguard.service.TravelGuardPrefs_
Note: Generating source file: com.travelguard.service.TravelGuardService_
Note: Generating source file: com.travelguard.service.TravelGuardWebservice_
Note: Generating source file: com.travelguard.ui.AdviceActivity_
Note: Generating source file: com.travelguard.ui.CategoriesActivity_
Note: Generating source file: com.travelguard.ui.ContactDetailActivity_
Note: Generating source file: com.travelguard.ui.ContactListActivity_
Note: Generating source file: com.travelguard.ui.ContactTravelGuardActivity_
Note: Generating source file: com.travelguard.ui.CountriesActivity_
Note: Generating source file: com.travelguard.ui.InformationActivity_
Note: Generating source file: com.travelguard.ui.InstructionsActivity_
Note: Generating source file: com.travelguard.ui.MainActivity_
Note: Generating source file: com.travelguard.ui.TermsActivity_
Note: Generating source file: com.travelguard.ui.TravelGuardActivity_
Note: Generating source file: com.travelguard.ui.fragments.AdviceDetailFragment_
Note: Generating source file: com.travelguard.ui.fragments.AdviceFragment_
Note: Generating source file: com.travelguard.ui.fragments.AssistanceFragment_
Note: Generating source file: com.travelguard.ui.fragments.CategoryFragment_
Note: Generating source file: com.travelguard.ui.fragments.ContactFragment_
Note: Generating source file: com.travelguard.ui.fragments.InstructionsFragment_
Note: Time measurements: [Whole Processing = 913 ms], [Generate Sources = 358 ms], [Extract Manifest = 163 ms], [Process Annotations = 158 ms], [Extract Annotations = 120 ms], [Validate Annotations = 82 ms], [Find R Classes = 28 ms],
Note: Time measurements: [Whole Processing = 0 ms],
Note: Time measurements: [Whole Processing = 0 ms],
warning: The following options were not recognized by any processor: '[androidManifestFile]'
Note: /Users/david/Developer/.../src/main/java/com/travelguard/ui/ContactDetailActivity.java uses or overrides a deprecated API.
Note: Recompile with -Xlint:deprecation for details.
Note: /Users/david/Developer/.../src/main/java/com/travelguard/service/SmartTravellerService.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
:TravelGuard:preDexDefaultFlavorDebug UP-TO-DATE
:TravelGuard:dexDefaultFlavorDebug
:TravelGuard:processDefaultFlavorDebugJavaRes UP-TO-DATE
:TravelGuard:validateDebugSigning
:TravelGuard:packageDefaultFlavorDebug
Error: duplicate files during packaging of APK /Users/david/Developer/.../build/apk/TravelGuard-defaultFlavor-debug-unaligned.apk
    Path in archive: META-INF/LICENSE.txt
    Origin 1: /Users/david/.gradle/caches/modules-2/files-2.1/commons-httpclient/commons-httpclient/3.1/964cd74171f427720480efdec40a7c7f6e58426a/commons-httpclient-3.1.jar
    Origin 2: /Users/david/.gradle/caches/modules-2/files-2.1/commons-codec/commons-codec/1.2/397f4731a9f9b6eb1907e224911c77ea3aa27a8b/commons-codec-1.2.jar
:TravelGuard:packageDefaultFlavorDebug FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':TravelGuard:packageDefaultFlavorDebug'.
> Duplicate files copied in APK META-INF/LICENSE.txt
    File 1: /Users/david/.gradle/caches/modules-2/files-2.1/commons-httpclient/commons-httpclient/3.1/964cd74171f427720480efdec40a7c7f6e58426a/commons-httpclient-3.1.jar
    File 2: /Users/david/.gradle/caches/modules-2/files-2.1/commons-httpclient/commons-httpclient/3.1/964cd74171f427720480efdec40a7c7f6e58426a/commons-httpclient-3.1.jar


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

BUILD FAILED

Total time: 21.957 secs

Mọi thứ đã hoạt động tốt vào sáng nay trước khi tôi cập nhật Android Studio. Có ý kiến ​​gì không?

EDIT: Tôi đã có thể tạm thời sửa nó bằng cách chạy các lệnh như

zip -d spring-android-core-1.0.1.RELEASE.jar META-INF/notice.txt

cho đến khi tất cả các lỗi trùng lặp biến mất



2
Đây dường như là lỗi code.google.com/p/android/issues/detail?id=61573 . Tôi không biết tại sao nó chỉ bắt đầu gây rắc rối cho bạn trong phiên bản này.
Scott Barta

mắc kẹt với cùng một vấn đề. Quyết định ở lại trên Android Studio 0.3.7 và phân loại plugin 0.6.3 cho đến khi lỗi được khắc phục
mente

6
Bạn nên rõ ràng về các từ của bạn: Bạn không sử dụng gradle 0.7.0 - đó là plugin gradle android. Mà sử dụng gradle (với trình bao bọc) trong phiên bản 1.9.0. Các từ sai sẽ dẫn đến khó hiểu - bên cạnh bối cảnh nhất định.
onigunn

1
Xin lưu ý pickFirsttùy chọn có sẵn kể từ Lớp 0.9.1 .
JJD

Câu trả lời:


475

Kể từ phiên bản Android Studio 0.8,14

Bạn nên thêm:

 android {
     packagingOptions { 
         exclude 'META-INF/LICENSE.txt'
         exclude 'META-INF/NOTICE.txt'
         exclude '...'
     }
 }  

vào build.gradletập tin của bạn .

Lịch sử:

Theo nhận xét 14 về lỗi này: https://issuetracker.google.com/issues/36982149#comment14 đây là một lỗi trong v0.7.0 của plugin Android Gradle và sẽ sớm được khắc phục trong 0.7.1.

Dưới đây là các lưu ý từ lỗi đó về việc bổ sung cho 0.7.1:

0.7.1 là ra với sửa chữa cho điều này.

DSL để loại trừ các tệp là:

android {
    packagingOptions {
        exclude 'META-INF/LICENSE.txt'
    }
}

Bạn có thể thêm bao nhiêu câu lệnh loại trừ như bạn muốn. Giá trị là đường dẫn lưu trữ. Không có ký tự đại diện hoặc hỗ trợ toàn cầu nào.

Tên tệp "LICENSE.txt" và "NOTICE.txt" phân biệt chữ hoa chữ thường. Vui lòng thử với "License.txt" và "notify.txt".


12
Cảm ơn! Tôi cũng đã phải loại trừ 'META-INF / NOTICE.txt';)
Climbatize 21/12/13

71
Ngày ngày tôi ngạc nhiên về cách các lập trình viên có thể làm việc từ xa trước khi stackoverflow đến. Cảm ơn đã sửa chữa! Thay vào đó, tôi phải loại trừ META-INF / GIẤY PHÉP và / THÔNG BÁO. (Không txt, ngay cả trên gradle mới nhất.)
domenukk

3
Tập tin nào tôi nên chỉnh sửa và nơi có thể tìm thấy nó? cảm ơn, mắt
mắt

2
@ um.anusorn Sean đã cho bạn một ví dụ điển hình cho tệp phân loại loại trừ các tệp này khỏi các thư viện trong quá trình đóng gói. Đây là những gì tôi có trong kho của tôi: bao bìOptions {loại trừ 'META-INF / LICENSE' loại trừ 'META-INF / THÔNG BÁO' loại trừ 'META-INF / DEPENDENCIES' loại trừ 'META-INF / License.txt' loại trừ 'META-INF /
Depenices.txt

4
Vẫn còn lỗi phổ biến trong v0.12 của các công cụ được xây dựng .. Chỉ cần nói
Nilzor

149

Trong trường hợp của tôi, tôi đã phải bao gồm một số loại trừ bổ sung. Có vẻ như nó không giống như các biểu thức thông thường sẽ làm cho nó trở thành một lớp lót đẹp.

android {
    packagingOptions {
        exclude 'META-INF/DEPENDENCIES.txt'
        exclude 'META-INF/DEPENDENCIES'
        exclude 'META-INF/dependencies.txt'
        exclude 'META-INF/LICENSE.txt'
        exclude 'META-INF/LICENSE'
        exclude 'META-INF/license.txt'
        exclude 'META-INF/LGPL2.1'
        exclude 'META-INF/NOTICE.txt'
        exclude 'META-INF/NOTICE'
        exclude 'META-INF/notice.txt'
    }
}

Tôi chỉ cần LICENSENOTICEsau khi tôi thêm commons-lang3.
theblang

Cái này giúp tôi (tôi có mẫu AndroidAnnotations + Spring REST). Với việc phải thêm các bản hack như vậy, sản phẩm IntelliJ này bắt đầu giống với Eclipse ...
javaxian

Không biết cái nào ảnh hưởng, nhưng điều này thực sự hữu ích.
CopperCash

Không hoạt động với tôi, vẫn hiển thị Cảnh báo: Dependency org.apache.httpcomponents: httpclient: 4.3 bị bỏ qua để gỡ lỗi vì có thể xung đột với phiên bản nội bộ do Android cung cấp. Trong trường hợp có vấn đề, vui lòng đóng gói lại bằng jarjar để thay đổi các gói lớp
VVB

46
packagingOptions {
        exclude 'META-INF/DEPENDENCIES.txt'
        exclude 'META-INF/LICENSE.txt'
        exclude 'META-INF/NOTICE.txt'
}

4
Tôi cần .txthậu tố.
theblang

1
Một cái gì đó khác tôi đang làm chỉ đưa tôi trở lại đây, và tôi không cần .txthậu tố. Vì vậy, tôi đoán YMMV (hoặc MMMV tùy thuộc vào thời gian trong năm).
theblang

31

Hãy xem nhận xét của Sakiboy !


Câu trả lời lỗi thời

Từ Lớp 0.9.1, những điều sau đây được hỗ trợ:

android.packagingOptions {
    pickFirst 'META-INF/LICENSE.txt'
}

Thêm thông tin trong ghi chú phát hành Gradle .


3
Đây là một giải pháp tốt hơn vì các nhà phát triển có nghĩa vụ bao gồm các tệp này khi họ sử dụng phần mềm nguồn mở.
Louth

1
Lựa chọn tốt, nhưng nhận xét này là hoàn toàn sai. Chỉ có giấy phép từ thư viện linh sam sẽ được bao gồm tất cả phần còn lại sẽ bị bỏ lại.
Igor ordaš

1
điều này hữu ích nếu 2 thư viện đang sử dụng cùng một tệp .so
Fabian

Tôi có thể sử dụng điều đó cho hai JAR có chứa cùng một tệp. Class không? Tôi có hai JAR đi kèm, cả hai đều chứa org / xmlpull / v1 / XmlPullParser
Class

2
@PSIXO, bạn có thể xem câu trả lời bên dưới nếu bạn muốn bao gồm TẤT CẢ các giấy phép: stackoverflow.com/a/47828425/2371425
Sakiboy

12

Vấn đề tương tự khi tôi xuất thư viện omeclient-4.3.5 trong Android Studio 0.8.6 tôi cần bao gồm:

packagingOptions{
    exclude 'META-INF/DEPENDENCIES'
    exclude 'META-INF/NOTICE'
    exclude 'META-INF/NOTICE.txt'
    exclude 'META-INF/LICENSE'
    exclude 'META-INF/LICENSE.txt'
}

Thư viện zip nội dung jar tiếp theo:

commons-codec-1.6.jar
commons-logging-1.1.3.jar
fluent-hc-4.3.5.jar
httpclient-4.3.5.jar
httpclient-cache-4.3.5.jar
httpcore-4.3.2.jar
httpmime-4.3.5.jar

8

Lỗi này vẫn tồn tại trong 0,8 + / 1,10

Với Jackson

compile 'com.fasterxml.jackson.dataformat:jackson-dataformat-csv:2.2.2'

Tôi đã phải đưa vào cũng như gợi ý trên trước khi nó được biên dịch

exclude 'META-INF/services/com.fasterxml.jackson.core.JsonFactory'

cách loại trừ 'META-INF / services / com.fasterxml.jackson.core.JsonFactory'. Tôi nên chỉnh sửa tập tin nào?
UmAnusorn

6

Đó là nhiều hơn một lỗi

Dưới apply plugin: 'android-library'

thêm điều này ::

android {
    packagingOptions {
        exclude 'META-INF/ASL2.0'
        exclude 'META-INF/LICENSE'
        exclude 'META-INF/NOTICE'
    }
}

Trong trường hợp các tệp trùng lặp thật dễ dàng, hãy nhìn vào bên JARdưới META-INFthư mục và xem điều gì gây ra lỗi. Nó có thể là nhiều. Trong trường hợp của tôi, plugin Couchbase Lite. Khi bạn thêm nhiều plugin, bạn sẽ cần nhiều ngoại lệ hơn


Câu hỏi ngu ngốc: tập tin JAR đó ở đâu?
WillC

Trong Android Studio, chạy Gradle với --info cờ cho phép tôi xem nhật ký của các lớp được thêm vào apk và sau đó tôi có thể tìm kiếm lên trên để tìm mục nhật ký cho cùng một lớp được thêm từ một JAR khác. Điều này cũng cho tôi thấy đường dẫn tệp đến cả hai tệp JAR. Tôi không thể tìm thấy một cách hay để chọn một tệp
Class

4

Vấn đề tương tự khi tôi sử dụng 'org.springframework.android:spring-android-rest-template:2.0.0.M1' trong Android Studio 1.0.1. Tôi cần bao gồm điều này trongbuild.gradle

android{
...
    packagingOptions{
        exclude 'META-INF/notice.txt'
        exclude 'META-INF/license.txt'
    }
...
}

3

Điều này làm việc cho tôi:

android {
   packagingOptions {
       exclude 'LICENSE.txt'
   }
}


2

Vấn đề là thư mục META-INF sẽ không được lọc nên nhiều mục nhập NOTICEhoặc LICENSEgây trùng lặp khi xây dựng và nó được cố gắng sao chép chúng lại với nhau.

Khắc phục nhanh bẩn:

Mở .jartệp trong .gradle/caches/...thư mục của bạn (bằng công cụ tương thích zip) và xóa hoặc đổi tên các tệp trong META-INFthư mục gây ra lỗi (thông thường NOTICEhoặc LICENSE). (Tôi biết điều đó cũng có trong OP, nhưng đối với tôi nó không thực sự rõ ràng cho đến khi tôi đọc diễn đàn google)

BIÊN TẬP:

Điều này đã được sửa trong 0.7.1. Chỉ cần thêm các tập tin confilcting để loại trừ.

android {
    packagingOptions {
        exclude 'META-INF/LICENSE'
    }
}

Oh xin lỗi tôi chỉ hiểu nó bây giờ.
UmAnusorn

Có lẽ câu trả lời tồi tệ nhất có thể xảy ra: thay đổi các lọ trong bộ đệm cấp độ có thể thay đổi tổng kiểm tra của họ và do đó, kết quả sẽ không hiệu quả lâu dài ... bên cạnh đó, không phải là lọ của bạn
Riduidel

Vâng, đó là lý do tại sao nó nói "Khắc phục nhanh bẩn" bằng chữ in đậm. Ngoài ra giải pháp chính xác chỉ là một đoạn văn. Bạn có nhận ra rằng nó đã được viết vào thời điểm không có giải pháp sạch, nhưng mọi người vẫn cần phải biên dịch ứng dụng của họ.
Patrick Favre

2

Tương tự ở đây với

dependencies {
    compile 'org.apache.oltu.oauth2:org.apache.oltu.oauth2.client:1.0.0'
}

packagingOptions {
    exclude 'META-INF/DEPENDENCIES'
    exclude 'META-INF/LICENSE'
    exclude 'META-INF/NOTICE'
}

Tôi đã mất 2 ngày vì lỗi kỳ lạ đó ... Tại sao điều này vẫn xảy ra ở lớp 1.0.0? Điều đó rất đáng lo ngại cho người mới ... Dù sao, cảm ơn vì thông tin đó tôi nghĩ rằng đó là trên mã của tôi :)


2

Điều quan trọng cần biết trong tệp nào xảy ra lỗi này (trong ví dụ của bạn là META-INF / LICENSE.txt), trong trường hợp của tôi, đó là trong META-INF / LICENSE [không có ".txt"], và sau đó trong tệp META-INF / ASL2.0 vì vậy tôi đã thêm vào bản dựng của mình. Nâng cấp dòng này:

android {
    packagingOptions {
        exclude 'META-INF/LICENSE'
        exclude 'META-INF/ASL2.0'
    }
}

Rất quan trọng (!) -> thêm tên của tệp theo cùng một kiểu mà bạn thấy nó trong thông báo lỗi: văn bản phân biệt chữ hoa chữ thường và có sự khác biệt giữa * .txt và * (không có "txt") .


2

Nếu bạn muốn đóng vai trò là nhà phát triển, sử dụng các thư viện nguồn mở, bạn nên thử bao gồm tất cả các giấy phép nguồn mở trong của bạn apk. Để làm điều này, bạn có thể sử dụng phương thức hợp nhất trong của bạn packagingOptions.

Thí dụ:

packagingOptions {
        // This will get include every license and notice regardless of what dir it’s in.
        merge '**/LICENSE.txt'
        merge '**/NOTICE.txt'
        merge '**/notice.txt'
        merge '**/license.txt'
        merge '**/NOTICE'
        merge '**/LICENSE'
        merge '**/notice'
        merge '**/license'
        merge '**/LGPL2.1'
        // This will exclude any README files, regardless of the dir or the file type.
        exclude '**/README.*'
}

Câu trả lời này tốt hơn so với sử dụng pickFirstvì phương pháp đó chỉ chọn giấy phép đầu tiên mà nó tìm thấy và bỏ qua tất cả phần còn lại, khiến nó trở nên vô dụng trong trường hợp này.

Vì vậy, trong ngắn hạn, hãy sử dụng mergephương pháp để bao gồm tất cả các giấy phép từ các thư viện nguồn mở kickass mà bạn đang sử dụng.

Thông tin thêm về Gradle Bao bì .


2

Tôi nhận thấy nhận xét cam kết này trong AOSP, giải pháp sẽ là loại trừ một số tệp bằng DSL. Có lẽ khi 0.7.1 được phát hành.

commit e7669b24c1f23ba457fdee614ef7161b33feee69
Author: Xavier Ducrohet <--->
Date:   Thu Dec 19 10:21:04 2013 -0800

    Add DSL to exclude some files from packaging.

    This only applies to files coming from jar dependencies.
    The DSL is:

    android {
      packagingOptions {
        exclude 'META-INF/LICENSE.txt'
      }
    }

vâng và họ vừa viết ghi chú phát hành trên trang web xây dựng nên hy vọng họ sẽ sớm tải vật phẩm lên trung tâm maven để chúng tôi có thể sử dụng cái này!
Matt Wolfe

1

Trong trường hợp của tôi, tôi chỉ cần thêm vào tệp build.gradle của dự án:

android {
  packagingOptions {
    exclude 'META-INF/notice.txt'
    exclude 'META-INF/license.txt'
  }

   ...
}

0

Trong Android Studio 1.1.0 tôi cần tên viết thường:

packagingOptions{
      exclude 'META-INF/license.txt'
      exclude 'META-INF/notice.txt'
}

0

Các tệp "LICENSE.txt" và "NOTICE.txt" phân biệt chữ hoa chữ thường. Vì vậy, đối với thư viện SPring android tôi đã phải thêm

android {
    packagingOptions {
        exclude 'META-INF/LICENSE.txt'
        exclude 'META-INF/NOTICE.txt'
        exclude 'META-INF/license.txt'
        exclude 'META-INF/notice.txt'
    }
}

0

Xóa .txt sau khi LICENSE xóa lỗi của tôi:

packagingOptions {
    exclude 'META-INF/LICENSE'
}

0
  packagingOptions {
    exclude 'META-INF/DEPENDENCIES.txt'
    exclude 'META-INF/DEPENDENCIES'
    exclude 'META-INF/dependencies.txt'
    exclude 'META-INF/LICENSE.txt'
    exclude 'META-INF/LICENSE'
    exclude 'META-INF/license.txt'
    exclude 'META-INF/LGPL2.1'
    exclude 'META-INF/NOTICE.txt'
    exclude 'META-INF/NOTICE'
    exclude 'META-INF/notice.txt'
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.