Câu hỏi Android Build với Gradle và ProGuard: “Bình đầu ra phải được chỉ định sau một lọ đầu vào, hoặc nó sẽ trống”


Tôi đang tạo một bản dựng với các hương vị khác nhau với Gradle. Nó được sử dụng để chạy khá tốt cho đến bây giờ, cho đến khi tôi muốn kích hoạt Proguard. Tôi đã bật minifyEnabled cho Bản phát hành bản phát hành của tôi và giờ tôi đang có ngoại lệ cho biết:

"Caused by: org.gradle.internal.UncheckedException: java.io.IOException: The output jar [.../app/build/intermediates/multi-dex/dev/release/componentClasses.jar] must be specified after an input jar, or it will be empty."

Có ai biết điều gì đang gây ra ngoại lệ này? Tôi về cơ bản muốn kích hoạt ProGuard trước khi tôi phát hành ứng dụng của mình. Đây là tệp Gradle của tôi bên dưới.

lintOptions {
    abortOnError false
}

dexOptions{
    incremental true
    javaMaxHeapSize "4g"
}

defaultConfig {
        applicationId "..."
        minSdkVersion 14
        targetSdkVersion 22
        versionCode 1
        versionName "1.0"
        multiDexEnabled true
    }

buildTypes {

    release {
        minifyEnabled true
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        signingConfig signingConfigs.release
    }

    debug {
        minifyEnabled false
        shrinkResources false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        signingConfig signingConfigs.debug
    }
}

Tệp quy tắc ProGuard.

# Add project specific ProGuard rules here.
# By default, the flags in this file are appended to flags specified
# in /Users/osayilgan/Development/Android/sdk/tools/proguard/proguard-android.txt
# You can edit the include path and order by changing the proguardFiles
# directive in build.gradle.
#
# For more details, see
#   http://developer.android.com/guide/developing/tools/proguard.html

# Add any project specific keep options here:

# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
#   public *;
#}

-keepnames public class * extends io.realm.RealmObject
-keep class io.realm.** { *; }
-dontwarn javax.**
-dontwarn io.realm.**

Và đây là tập tin proguard-android. Đây là mặc định từ Android SDK.

# This is a configuration file for ProGuard.
# http://proguard.sourceforge.net/index.html#manual/usage.html

-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-verbose

# Optimization is turned off by default. Dex does not like code run
# through the ProGuard optimize and preverify steps (and performs some
# of these optimizations on its own).
-dontoptimize
-dontpreverify
# Note that if you want to enable optimization, you cannot just
# include optimization flags in your own project configuration file;
# instead you will need to point to the
# "proguard-android-optimize.txt" file instead of this one from your
# project.properties file.

-keepattributes *Annotation*
-keep public class com.google.vending.licensing.ILicensingService
-keep public class com.android.vending.licensing.ILicensingService

# For native methods, see http://proguard.sourceforge.net/manual/examples.html#native
-keepclasseswithmembernames class * {
    native <methods>;
}

# keep setters in Views so that animations can still work.
# see http://proguard.sourceforge.net/manual/examples.html#beans
-keepclassmembers public class * extends android.view.View {
   void set*(***);
   *** get*();
}

# We want to keep methods in Activity that could be used in the XML attribute onClick
-keepclassmembers class * extends android.app.Activity {
   public void *(android.view.View);
}

# For enumeration classes, see http://proguard.sourceforge.net/manual/examples.html#enumerations
-keepclassmembers enum * {
    public static **[] values();
    public static ** valueOf(java.lang.String);
}

-keep class * implements android.os.Parcelable {
  public static final android.os.Parcelable$Creator *;
}

-keepclassmembers class **.R$* {
    public static <fields>;
}

# The support library contains references to newer platform versions.
# Don't warn about those in case this app is linking against an older
# platform version.  We know about them, and they are safe.
-dontwarn android.support.**

25
2018-06-03 21:32


gốc


bạn có thể cung cấp tập tin proguard của bạn không? - VicVu
@VicVu Tôi đã cập nhật câu hỏi của mình với các tệp ProGuard. - osayilgan


Các câu trả lời:


Phải mất một lúc tôi mới tìm ra được, nhưng, như tôi đã đoán, đó là tất cả về cấu hình Proguard.

Tôi bắt đầu tìm hiểu thông qua các Cảnh báo trong Bảng điều khiển và nhận ra rằng một số Tài liệu tham khảo không thể được tìm thấy bởi Proguard. Vì vậy, thêm chúng dưới dạng -dontwarn để tập tin cấu hình proguard giải quyết được vấn đề.

Trong trường hợp của tôi, tôi phải bỏ qua các gói dưới đây;

-dontwarn java.lang.invoke**
-dontwarn org.apache.lang.**
-dontwarn org.apache.commons.**
-dontwarn com.nhaarman.**
-dontwarn se.emilsjolander.**

22
2018-06-04 02:10



hi @osayilgan tôi đang đối mặt với cùng một vấn đề. và nó không làm việc cho tôi tôi đặt này trong progurad của tôi quy tắc pro tập tin. tôi có nên đặt bất kỳ nơi nào khác không - shivpal jodha
@shivpaljodha Những quy tắc proguard này chỉ là một ví dụ. Bạn cần tìm hiểu xem phụ thuộc nào gây rắc rối cho bạn. Hãy chú ý đến các cảnh báo và lỗi trong LogCat để bạn có thể tìm ra. - osayilgan