1. ClickSpan致使長按崩潰javascript
2. webView踩過的坑html
3. webView JS方法 正式版本不能使用,混淆問題前端
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文件進行追蹤。