【问题标题】:Android proguard Javascript Interface problemAndroid proguard Javascript 接口问题
【发布时间】:2011-03-18 18:55:00
【问题描述】:

使用 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 让它过滤掉对我有很大帮助的相关方法和类

【问题讨论】:

    标签: javascript android interface proguard


    【解决方案1】:

    来自该原始线程的类名特定于该用户的 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 调用的内部方法的名称混淆,但保持类名不混淆并没有什么坏处。

    【讨论】:

    • 实际上,这对我不起作用。对我有用的(Proguard 4.7)是-keepclassmembers class * { public void onButtonClickMethodName(); }
    【解决方案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

    【讨论】:

    • 谢谢..拯救了我的一天!
    【解决方案3】:

    这对我来说已经足够了:

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

    它还有一个额外的好处,就是可以与您曾经创建的任何类一起用作 Javascript 接口。

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

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

    【讨论】:

    • 这对我有用。添加完整的类名是关键
    【解决方案4】:

    我这样解决了这个问题:

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

    JavaScriptInterface 是我的应用程序中的一个类(不是接口)。这就是我没有使用这部分的原因:

    * implements.

    【讨论】:

      猜你喜欢
      • 2011-09-10
      • 2011-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-11
      • 1970-01-01
      相关资源
      最近更新 更多