Android開發容易忽略的錯誤(持續更新中)

1. ClickSpan致使長按崩潰javascript

2. webView踩過的坑html

3. webView JS方法 正式版本不能使用,混淆問題前端

  1. ClickSpan致使的長按崩潰(關於TextView中使用ClickSpan後, 長按該TextView會致使崩潰) 代碼以下:這是一個textViewk點擊部份內容響應事件。
public class Clickable extends ClickableSpan implements View.OnClickListener {
      private final View.OnClickListener mListener;

      public Clickable(View.OnClickListener l) {
          mListener = l;
      }

      @Override
      public void onClick(View v) {
          mListener.onClick(v);
      }

      @Override
      public void updateDrawState(TextPaint ds) {
          super.updateDrawState(ds);
          ds.setUnderlineText(false);
          ds.setColor(Color.parseColor("#FF6771"));
      }
  }

  //使用
  spanableInfo.setSpan(new Clickable(fromUserListener), start, end,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

此代碼, 在對TextView 進行長按操做的時候, 會致使崩潰, 崩潰的log以下:java

ava.lang.NullPointerException
    Attempt to invoke virtual method 'int android.widget.Editor$SelectionModifierCursorController.getMinTouchOffset()' on a null object reference

崩潰緣由是當使用了ClickableSpan的textview被觸發長按就會出現此bug,解決辦法就是屏蔽長按事件,android

(1) 調用 TextView.setLongClickable(false); 禁用長按事件web

(2) 調用json

TextView.setOnLongClickListener(new View.OnLongClickListener() {
    @Override
    public boolean onLongClick(View v) {
        return true;
        }
    });

消費掉長按事件便可;瀏覽器


最近項目裏面須要使用到webview和JS作交互的功能,(webView和JS交互不會同窗能夠翻看下我以前寫的文章裏面有教程,源碼過久遠遺失了┗|`O′|┛ 嗷~~) 咱們數數webView和JS的坑吧, 咱們先來看源碼 1.首先前端須要提供以下代碼事件。(名稱必定要跟後面的方法名稱對應坑)app

<div id='b'><a onclick="window.demo.clickOnAndroid(2)">b.c</a></div>

這裏window是必需要的,demo這個對應的webview註冊名稱好記,clickOnAndroid這個就是JS調用Android客戶端方法名稱。能夠帶參數,參數好像有限制,忘記了。 在看看客戶端源碼ide

//設置支持js代碼  首先要支持JS設置
        mWebView.getSettings().setJavaScriptEnabled(true);
        //此註釋也須要添加上不然好像也是沒有反應,報錯內容就是xxx.function不存在什麼的。
        @SuppressLint("AddJavascriptInterface")

        //重點方法以下,
        //增長接口方法,讓html頁面調用
        mWebView.addJavascriptInterface(new Object(){
            @JavascriptInterface   //這裏這個註釋必定不能掉, 是一個巨坑我找了一個多時辰。
            public void clickOnAndroid(){
                finish();
            }
        },"demo");

        // 這個方法好像也是要加的吧 主要是用來處理網頁上面的彈窗 
        //setWebChromeClient主要處理解析,渲染網頁等瀏覽器作的事情
        /*** WebChromeClient主要輔助WebView處理Javascript的對話框、網站圖標、網站title、加載進度等好比 **/

        mWebView.setWebChromeClient(new WebChromeClient())

3.webView JS方法 正式版本不能使用,混淆問題。

以上是小部分坑,最後一個坑,是debug版本根本沒有什麼問題,主要是正式版本以後就會發現原先的返回盡然不能用了。了。 坑了個爹,(╯‵□′)╯︵┻━┻。爲何能這樣,可是就是這樣,作了以上操做只能保證功能是沒有問題。可是混淆以後就不能用了呵呵了。 來看看如何解決 *通常狀況下js交互,代碼混淆的時候須要配置規則,如下是通用的混淆規則

#保留annotation, 例如 @JavascriptInterface 等 annotation
    -keepattributes *Annotation*


    #保留跟 javascript相關的屬性 
    -keepattributes JavascriptInterface


    #保留JavascriptInterface中的方法
    -keepclassmembers class * {

        @android.webkit.JavascriptInterface <methods>;
    }
    -keepclassmembers class fqcn.of.javascript.interface.for.webview {

       public *;
     }
    #這個根據本身的project來設置,這個類用來與js交互,因此這個類中的 字段 ,方法, 等儘可能保持
    -keepclassmembers public class com.packgename.WebViewClient{

       <fields>;
       <methods>;
       public *;
       private *;
    }

經過設置這些通用的規則以後,發現一些js調用仍是出現了問題。最終根據 log 日誌,以及mapping文件的查看,找出了緣由。

#這個類 必須保留,這個類在ViewClient中傳遞數據,若是被混淆 會致使一些callback沒法調用
    -keep class com.packgename.WebViewClient$addJavascriptInterface

    #類中成員的變量名也不能混淆,這些變量名被做爲json中的字段,不能改變。
    -keepclassmembers class com.packgename.WebViewClient$addJavascriptInterface{

        <fields>;
    }

總結:webview中的js交互混淆時,注意事項 混淆規則加入 js公用的規則 而且找出與js交互有關的bean類,進行保護 混淆規則所匹配的類,必須加入該類的 所有路徑 對於內部類,應該使用 $ 符號,而不是用 . 對於混淆出現的問題,能夠經過log和mapping文件進行追蹤。

相關文章
相關標籤/搜索