Android StudioでProGuardを使用する方法


98

これはAndroid Studioでの最初のプロジェクトであり、アプリのコードは難読化されていません。私はbuild.gradleファイルでこの構成を使用しています: ここに画像の説明を入力してください

[ビルド]> [署名済みAPKを生成...]を使用しており、[Proguardを実行]がオンになっています。また、Apk_OneClick.v4.2を使用してテストしたところ、コードは非常に読みやすくなっています。

ここに画像の説明を入力してください

私を助けてください。:(


難読化コードのテキストファイルで定義されたプロガードルールを表示します。
pyus13 14年

アプリが難読化されているかどうかを確認するにはどうすればよいですか?
VVB 2016年

@VVB私は推測するAPKファイルを逆に生成します:D
hotHead

回答:


71

おそらく、署名ウィザードを介してAPKのリリースビルドに実際に署名していません。次のコマンドを使用して、コマンドラインからリリースAPKをビルドできます。

./gradlew assembleRelease

または、ビルドバリアントビューからリリースバリアントを選択し、GUIからビルドすることができます。

ビルドバリアントを示すIDEメインウィンドウ


すごい!デバッグをrunProguard trueに変更して完全に動作することをテストしました。今私はあなたの返事を読んで動作します!!!! 偉大な人!ありがとうございました。
Felipe Porge Xavier 2014

コマンドラインの指示に誤って「assembleRelease」の代わりに「assembleDebug」を入れました。答えを直した。
Scott Barta 2014年

コマンドラインを介してエクスポートされる.apkファイルのパスは何ですか?
Shajeel Afzal

50

build.gradleファイルをproguard実装用に構成できます。モジュールレベルでもプロジェクトレベルでもかまいません。

 buildTypes {

    debug {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'

    }

}

示されている構成はデバッグレベル用ですが、buildTypes内に以下に示すような独自のビルドフレーバーを記述できます。

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

minifyEnabled falseとして、プロダクションビルドおよびその他のビルドでデバッグすることをお勧めしますminifyEnabled true

次のように、モジュールまたはプロジェクトフォルダーのルートにproguard-rules.txtファイルをコピーします。

$YOUR_PROJECT_DIR\YoutProject\yourmodule\proguard-rules.txt

必要に応じてファイルの名前を変更できます。構成後、3つのオプションのいずれかを使用して、buildTypeに従ってビルドを生成します。

  1. 右側のパネルでgradleタスクに移動しassembleRelease/assemble(#your_defined_buildtype)、モジュールタスクの下を検索します

  2. 左パネルのビルドバリアントに移動し、ドロップダウンからビルドを選択します

  3. エクスプローラーでプロジェクトのルートディレクトリに移動し、cmd / terminalを開いて実行します。

Linux ./gradlew assembleRelease or assemble(#your_defined_buildtype)

ウィンドウズ gradlew assembleRelease or assemble(#your_defined_buildtype)

apkはmodule / buildディレクトリにあります。

構成ファイルとプロガードファイルの場所の詳細については、リンクを参照してください。

http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Running-ProGuard


myproductionbuildを使用するためにどこに言うことができますか?
Felipe Porge Xavier、2014

ええ、あなたは正しいです:)あなたは左側のサイドパネルのビルドバリアントタブで同じことを見ることができます。
pyus13 14年

しかし、apkには難読化がありません... :(
Felipe Porge Xavier 14年

あなたが設定を書かれている以上、ここでいくつかの例を参照してくださいProGuardの-rule.txt proguard.sourceforge.net/index.html#manual/examples.html
pyus13

Gradle DSLメソッドrunProguard()が見つかりません。
SleepNot

41

注意:今ではなく

runProguard false

使用する必要があります

minifyEnabled false

5
trueに設定する必要があると思います
anna_manzhula 2017年

1

「proguard-rules.txt」ファイルの名前を「proguard-android.txt」に変更して、gradleファイル内の「proguard-rules.txt」への参照を削除してください。このgetDefaultProguardFile(...)呼び出しは、Googleが提供するものであり、プロジェクト内のものではない、別のデフォルトのプロガードファイルを参照します。これも削除して、gradleファイルが次のようになるようにします。

buildTypes {
    release {
        runProguard true
        proguardFile 'proguard-android.txt'
    }
}

私のために働かないでください。カスタムのproguard-android.txtをproguard-rules.txtによって同じディレクトリに配置しましたが、コードに変更はありません。
Felipe Porge Xavier 2014

0

ここでの他の答えは、proguardの使用に関する優れたリファレンスです。しかし、私がそれに遭遇したという議論がマインドベンダーであるという問題を見たことがありません。署名付きリリース.apkを生成した後、それは/releaseアプリのフォルダーに入れられますが、私のアプリには/releaseフォルダーにないapkがありました。したがって、私は何時間もかけて間違ったapkをデコンパイルして、なぜ私のプロガードの変更が影響を及ぼさないのか疑問に思いました。これが誰かを助けることを願っています!


0

以下は、proguard-rules.proに追加する必要がある最も一般的なProguardルールの一部です。Android Sutdioのファイルにます。

バターナイフ

 -keep class butterknife.** { *; }
 -dontwarn butterknife.internal.**
 -keep class **$$ViewBinder { *; }
 -keepclasseswithmembernames class * {
        @butterknife.* <fields>;
  }
 -keepclasseswithmembernames class * {
        @butterknife.* <methods>;
  }

後付け

 -dontwarn retrofit.**
 -keep class retrofit.** { *; }
 -keepattributes Signature
 -keepattributes Exceptions

OkHttp3

 -keepattributes Signature
 -keepattributes *Annotation*
 -keep class okhttp3.** { *; }
 -keep interface okhttp3.** { *; }
 -dontwarn okhttp3.** 
 -keep class sun.misc.Unsafe { *; }
 -dontwarn java.nio.file.*
 -dontwarn org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement 

Gson

 -keep class sun.misc.Unsafe { *; }
 -keep class com.google.gson.stream.** { *; }

コード難読化

-keepclassmembers class com.yourname.models** { <fields>; }
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.