proguard使用時のJavascriptInterfaceメソッド除外につきまして

930 views
Skip to first unread message

まあさ

unread,
Jul 1, 2013, 3:44:29 PM7/1/13
to android-g...@googlegroups.com
いつも大変お世話になっております。
まあさと申します。

今回proguardの難読化について質問させて頂きたく投稿致しました。

アプリの内容は、webview#addJavascriptInterfaceにてjavascriptと連携をするクラスを作成し、
webview内のボタンを押下する事でアプリ内のメソッドが呼ばれる内容です。


public class JSITEST extends Activity{
 onCreate(){
  ~~~~
 }
 onResume(){
  ~~~~
  webView.addJavascriptInterface(new JavascriptInterface(), "android");
 }
 private static class JavascriptInterface {
  //webview内でボタン押下された際に呼び出されるメソッド
  public void jsrun(){
   ~~~~
  }
 }
}

簡単にまとめると上記のような内容となっております。

そこで、こちらをproguardを使用せずにビルドすると問題なくjsrun()が実行されるのですが、
proguardを使用すると、jsrun()は実行されなくなってしまいます。

色々調べてみると、JavascriptInterfaceはproguardの難読化から除外すべきという情報が多々ありまして、
このクラス自体を除外しようと、proguard-project.txtに下記のように記述致しました。

-keep class com.package.JSITEST {
*;
}

しかし、設定後にビルドを行ってもjsrun()は呼ばれません。
mapping.txtの読み方がいまいち理解できていないのですが、一応中を見てみたところ
JavascriptInterfaceのクラスがリネームされているような雰囲気だったので、こちらが原因なのではないかと疑っている所です。
とはいえ、クラス全体を除外しているにも関わらず、リネームされるのはなぜかも分かりません。

もしどなたかアドバイス頂けましたら大変光栄です。
よろしくお願い致します。

Hirokazu Fukami

unread,
Jul 1, 2013, 7:10:02 PM7/1/13
to android-g...@googlegroups.com
こんにちはfkmです。

ProGuardを有効にした場合、proguardフォルダができていると思うので、
その中にあるmapping.txtを確認してみてください。
名前をどう変更したかが書いてあります。

2013/7/2 まあさ <kubotam...@gmail.com>:
> --
> このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
> このグループから退会し、メールの受信を停止するには、android-group-j...@googlegroups.com
> にメールを送信します。
> このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。
> http://groups.google.com/group/android-group-japan からこのグループにアクセスしてください。
> その他のオプションについては、https://groups.google.com/groups/opt_out にアクセスしてください。
>
>



--
-------------------------------------------------------------
深見 浩和(Hirokazu Fukami)

URI:http://www.fkmsoft.jp
email: f...@fkmsoft.jp

まあさ

unread,
Jul 2, 2013, 12:33:17 AM7/2/13
to android-g...@googlegroups.com
ご返信ありがとうございます。

mapping.txtを確認致しましたところ、
com.package.JSITEST$JavascriptInterface -> com.package.s:
となっておりました(パッケージ名部分は変更しております)
ただ、その他の変数に関しては元の変数名のままになっております。

これは、-keep class com.package.JSITEST {*;}によって変数名は難読化から除外されたものの
メソッド名はリネームされており、結果としてそれが原因でjsrun()が呼び出されないという事でしょうか?

2013年7月2日火曜日 8時10分02秒 UTC+9 fkm:
> このグループから退会し、メールの受信を停止するには、android-group-japan+unsubscribe@googlegroups.com
> にメールを送信します。
> このグループに投稿するには、android-group-ja...@googlegroups.com にメールを送信してください。

村上 卓弥

unread,
Jul 2, 2013, 12:53:38 AM7/2/13
to android-g...@googlegroups.com
JavascriptInterface はインナークラスになっているので、

-keep class com.package.JSITEST$JavascriptInterface { *; }

と書かないとダメだと思いますよ。

2013年7月2日火曜日 13時33分17秒 UTC+9 まあさ:

まあさ

unread,
Jul 2, 2013, 2:19:43 AM7/2/13
to android-g...@googlegroups.com
ご返信ありがとうございます。

>-keep class com.package.JSITEST$JavascriptInterface { *; }

仰る通り、上記のように設定しましたところ、正常に動作致しました。
クラスの基本的な概念をあまり理解出来ていないようでお恥ずかしい限りです。

fkmさん、村上さん
大変助かりました。
ありがとうございました。



2013年7月2日火曜日 13時53分38秒 UTC+9 村上 卓弥:
Reply all
Reply to author
Forward
0 new messages