Android proguard Javascript接口问题

时间:2011-03-18 18:55:01

标签: javascript android interface proguard

使用proguard进行模糊处理后,我的项目使用javascriptinterface

失败

以下是关于proguard配置的一些建议的链接,但它在我的情况下不起作用

http://groups.google.com/group/android-developers/browse_thread/thread/f889e846fbf7ec3f?pli=1

因此来自Javascript的调用松散绑定到相关的Java方法

关于那个

的我的proguard配置
-keep public class com.trans_code.android.JavascriptCallback 
-keep public class * implements com.trans_code.android.JavascriptCallback 
-keepclassmembers class * implements com.trans_code.android.JavascriptCallback { 
    <methods>; 
} 
-keepclassmembers class * implements JavascriptCallback { 
    void on*(***);
} 
-keep public class com.trans_code.** {
  public protected *;
}

-keepclasseswithmembernames class com.MyActivity$JavascriptInterface

-keepclasseswithmembernames class com.MyActivity$JavascriptInterface {
    public protected *;
}

如果有人知道如何配置proguard让它过滤掉相关的方法和类,这对我有很大的帮助

4 个答案:

答案 0 :(得分:8)

该原始线程中的类名特定于该用户Java类,而不是所有javascript接口的通用名称。您实现的javascript接口只是一个简单的基类。

您需要更改它们以匹配接口类的名称。

例如,基于原始线程的示例,对于示例代码WebViewDemo的正确配置将是:

-keep public class com.google.android.webviewdemo.WebViewDemo.DemoJavaScriptInterface
-keep public class * implements com.google.android.webviewdemo.WebViewDemo.DemoJavaScriptInterface 
-keepclassmembers class * implements com.google.android.webviewdemo.WebViewDemo.DemoJavaScriptInterface { 
    <methods>; 
} 

由于绑定的工作方式,所有真正需要做的就是保持将从javascript中调用的内部方法使名称被混淆,但保持类名不被混淆不会受到伤害。

答案 1 :(得分:2)

在我的项目中,javascript界面​​是一个内部类。所以现在的答案对我来说并不适用。您需要在类之间使用$。如果您的接口是内部类

,请使用此代码
-keep public class com.myapp.MyActivity$MyJavaScriptInterface
-keepclassmembers class com.myapp.MyActivity$MyJavaScriptInterface {
   public *;
}
-keep public class * implements com.myapp.MyActivity$MyJavaScriptInterface

对于API17 +,添加以下行。否则您的代码将无法在Android 4.2 +

中运行
-keepattributes JavascriptInterface

类似的问题:
Android Proguard Javascript Interface Fail
Javascript interface not working with android 4.2

答案 2 :(得分:2)

这对我来说已经足够了:

-keepclassmembers class * {
    @android.webkit.JavascriptInterface <methods>;
}

它具有使用您用作Javascript界面​​的任何类的附加好处。

工作原理:它会使用@JavascriptInterface标记的所有方法保留原始名称。它不会自动保留类,但由于您必须在代码中实例化该类才能使用它,这不是问题。

关于trante关于在API 17+上保留注释本身的答案中的注释:我在KitKat上进行了测试并且它有效,所以它似乎也得到了解决。

答案 3 :(得分:1)

我解决了这个问题:

-keep public class com.myapp.JavaScriptInterface 
-keepclassmembers class com.myapp.JavaScriptInterface { 
    <fields>;
    <methods>;
}

JavaScriptInterface是我应用中的一个类(不是接口)。这就是为什么我没有使用这部分:

* implements