17

を消費する Android アプリを圧縮しようとしていical4j.jarます。

gradle proguardDebugi getを使用してproguardでapkをビルドすると

  • 警告: net.fortuna.ical4j.model.CalendarFactory: ライブラリ クラス java.lang.Object で参照されているメソッド 'void finalize()' が見つかりません
    • 6 つの追加の同様の警告finalize()
  • 警告: net.fortuna.ical4j.model.CalendarFactory: ライブラリ クラス java.lang.Object で参照されたメソッド 'java.lang.Object clone()' が見つかりません
    • 6 つの追加の同様の警告clone()

Android-7 がサポートしていることを既に確認しておりfinalize()clone()「...\Android...\sdk\platforms\android-7\android.jar」にはメソッドfinalize()clone()クラスがありjava.lang.Objectます

これを修正する方法はありますか?

注:これは、他の「プロガードが参照されたメソッドを見つけることができない」という質問の複製ではありません。私の特定のケースでは、欠落しているメソッドがそこにあるはずだと思うからです。

私は使っている

  • proguard-4.11 で
  • グラドル-1.11
    • グルービー: 1.8.6
    • Ant: 2013 年 7 月 8 日にコンパイルされた Apache Ant(TM) バージョン 1.9.2
    • アイビー: 2.2.0
    • JVM: 1.7.0_25 (オラクル コーポレーション 23.25-b01)
    • OS: Windows 7 6.1 amd64
  • ical4j.jar 1.0.5

これはproguard-rules.txtおそらく何らかの修正が必要なプロガード構成です:

#  proguard-rules.txt
## ical4j also contains groovy code which is not used in android 
-dontwarn groovy.**
-dontwarn org.codehaus.groovy.**
-dontwarn org.apache.commons.logging.**
-dontwarn sun.misc.Perf

-dontnote com.google.vending.**
-dontnote com.android.vending.licensing.**

これは私のbuild.gradle

    buildscript {
        repositories {
            mavenCentral()
        }
        dependencies {
            classpath 'com.android.tools.build:gradle:0.9.+'
            classpath 'net.sf.proguard:proguard-gradle:4.11'
        }
    }

    allprojects {
        repositories {
            mavenCentral()
        }
    }

    apply plugin: 'android'

    configurations {
        compile.exclude group: 'commons-logging' // referenced in some portable lib. use androids internal instead
    }

    android {
        compileSdkVersion 19
        buildToolsVersion '19.0.3'

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

        defaultConfig {
            minSdkVersion 7
            targetSdkVersion 19
        }

        buildTypes {
            release {
                runProguard false
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
            }

            // used for testing. remove if it works as expected
            debug {
                runProguard true
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
            }
        }
    }

    dependencies {
        compile 'org.mnode.ical4j:ical4j:1.0.5'
        compile 'backport-util-concurrent:backport-util-concurrent:3.1'
        compile 'commons-codec:commons-codec:1.8'
        compile 'commons-lang:commons-lang:2.6'
    }

[2014-12-20 更新]

以下の回答として、作業構成を追加しました。

注: 現在の Android Studio 1.0 (android.buildToolsVersion >= '20') では 、 runProguardminifyEnabledに置き換える必要があります

    android {
        buildTypes {
            release {
                minifyEnabled true
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
            }
    }
4

3 に答える 3

19

net.fortuna.ical4j.model.CalendarFactory拡張groovy.util.AbstractFactoryする拡張しjava.lang.Objectます。ただし、中間クラスが入力から欠落しています (対応する警告を -dontwarn で抑制しています)。クラス階層の一部が欠落しているため、ProGuard は、CalendarFactory が保護されたメソッドcloneおよびfinalizeにアクセスする可能性があることを認識せず、これらの警告を出力します。

コードはおそらくクラスをまったく使用しないため、警告を抑制することができます。

-dontwarn net.fortuna.ical4j.model.CalendarFactory

または、すべての同様のクラスをカバーするには:

-dontwarn net.fortuna.ical4j.model.**

この問題には -keep オプションを追加しないでください。Android SDK では、基本的な Android 関連の -keep オプションが既に指定されています。

于 2014-05-29T23:56:13.757 に答える
2

これは私のプロガード構成ファイルです。コピペしてみてください

-dontskipnonpubliclibraryclasses
-dontskipnonpubliclibraryclassmembers
-dontpreverify
-verbose    

# standard, except v4.app.Fragment, its required when app uses Fragments

-keep public class * extends android.app.Activity
-keep public class * extends android.support.v7.app.ActionBarActivity
-keep public class * extends android.support.v4.app.Fragment
-keep public class * extends android.app.Application
-keep public class * extends android.app.Service
-keep public class * extends android.content.BroadcastReceiver
-keep public class * extends android.content.ContentProvider

-keepclasseswithmembers class * {
    native <methods>;
}

-keepclasseswithmembers class * {
    public <init>(android.content.Context, android.util.AttributeSet);
}

-keepclasseswithmembers class * {
    public <init>(android.content.Context, android.util.AttributeSet, int);
}

-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 * extends android.app.Activity { 
       public void *(android.view.View); 
}

次に、次のようにコードを追加します。

-dontwarn groovy.**

も追加

-keep class groovy.** { *; }

すべての外部ライブラリに対して実行します。

于 2014-05-28T08:59:34.690 に答える
-1

[更新 2014 年 5 月 30 日、このテキストを再構成]

問題を理解して解決するのに役立った@EricLafortuneの回答に感謝します。

Android ical4j アプリを圧縮したい他の人のために、ここに私の作業ソリューションがあります。

- の問題があるすべてのクラスはin library class java.lang.Object名前空間からのものです

 net.fortuna.ical4j.model.**

だから私はこれらの行をに追加しましたproguard-rules.txt

###################
# Get rid of #can't find referenced method in library class java.lang.Object# warnings for clone() and finalize()
# for details see http://stackoverflow.com/questions/23883028/how-to-fix-proguard-warning-cant-find-referenced-method-for-existing-methods
-dontwarn net.fortuna.ical4j.model.**

###############
# I use proguard only to remove unused stuff and to keep the app small.
# I donot want to obfuscate (rename packages, classes, methods, ...) since this is open source
-keepnames class ** { *; }
-keepnames interface ** { *; }
-keepnames enum ** { *; }

統計学:

  • 難読化なし: 932 クラス。apk 911kb.
  • 難読化あり: 365 クラス、apk 505kb
于 2014-05-28T10:55:43.260 に答える