android js互相调用的方法,混淆后js无效,addJavascriptInterface使用注意事项

1,java和js互相调用的演示代码
1.1,JSAndroidActivity 代码

package com.homer.jsandroid;

import java.text.RuleBasedCollator;

import cn.trinea.android.common.annotation.NotProguard;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.View;
import android.webkit.JavascriptInterface;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.widget.Toast;

public class JSAndroidActivity extends Activity {

    private Activity mActivity = null;
    private WebView mWebView = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        mActivity = this;

        showWebView();
    }

    @SuppressLint("SetJavaScriptEnabled")
    private void showWebView(){     // webView与js交互代码
        try {
            mWebView = new WebView(this);
            setContentView(mWebView);

            mWebView.requestFocus();

            mWebView.setWebChromeClient(new WebChromeClient(){
                @Override
                public void onProgressChanged(WebView view, int progress){
                    JSAndroidActivity.this.setTitle("Loading...");
                    JSAndroidActivity.this.setProgress(progress);

                    if(progress >= 80) {
                        JSAndroidActivity.this.setTitle("JsAndroid Test");
                    }
                }
            });

            mWebView.setOnKeyListener(new View.OnKeyListener() {        // webview can go back
                @Override
                public boolean onKey(View v, int keyCode, KeyEvent event) {
                    if(keyCode == KeyEvent.KEYCODE_BACK && mWebView.canGoBack()) {
                        mWebView.goBack();
                        return true;
                    }
                    return false;
                }
            });

            WebSettings webSettings = mWebView.getSettings();
            webSettings.setJavaScriptEnabled(true);
            webSettings.setDefaultTextEncodingName("utf-8");

            mWebView.addJavascriptInterface(getHtmlObject(), "android");
            mWebView.loadUrl("file:///android_asset/index.html");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private Object getHtmlObject(){
        Object insertObj = new Object(){
            //@SuppressLint("JavascriptInterface") 这个不行

            @NotProguard 
            @JavascriptInterface        
            public String HtmlcallJava(){
                return "Html call Java";
            }

            @JavascriptInterface  
            @NotProguard 
            public String HtmlcallJava2(final String param){
                return "Html call Java : " + param;
            }

            @JavascriptInterface  
            @NotProguard 
            public void JavacallHtml(){
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        mWebView.loadUrl("javascript: showFromHtml()");
                        Toast.makeText(JSAndroidActivity.this, "clickBtn", Toast.LENGTH_SHORT).show();
                    }
                });
            }

            @NotProguard 
            @JavascriptInterface  
            public void JavacallHtml2(){
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        mWebView.loadUrl("javascript: showFromHtml2('IT-homer blog')");
                        Toast.makeText(JSAndroidActivity.this, "clickBtn2", Toast.LENGTH_SHORT).show();
                    }
                });
            }
        };

        return insertObj;
    }


}
1.2,JSAndroidActivity 代码

package cn.trinea.android.common.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
* NotProguard, Means not proguard something, like class, method, field

*
* @author Trinea 2015-08-07
*/
@Retention(RetentionPolicy.CLASS)
@Target({ElementType.TYPE, ElementType.METHOD, ElementType.CONSTRUCTOR, ElementType.FIELD})
public @interface NotProguard {

}

2,解决混淆后调用失败的问题的关键
加上@JavascriptInterface就可以是混淆后调用成功;如果不加这句,在api 16以后,混淆以后就会调用失败;

@JavascriptInterface

3,混淆配置

-keepattributes *Annotation*
# keep annotated by NotProguard
-keep @cn.trinea.android.common.annotation.NotProguard class * {*;}
-keep class * {
        @cn.trinea.android.common.annotation.NotProguard <fields>;
}
-keepclassmembers class * {
        @cn.trinea.android.common.annotation.NotProguard <methods>;
}

4,原理是什么
请参考这里
1,Proguard 部分类不混淆的技巧
2,android addJavascriptInterface 不能生效 解决办法
3,android webview中调用了js的时候混淆注意事项
5,DEMO完整工程
http://download.csdn.net/detail/codehxy/9577939

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值