ProGuard試行錯誤のメモ
ProGuard 単純なプロジェクトにはかかるんだけど
ちょっと複雑なプロジェクトになると上手く行かず。。。
とりあえず試行錯誤のつぶやきとかメモ。また同じ事悩みそうなので・・
まず基本的なantでのbuild.xmlの話はここらへん
- Androidビルド - 備忘録
- 駄猫の備忘録: 今更ながらAntでAndroidアプリをビルドしてみる
- 駄猫の備忘録: 今更ながらAntでAndroidのTestを実行してみる
- 【Android】antビルドでProGuard
一応蛇足だけど作ったapkは下記みたいなシェルを作っておくと後々楽
- apk_install.sh
#!/bin/sh pkgname=パッケージ名 activity=起動クラス名 if [ $# -eq 0 ]; then echo "=== usage: ===" echo " ./apk_install.sh XXX.apk" echo " ./apk_install.sh XXX.apk 123456789" exit 0 fi if [ $# -eq 2 ]; then echo " === $2 start ===" adb -s $2 shell am force-stop $pkgname adb -s $2 uninstall $pkgname adb -s $2 install $1 adb -s $2 shell am start -a android.intent.action.MAIN -n $pkgname/$activity echo " === $2 end ===" exit 0 fi for SERIAL in `adb devices | sed -e "s/List of devices attached//" | sed -e "s/device//"` do echo " === $SERIAL start ===" adb -s $SERIAL shell am force-stop $pkgname adb -s $SERIAL uninstall $pkgname adb -s $SERIAL install $1 adb -s $SERIAL shell am start -a android.intent.action.MAIN -n $pkgname/$activity echo " === $SERIAL end ===" done exit 0
あと proguardかけた後のStackTraceを終えないと後で困るので下記のサイトで手順は把握しておくこと
でも見た感じ具体的な行数までは出てこないみたいなんだよな。。。
関数名はわかるようになるんだけど。
備考)
みてると一応パスの問題は最新だと直ってるみたい
- disp_proguard.sh
#!/bin/sh $ANDROID_HOME/tools/proguard/bin/retrace.sh -verbose ./bin/proguard/mapping.txt $1
をプロジェクトの直下において実行すればOK。
ただし ./bin以下って ant clean すると消えるので
直下にコピーしておいたほうがいいかなーとか思ったりもしてる(汗
追加したadが結局progurdで引っかかるのでURLみて -keep class [パッケージ名].** {*;}書いて通したけど、画像リソースとAdが殆どの容量占めてるからサイズは減らないな。。><
LibraryProjectのほう うまくproguardかかってないと思ったら、LibraryProjectの方のproguardを有効にしないと駄目なわけか。。。難しいわ・・ -libraryjars の方は -libraryjars annotations.jar でOK
@kimukou2628 えっ、マジですか?参照してるライブラリプロジェクトも設定しないと駄目なんですか?
2012-12-07 11:40:03 via web to @kimukou2628
@chototsumoushin 自分もメインプロジェクトだけでいいと思っていたんですが、どうもライブラリプロジェクトの方有効にするとエラーがワラワラ出てきて先ほど対処してました(苦笑 動き的に ライブラリプロジェクト=>jar作成 =>それメインプロジェクトにくっつける動き
@kimukou2628 いま慌ててmapping.txtを見ましたが、ライブラリプロジェクトのクラスもaとかbになってました。
2012-12-07 11:51:15 via web to @kimukou2628
@chototsumoushin うーん。libraryproject の方のproject.propertiesの方 proguard.config=proguard.cfg とかしなくても問題ないんですかね?プリチェックが厳密になるってだけならたしかにあんまり要らないかも。。
@kimukou2628 ライブラリプロジェクトならproguardを走らせる必要は無いけど、チェックしてないから走ってしまってるだけでは?
2012-12-07 11:58:28 via web to @kimukou2628
@chototsumoushin あえて外す方法ってあるんでしたっけ? 今試した感じだと、adクラスの除外設定がすべてライブラリプロジェクトに移動できたので、それでちょっと様子見てみます(ゲーム本体にAd系の固有処理入れたくないので<汗
想定構成は
- MainP(use twitter4j)
・libP(use Ad SDK)
android update project -p ./ -l ./../libP
として、それぞれのフォルダにbuild.xmlを生成した時
android update project -p ./
- MainP側のprogurad.cfg
-dontwarn
-keep class twitter4j.** {*;}
辺りを追加。-dontwarn の後ろにクラスを指定しない場合は全対象になる*1
- libP側のprogurad.cfg の末尾あたりに追記
-keep class com.ad_stir.** {*;} -keep class com.ngigroup.** {*;} -keep class com.google.ads.** {*;} -keep class jp.co.nobot.libAdMaker.** {*;} -keep class jp.Adlantis.Android.** {*;} -keep class jp.co.imobile.android.** {*;} -keep class jp.co.cyberagent.** {*;} -keep class mediba.ad.sdk.android.openx.** {*;} -keep class net.nend.android.** {*;} -keep class jp.co.dac.smarti.android.** {*;} -keep class com.inmobi.androidsdk.** {*;} -keep class jp.co.nobot.libYieldMaker.** {*;} -keep class jp.co.microad.smartphone.sdk.** {*;} -keep class net.zucks.zucksAdnet.sdk.** {*;} # original assain image -keep class [package name].** {*;} # admob warn -dontwarn com.google.ads.** -dontwarn jp.co.cyberagent.AMoAdView
annotaionベースのproguardの話はここらへんの話
もう参照されていない proguard.cfg がまだ残ってて、そっちをずっと編集していたというオチorz
@dmp アノテーションベースのproguardも試したいんですが上手く動かせず(>_<)。試したことありますか?
2012-12-07 09:43:41 via hamoooooon to @dmp
@kimukou2628 GSON ですか?
2012-12-07 09:44:26 via Krile2 to @kimukou2628
@dmp proguardの標準にあるアノテーション指定の除外設定。androidでやってるとproguard.cfgの設定しか上手く動かないような挙動が(´▽`;)ゞ
2012-12-07 09:47:24 via hamoooooon to @dmp
@kimukou2628 自分はまだトライしてないです。 URL これ見るとできそうな気がします
2012-12-07 09:50:25 via Krile2 to @kimukou2628
@dmp ant経由だとなんか動いていないような挙動で・・。それ以前にad系のjar入れてるとやたら引っかかっちゃうのでjar単位で除外できないと厳しいですね(汗。JDで中のクラス名いちいちチェックしてると面倒&progurdかかってるjarをさらにかけようとすると実行エラーとか
2012-12-07 10:05:56 via YoruFukurou to @dmp
@kimukou2628 なるほどー。jar は -libraryjars でなんとかならないんでしょうか
2012-12-07 10:12:02 via Krile2 to @kimukou2628
@dmp おおっ。ありがとうございます。ちょっと試してみます!
2012-12-07 10:13:23 via YoruFukurou to @dmp
proguard/annotation.jarを使う場合は
-include libs/annotations.pro
宣言を追加し
libP/libs辺りに
- annotation.jar
- annotation.pro
# # This ProGuard configuration file specifies how annotations can be used # to configure the processing of other code. # Usage: # java -jar proguard.jar @annotations.pro -libraryjars annotations.jar ... # # Note that the other input/output options still have to be specified. # If you specify them in a separate file, you can simply include this file: # -include annotations.pro # # You can add any other options that are required. For instance, if you are # processing a library, you can still include the options from library.pro. # The annotations are defined in the accompanying jar. For now, we'll start # with these. You can always define your own annotations, if necessary. -libraryjars annotations.jar # ★相対パス # The following annotations can be specified with classes and with class # members. # @Keep specifies not to shrink, optimize, or obfuscate the annotated class # or class member as an entry point. -keep @proguard.annotation.Keep class * -keepclassmembers class * { @proguard.annotation.Keep *; } # @KeepName specifies not to optimize or obfuscate the annotated class or # class member as an entry point. -keepnames @proguard.annotation.KeepName class * -keepclassmembernames class * { @proguard.annotation.KeepName *; } # The following annotations can only be specified with classes. # @KeepImplementations and @KeepPublicImplementations specify to keep all, # resp. all public, implementations or extensions of the annotated class as # entry points. Note the extension of the java-like syntax, adding annotations # before the (wild-carded) interface name. -keep class * implements @proguard.annotation.KeepImplementations * -keep public class * implements @proguard.annotation.KeepPublicImplementations * # @KeepApplication specifies to keep the annotated class as an application, # together with its main method. -keepclasseswithmembers @proguard.annotation.KeepApplication public class * { public static void main(java.lang.String[]); } # @KeepClassMembers, @KeepPublicClassMembers, and # @KeepPublicProtectedClassMembers specify to keep all, all public, resp. # all public or protected, class members of the annotated class from being # shrunk, optimized, or obfuscated as entry points. -keepclassmembers @proguard.annotation.KeepClassMembers class * { *; } -keepclassmembers @proguard.annotation.KeepPublicClassMembers class * { public *; } -keepclassmembers @proguard.annotation.KeepPublicProtectedClassMembers class * { public protected *; } # @KeepClassMemberNames, @KeepPublicClassMemberNames, and # @KeepPublicProtectedClassMemberNames specify to keep all, all public, resp. # all public or protected, class members of the annotated class from being # optimized or obfuscated as entry points. -keepclassmembernames @proguard.annotation.KeepClassMemberNames class * { *; } -keepclassmembernames @proguard.annotation.KeepPublicClassMemberNames class * { public *; } -keepclassmembernames @proguard.annotation.KeepPublicProtectedClassMemberNames class * { public protected *; } # @KeepGettersSetters and @KeepPublicGettersSetters specify to keep all, resp. # all public, getters and setters of the annotated class from being shrunk, # optimized, or obfuscated as entry points. -keepclassmembers @proguard.annotation.KeepGettersSetters class * { void set*(***); void set*(int, ***); boolean is*(); boolean is*(int); *** get*(); *** get*(int); } -keepclassmembers @proguard.annotation.KeepPublicGettersSetters class * { public void set*(***); public void set*(int, ***); public boolean is*(); public boolean is*(int); public *** get*(); public *** get*(int); }
時にprogurad.cfgを有効にするには、project.properies の
ant release
proguard.config=proguard.cfg
を有効にするイメージ
mapping.txtで確認
実行後にMainP側の
- bin/proguard/
の下に生成される
引っかかった処<要除外設定)
- Serializeしているクラス
- staticフィールドがあるクラス
まあ Proguardかけるのはいいけど、復元にはmapping.txtを残しておく必要が有る*2
参考リンク)
なんか環境によりproguardの本家のjar入れないと動かない場合があるらしい((たしかに以前あったような、、))
addJavascriptInterfaceの対象クラスもproguard除外対象にしないとダメの話
- rTAKI0329's android ブログ: ProGuard が勝手にコンストラクタを削除した件
- Yet Another Diary: ADT18のproguard-project.txtで困ったところ
- Proguard Breaks Android WebView, Why? - Stack Overflow
備考)
ADT21でのproguart-project.txt になおしてみた(2013/03/12)
- MainP/proguart-project.txt
-include libs/pro_annotations.pro #-dontwarn #-dontnote -dontwarn twitter4j.** -dontnote twitter4j.** -keep class twitter4j.** {*;} -dontwarn facebook4j.** -dontnote facebook4j.** -keep class facebook4j.** {*;}
悩んだのは
ADT21付属の最新版のproguard全然わからん>< -dontwarn -dontnote が効かないよ。。。-dontwarn twitter4j.** -dontnote twitter4j.** とかじゃないと効かない‥‥
見てると個別に指定できるよう
- libP/proguart-project.txt
-include libs/pro_annotations.pro -keep class com.ad_stir.** {*;} -keep class com.ngigroup.** {*;} -keep class com.google.ads.** {*;} -keep class jp.co.nobot.libAdMaker.** {*;} -keep class jp.Adlantis.Android.** {*;} -keep class jp.co.imobile.android.** {*;} -keep class jp.co.cyberagent.** {*;} -keep class mediba.ad.sdk.android.openx.** {*;} -keep class net.nend.android.** {*;} -keep class jp.co.dac.smarti.android.** {*;} -keep class com.inmobi.androidsdk.** {*;} -keep class jp.co.nobot.libYieldMaker.** {*;} -keep class jp.co.microad.smartphone.sdk.** {*;} -keep class net.zucks.zucksAdnet.sdk.** {*;} -dontwarn com.google.ads.** -dontwarn jp.adlantis.admediation.adapters.AMoAdAdapter -dontnote jp.adlantis.android.** -dontwarn com.ad_stir.adapters.** //☆ -dontnote com.ngigroup.adstir.adapters.** //☆ -dontnote **ILicensingService //☆ -dontnote **InstallReceiver //☆
☆は新規引っかかった。
adstir と AdMob更新したからかも‥‥
AdMob絡みだと
な話もあるよう
PS)
実際はadstirの公式wikiが間違ってたらしい(汗
AdLantisの広告出ない件解決した。AdStirのここ URL に載ってるProGuard除外設定が間違ってた。
2013-05-16 16:47:46 via web
誤)-keep class jp.Adlantis.Android.** {*;}正)-keep class jp.adlantis.android.** {*;}Javaのパッケージ名なので、気づかなかった自分もアレだけどハマった...
2013-05-16 16:48:23 via web
追記1)
nakamap 1.7 でていたので更新してみる。
今回はキャッシュでははまらなかったけど、試しにProGuardかけてみたらバッチ押しても動かず。。何が悪いんだろう?
一応wikiの記述を参考にして nakamap用のproguard.cfgは設定してみているんだけど。。。
nakamap 1.7なのか・・・ちょっと落としてみる。。(でも やっぱSBのテザリングだとめちゃ遅い<汗
うーん。やっぱりproguardをかけてしまうとnakamapが正常に動かなくなるなorz 有料アプリ前提だと使うの難しいか?URL みてはいるんだけどな。。。(エラーが出てないから何が原因かいまいちわかんねー
nakamapのwikiだと
- project.properties
proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard.cfg:nakamapsdk-proguard.cfg
を有効にするイメージでしたけど、動かせたのは下記(nakamap-sampleから nakamapsdk-proguard.cfgコピーは忘れずに)
proguard.config=proguard.cfg:nakamapsdk-proguard.cfg
追記2)のつぶやき見てると、proguard-android.txtの参照って
proguardを最新にする って話らしいんだけど、引っかかるのはなんでだろ。ちょっと保留課題かも
<実際新しく作って比べてみてもたいして差分がなかった。。
- project.properties
proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt:nakamapsdk-proguard.cfg
追記2+)
リリース直前で 今更ながら気づいた 他のプロジェクトの認証キーそのまま使いまわしているのはなぜ?(apk連携とか勿論ありませんorz しかもant build通らないんだけど。。<今リニューアル改修してる某ソフト
CMうつタイミングで緊急改修的な
そこら辺の話は androidのgradle対応の話 - exception think にメモってる
Android 21.1から 本体のproguard設定がONの時 library-project側のproguardの設定が動くというのはなくなって本体側で相対指定しないと動かないようになったみたい
- project.properties
android.library.reference.1=../libP proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:${android.library.reference.1}/proguard.cfg:proguard-project.txt
追記3)
NDK絡みの話
正直
Google Playで1、2分でキャンセルする人は大抵アカウントの日数が数百日以上のベテランが多いですね。アプリの内容は無料版で知っているはずなので、明らかに窃盗狙いとしか思えないのですよね。 URL
2013-03-02 21:21:21 via web
有料版ってapkとか抜けるんだっけ?そこら辺の仕組みよく理解してない(>_<) RT
@kimukou2628 ライセンスサービスLVLを使用すると、購入キャンセルしたら使えなくなるんでは。
2013-03-02 22:11:27 via twicca to @kimukou2628
@penguindaa 成る程。LVLは(IOSの似たような機能に比べて?)セキュリティ的に微妙って話聞いていたんですけど URL らへんの対策等をすれば問題ない感じなのでしょうか?
2013-03-02 22:27:22 via YoruFukurou to @penguindaa
@kimukou2628 LVLも安心ではないんですか。あとは、Proguardによる難読化とか、apk改ざんチェックですかね。だけど、それでも破る奴はいるから、本格的ビジネスでやるなら、商用の難読化ツールを導入すべきという話ですね。私はそこまでやらないですけど。
2013-03-02 22:35:12 via twicca to @kimukou2628
@penguindaa IOSやWPはバイナリイメージだからでコンパイルされない ってお話のようですね。後はNDKレイヤーにそこら編のライセンスチェック処理を逃がすみあいな話の話題もでてたりとか(汗。TwのOAuthキーも含めて鯖管理にしないと駄目な感じになってきてるのかもorz
2013-03-02 22:48:03 via YoruFukurou to @penguindaa
LVLの話)
- 2012.07.10 - LVL 導入でつまずいたことメモ
- LVL(License Verification Library)の導入 - TOPGATE Google関連技術サイト
- Android tips - LVLのデバッグ方法
追記4)
Interface周りの話)
URL みてたら proguardだとAIDL系の設定も除外するのは基本らしい(汗。知らんかったわ。。。(外部公開してない=内部だけなら問題なかったのかな?
http://twitter.com/kimukou2628/status/334250725540499457:twitter:detail:right
@kimukou2628 proguardはかけたことないけど。かけてはいけないクラスがあるので、ドキュメントか本を見たら。NDKとか使っているのはダメではなかったかな(不確か)。
2013-05-14 19:31:29 via twicca to @kimukou2628
http://twitter.com/kimukou2628/status/334256715115679744:twitter:detail:right
@kimukou2628 proguardは使ったことないから、詳細は分からないけど、aidlファイルを除外リストに入れたら。どうせ、それは世間に公開されているファイルでは?
2013-05-14 20:01:51 via twicca to @kimukou2628
@kimukou2628 話しがそれるけど。2apkに分ける手法は、語学アプリとか某録音アプリで使ったことあるけど、2apkだと、ユーザーがインストールを嫌がるようだけど、それはどうなの?
2013-05-14 20:16:27 via twicca to @kimukou2628
http://twitter.com/kimukou2628/status/334269526264918017:twitter:detail:right
@kimukou2628 自分は、GPLなライブラリ、ソフトを使うため、それ使用のを別apkにしているけど、GPLだから、署名を2apkで共通にするのはできない気がする。署名は秘密でもないのかな?今まで、インストールすると、依存apkのインストールをするようにPlayに誘導してた
2013-05-14 21:00:00 via twicca to @kimukou2628
@kimukou2628 続き)けど、ユーザーに意識させないで、追加apkをインストールさせる手もあるのかな。ちょっと、研究しないとダメだな。
2013-05-14 21:01:41 via twicca to @kimukou2628
http://twitter.com/kimukou2628/status/334464523677351937:twitter:detail:right
TL上のメモ等)
メモ。jacksonを含むプロジェクトにProGuardをかけようとする時には、jodaとw3cもkeep/dontwarnとマークしておく必要がある。 URL
2013-03-27 09:45:25 via web