如何基於使用現狀改造:
1 日誌和線上監測:
fiddler抓包,chrome Devtools, stecho inspect 注意:chrome Devtools會影響/接管webview本身快取
線上監測指標:
- 首屏時間: 從外層activity oncreate到webview onFinish回撥
- webview內頁面切換時間: onstart到onfinish
- dns解析異常,網路連線失敗,404,50x的上報和統計
- 快取目錄大小和命中率
2 配備常用的呼叫android原生的功能
- 拍照/選圖->裁剪->壓縮--->上傳(結合具體專案),返回本地檔案路徑或者上傳好的圖片url
- app裡已經模組化的自定義拍照功能/人臉檢測功能
- 定位功能模組,涵蓋獲取gps,geodecode,乃至轉成自己後臺的cityId之類的
- 獲取deviceId,uid,userdetail,token,國家,語言等基礎業務功能
- 開啟,關閉整個activity
- 跳到app內其他頁面(通用跳轉能力).
- 跳到其他app
- 登入
- 分享
- 撥打電話,以及呼叫系統其他功能等
- 日誌上報功能
- 操控toolbar/titlebar和狀態列,全屏等
需要處理的
- 進度條
- 錯誤頁面: 收到404,50x,以及網路連線失敗時載入本地html,以優化體驗
- https
- cookie同步
- js調native後與activity的通知: 需要將其移到單獨一個類中統一管理
- webview記憶體洩漏問題
載入速度優化
- 離線包
- 底層灰度+平滑地切換到VasSonic
- 快取路徑自定義和大小自定義
- 強制快取
安全
- debugable:根據app的debugable來設定
- js注入攻擊防範:3個介面的移除
對於Android呼叫JS程式碼的方法有2種,綜合使用:
- 1.通過WebView的loadUrl()
- 2.通過WebView的evaluateJavascript()
public static void runJsFunc(WebView webView,String funcName,@Nullable ValueCallback<String> callback, Object... params){
if(TextUtils.isEmpty(funcName)){
return;
}
if(webView == null){
return;
}
StringBuilder builder = new StringBuilder(funcName);
builder.append("(");
if(params != null && params.length >0){
int len = params.length;
for (int i = 0; i<len; i++){
Object param = params[i];
String str = "";
if(param != null){
if(param instanceof String){
str = "\""+param.toString()+"\"";
}else {
str = param.toString();
}
}
builder.append(str);
if(i != len-1){
builder.append(",");
}
}
}
builder.append(")");
String jsFunc = builder.toString();
XLogUtil.d("jsFunc:"+jsFunc);
webView.post(() -> {
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT){
//4.4版本以上,呼叫帶返回值js方法
webView.evaluateJavascript(jsFunc, new ValueCallback<String>() {
@Override
public void onReceiveValue(String value) {
XLogUtil.d("jsFunc :"+jsFunc +",onReceiveValue:"+value);
if(callback != null){
callback.onReceiveValue(value);
}
}
});
}else {
webView.loadUrl("javascript:" + jsFunc);
}
});
}
複製程式碼
JS呼叫Android程式碼的方法有3種:一般用第一種
- 1.通過WebView的addJavascriptInterface()進行物件對映
- 2.通過 WebViewClient 的shouldOverrideUrlLoading ()方法回撥攔截 url
- 3.通過 WebChromeClient 的onJsAlert()、onJsConfirm()、onJsPrompt()方法回撥攔截JS對話方塊alert()、confirm()、prompt() 訊息
注意: js呼叫android時的安全性(addJavascriptInterface):
public static void keepsafe(WebView webView,boolean debugable){
if (Build.VERSION.SDK_INT > 10 &&Build.VERSION.SDK_INT < 17) {
webView.removeJavascriptInterface("searchBoxJavaBridge_");
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
WebView.setWebContentsDebuggingEnabled(debugable);
}
}
複製程式碼