Androidアプリ開発時に外部ライブラリを難読化した際に発生した問題と解決方法
Androidアプリはソースを解析されにくくするため、難読化を行います。
通常は無料で配布されているProGuardを使う事が多いのですが、今回ProGuardを使用した際に外部ライブラリである広告SDKが上手く動かなくなる現象が発生しましたので、備忘録を兼ねて記載します。
間違いや、もっと良い方法がありましたならばお教え下さい。
– 問題の詳細 –
これまでAndroid向け広告としてAdMakerを使用していたのですが、medibaに統合され、更にSDKが更新された為、アップデートをする事にしました。
しかし、単純にProGuardを使用して難読化すると以下の問題が発生する様になってしまいました。
- コールバックメソッドが呼び出されない
- 15秒程度で広告が消えて無くなる
勿論、これらの問題はProGuardを使用する前であれば発生していませんので、アプリの問題では無くProGuardで難読化する時の設定が問題であると判断しました。
コールバックメソッドが呼ばれないのは内部で落ちているのかも知れません。ソースを難読化して変更しているので誰も責める事はできませんけれどね(笑)
以前にも別の会社の広告ライブラリをProGuardで難読化した時に広告が出なくなる、という問題も出た事がありました。
この時は単純に全クラスに「-keep」設定を付けて難読化する事で解決したのですが、今回は解決せず、でした。
この様な問題が出るので、難読化後はきちんとテストしないと怖いですね。
– 問題の解決方法 –
ProGuardは細かく設定できるのですが、何分にも設定内容が多すぎてわかりにくい為、色々試行錯誤し、一時は諦めかけました(笑)
最終的にはProGuardにはGUIツールがある事を思い出し、GUIツールで色々設定をした時の設定内容を参考に以下の内容を追記する事にしました。
-keep class mediba.ad.sdk.android.openx.* { <fields>; <methods>; }
上記内容を追加した事で、ProGuardで難読化後も問題が出なくなりました!
※MedibaAdSDK 1.0.1で確認。
なお、この内容を指定した事により問題が出ても責任は持ちませんので、自己責任を前提に参考にして下さい。
– 2012/06/12追記 –
最新のAdMobライブラリ(GoogleAdMobAdsSdk-6.0.1.jar)にProGuardを使用すると実行時にVerifyErrorが発生する様になってしまいました。
そこで応用で以下の設定を追加しました。
※効果があったのは最後の「-keep public class com.google.ads.*.*.*」だけかも知れません。VerifyErrorの発生箇所がそこでしたので。
-keep public class com.google.ads.* { <fields>; <methods>; } -keep public class com.google.ads.*.* { <fields>; <methods>; } -keep public class com.google.ads.*.*.* { <fields>; <methods>; }
– SkyArts について –
私ども SkyArts ではAndroid/iOSアプリなどのスマートフォン開発のコンサルティングなどを承っております。
Androidアプリを不正使用から守る為の情報をまとめた電子書籍「Androidアプリ開発者のための不正使用対策」を販売しています。
加えて、私どもの既存アプリ のカスタマイズ開発なども承っております。「このアプリに自社業務向けにこの様な機能を入れたい!」といったご要望にお応えいたします。
ご連絡は メール、Twitter などでお気軽にお問い合わせ下さい。