LoginSignup
38
27

More than 5 years have passed since last update.

Proguard メモ

Last updated at Posted at 2015-02-22

忘れること多いので

aar作成時にProgurad設定も一緒に入れておきたい

2015/07/22 追記

consumerProguardFiles という設定がある
なんと0.5.7の頃から…
サンプルとrelease note に書いてある

stack overflow見て知りました…

こんなpluginとかがあった

2015/03/08 追記

素晴らしい

こちらのproguard設定を集めているところから設定を取ってくるようですね

知らいない間にproguard-annotationsがMITライセンスで公開されていた

2015/06/12 追記

ここ

dependencies {
    compile "com.infstory:proguard-annotations:1.0.2"
}

proguard-annotations 確かにライセンスは気になっていたのでMITと明記してくれるのは嬉しい…
んだけど、これ本当に良いんだろうか…コードのCopyrightの人と違うけど…どういうあれになるんだろ

使っているライブラリを守る

AndroidをターゲットとしているLibraryなら、どこかしらに記載がある…気がする

無ければStackOverFlowをググったり(?)なんだりする

よく使いそうなライブラリに関してまとめてくれている人もいる

gitignore.io みたいなサイト欲しいですね(誰か作って)

あと以下に自分が最近良く使うLibraryに関連する設定を備忘的に

retrolambda

RxJava (RxAndroid)

RxJavaProGuardRulesを参考に。

proguard-rules.pro
-dontwarn sun.misc.Unsafe

-keepclassmembers class rx.internal.util.unsafe.*ArrayQueue*Field* {
   long producerIndex;
   long consumerIndex;
}

-keepclassmembers class rx.internal.util.unsafe.BaseLinkedQueueProducerNodeRef {
   long producerNode;
   long consumerNode;
}

この keepclassmembers を記述しておかないとこんな感じのエラーが発生することがある。

10-22 11:46:03.926 2680-2680/? E/AndroidRuntime: java.lang.InternalError
10-22 11:46:03.926 2680-2680/? E/AndroidRuntime:     at rx.internal.util.unsafe.UnsafeAccess.a(SourceFile:103)
10-22 11:46:03.926 2680-2680/? E/AndroidRuntime:     at rx.internal.util.unsafe.SpscArrayQueueProducerFields.<clinit>(SourceFile:39)
10-22 11:46:03.926 2680-2680/? E/AndroidRuntime:     at rx.internal.operators.OperatorObserveOn$ObserveOnSubscriber.<init>(SourceFile:102)
10-22 11:46:03.926 2680-2680/? E/AndroidRuntime:     at rx.internal.operators.OperatorObserveOn.a(SourceFile:64)
10-22 11:46:03.926 2680-2680/? E/AndroidRuntime:     at rx.internal.operators.OperatorObserveOn.call(SourceFile:44)
10-22 11:46:03.926 2680-2680/? E/AndroidRuntime:     at rx.Observable$2.a(SourceFile:158)
10-22 11:46:03.926 2680-2680/? E/AndroidRuntime:     at rx.Observable$2.call(SourceFile:154)
10-22 11:46:03.926 2680-2680/? E/AndroidRuntime:     at rx.Observable$2.a(SourceFile:162)
10-22 11:46:03.926 2680-2680/? E/AndroidRuntime:     at rx.Observable$2.call(SourceFile:154)
10-22 11:46:03.926 2680-2680/? E/AndroidRuntime:     at rx.Observable.a(SourceFile:7804)
10-22 11:46:03.926 2680-2680/? E/AndroidRuntime:     at rx.Observable.b(SourceFile:7772)
10-22 11:46:03.926 2680-2680/? E/AndroidRuntime:     at rx.Observable.a(SourceFile:7574)

(上記はkonifarさんが追記してくれました。ありがとうございました。)

RxJavaProGuardRulesに記載されているように、依存関係に突っ込むのが楽かも

functionaljava

2016/04/08 修正
現Versionの4.5ではretrolambdaに起因するものだけになりました(しました)
ので-dontwarn java.lang.invoke** だけで良いはず…

自分のコードに適応する

proguard annotations.jar の利用

何気に最近存在知った…

この辺参考に

ただ-dontshrink付ける必要はない(てかつけたらproguardとしての効果減るし)

一応手順を

$ANDROID_HOME/tools/proguard/examples/annotations/lib/annotations.jar

を依存関係に追加

$ANDROID_HOME/tools/proguard/examples/annotations/lib/annotations.pro

も使う

annotations.proをちょっと書き換える

#L17ぐらい
#依存関係に追加しているので要らなくなる
#-libraryjars annotations.jar

どっかに追加しとく

# annotations.jarの中身そのものが吹っ飛ぶのを避ける為に追加
# これを追加することで -dontshrink せずに済む
-keep class proguard.annotation.** {*;}

後は保護したいクラスやメソッドやFieldにアノテーションを付ける

txtでproguardの設定書かないメリットとして、IDEで一括リネームした時とかに有り難みを感じる

build.gradle

android {
    buildTypes {
        beta {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro', 'annotations.pro'
        }

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

BuildTypeで最適化Option付きを選んだり選ばなかったりしている

Genericの情報が

Signature 結構忘れる

確認

とはいうものの実際Proguard結果がどうなったか気になることは多いはず

そんな時はapp/build/outputs/mapping 以下とかみて確認する

ProguardそのもののVersionを変えたい

2016/12/07追記

Android Studio 2.3から 5.3.2になるっぽいです。
別のやつに書きましたが、仮に今直ぐあげるのなら 5.3.2 を選択しましょう。

2016/10/22追記

ここ

2016/10/22時点でのandroidのGradlePlugin(2.2.2)が依存するProguardのVersionは 5.2.1

で、つい先日これに近い(同じ?)現象に遭遇

結果としてProguardを現行のVersion(5.3)にすることで回避できました

Unexpected error while performing partial evaluation:       
   Class       = [...]      
   Method      = [...]      
   Exception   = [java.lang.IllegalArgumentException] (Stacks have different current sizes [0] and [1])

みたいなのが起きたら、とりあえず

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath ('com.android.tools.build:gradle:2.2.2') {
            exclude module: 'proguard-gradle'
        }
        classpath ('net.sf.proguard:proguard-gradle:5.3') {
            force = true
        }

    }
}

で回避できるかも?

なお、Optimize機能を利用しないなら関係のない話です

38
27
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
38
27