2014-01-21 30 views
6

靶向SDK当我在我的机器人工程定制的网页视图,如下所示:Proguard的乱七八糟的Javascript接口功能在Android清单以上17

public class MyWebView extends WebView { 

    public MyWebView(Context context) { 
     super(context); 
    } 

    public class JsObject { 

     @JavascriptInterface 
     public void show() { 
      //... 
     } 

     @JavascriptInterface 
     public void hide() { 
      //.... 
     } 
} 

包括JavascriptInterface我使用与JavaScript侧连通Android方面。

在AndroidManifest我有以下

<uses-sdk 
    android:minSdkVersion="8" 
    android:targetSdkVersion="16" /> 

在我用proguard的项目宣告:

-keepattributes JavascriptInterface 

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

,一切工作正常。

但是,当我将AndroidManifest更改为android:targetSdkVersion=1819并在18或更高版本的设备上测试时,proguard似乎弄乱了无法访问的JavaScript方法。

如果我放回16或小于17的任何东西一切正常。此外,这只发生在proguard中。如果我不使用proguard,即使使用android:targetSdkVersion=18或19,一切都可以正常工作。任何人都可以帮助使其在清单Android> 17中定位时正常工作吗?

+0

'@ JavascriptInterface'在SDK级别17中引入。您将收到注释无法解析的编译错误,并且通过删除它,Proguard将找不到任何匹配项并删除所有方法。你确定最后一段准确地描述你的问题吗? –

+0

保罗谢谢你的回复。是的,我知道SDK级别17中引入了@JavascriptInterface。我已经使用了这个方法好几个月,一切正常。只有这个更改android:targetSdkVersion = 18或19在清单中只是在运行时混淆了proguard和javascript接口。 Proguard在任何情况下编译都没问题,没有报告错误或警告! – andreasv

+0

@andreasv我有我的JavaScript界面​​完全相同的问题。编译的应用程序在api 17级以下的设备上工作正常,但不能在果冻豆和以上。此外,我在我的应用程序中加入了appbrain sdk,并且还提供了检查proguard配置的警告。就好像JavaScript在整个应用程序中关闭一样。没有proguard它工作正常。 我花了我整整一天,并尝试每一个解决方案建议在stackoverflow和他们都没有工作。你解决了这个问题吗? 请帮助家伙! – StarWars

回答

19

我我的答案复制从这个话题您:https://stackoverflow.com/a/19994873/1735499

而且,如果你正在使用Proguard的,记得要加这个

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

-keepattributes JavascriptInterface 
-keep public class com.mypackage.MyClass$MyJavaScriptInterface 
-keep public class * implements com.mypackage.MyClass$MyJavaScriptInterface 
-keepclassmembers class com.mypackage.MyClass$MyJavaScriptInterface { 
    <methods>; 
} 

如果它还是不能确定,添加此

-keepattributes *Annotation* 

注意:您的MyJavaScriptInterface必须为公共类

参考号码:Android Proguard Javascript Interface Fail

BR,

弗兰克

+1

您需要'-keepattributes * JavascriptInterface * '如果你使用混淆。 http://proguard.sourceforge.net/manual/usage.html#obfuscationoptions –

6

这4条线路通常就足够了 - 没必要让公众接口。

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

在我而言,只是:

-keepclassmembers class com.mypackage.MyJavaScriptInterface { 
    public *; 
} 

-keepattributes *Annotation* 

是足够了!