WebView中支持js 使得WebView变得一下子强大起来,甚至很多web app的应用直接使用WebView去传参.有时候明明在测试的时候js是没问题的,而混淆打包后就无法执行了.比如在WebView所加载的图片中给各个图片都添加了点击事件的响应,但是混淆加密发布正式的包后安装发现点击相应WebView的图片毫无反应.归类后主要有下面2种情况:
情况一,测试时js可执行,混淆加密后js不可执行
这情况,应该就是混淆加密的时候proguard.cfg没有加入保护特定属性和类的代码,解决方案如下:
在项目中的proguard.cfg中加入下面代码:
-keepattributes *Annotation*
-keepattributes *JavascriptInterface*
-keep class com.test.android.XXX_Activity$*{
<methods>;
}
-keepclassmembers class <span style="font-family: Arial, Helvetica, sans-serif;">com.test.android.XXX_Activity$</span>$*{
*;
}
上面这段代码的意思是,保护项目中的注解属性和JavascriptInterface属性,同时对com.test.android包中的XXX_Activity类中的方法属性保护不加密.这样就能确保项目在混淆加密是通过保护使用了js的类和属性使得js可执行.
情况二,js在测试时无法执行
这种情况,因为开发版本为17以上(包括17)的, 都需要给对应的js方法前加上@android.webkit.JavascriptInterface 注解, 才能使该方法被系统识别.
比如代码中添加js接口的时候有这么一段:
function(){
var ele = document.getElementsByTagName("img");
javascript:contentlistener.getInfo(ele);
}
那么相应的getInfo(String ele)方法前就应该加入@android.webkit.JavascriptInterface注解:
@android.webkit.JavascriptInterface
public void getInfo(String ele){
//...
}
这样js接口方法就能在17以上的系统可执行了.17以下(不包括17)可以不加.