Proxy Master v3.4.9版本的 MD5 值为:14d0aa2468d13530c8f6e96bcc114bf5

以下内容为反编译后的 JsCallJava.java 源代码,内容仅作参考


package com.just.agentweb;

import a.a;
import android.os.SystemClock;
import android.support.v4.media.c;
import android.text.TextUtils;
import android.webkit.WebView;
import com.google.android.exoplayer2.upstream.CmcdHeadersFactory;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Objects;
import o.h;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
public class JsCallJava {
    private static final String[] IGNORE_UNSAFE_METHODS = {"getClass", "hashCode", "notify", "notifyAll", "equals", "toString", "wait"};
    private static final String KEY_ARGS = "args";
    private static final String KEY_METHOD = "method";
    private static final String KEY_OBJ = "obj";
    private static final String KEY_TYPES = "types";
    private static final String MSG_PROMPT_HEADER = "AgentWeb:";
    private static final String RETURN_RESULT_FORMAT = "{\"CODE\": %d, \"result\": %s}";
    private static final String TAG = "JsCallJava";
    private Object mInterfaceObj;
    private String mInterfacedName;
    private HashMap<String, Method> mMethodsMap;
    private String mPreloadInterfaceJs;

    public JsCallJava(Object obj, String str) {
        try {
            if (TextUtils.isEmpty(str)) {
                throw new Exception("injected name can not be null");
            }
            this.mInterfaceObj = obj;
            this.mInterfacedName = str;
            this.mMethodsMap = new HashMap<>();
            Method[] methods = this.mInterfaceObj.getClass().getMethods();
            StringBuilder sb2 = new StringBuilder("javascript:(function(b){console.log(\"");
            sb2.append(this.mInterfacedName);
            sb2.append(" init begin\");var a={queue:[],callback:function(){var d=Array.prototype.slice.call(arguments,0);var c=d.shift();var e=d.shift();this.queue[c].apply(this,d);if(!e){delete this.queue[c]}}};");
            for (Method method : methods) {
                Objects.toString(method);
                String genJavaMethodSign = genJavaMethodSign(method);
                if (genJavaMethodSign != null) {
                    this.mMethodsMap.put(genJavaMethodSign, method);
                    sb2.append(String.format("a.%s=", method.getName()));
                }
            }
            sb2.append("function(){var f=Array.prototype.slice.call(arguments,0);if(f.length<1){throw\"");
            sb2.append(this.mInterfacedName);
            sb2.append(" call result, message:miss method name\"}var e=[];for(var h=1;h<f.length;h++){var c=f[h];var j=typeof c;e[e.length]=j;if(j==\"function\"){var d=a.queue.length;a.queue[d]=c;f[h]=d}}var k = new Date().getTime();var l = f.shift();var m=prompt('");
            sb2.append(MSG_PROMPT_HEADER);
            sb2.append("'+JSON.stringify(");
            sb2.append(promptMsgFormat("'" + this.mInterfacedName + "'", CmcdHeadersFactory.STREAM_TYPE_LIVE, "e", "f"));
            sb2.append("));console.log(\"invoke \"+l+\", time: \"+(new Date().getTime()-k));var g=JSON.parse(m);if(g.CODE!=200){throw\"");
            sb2.append(this.mInterfacedName);
            sb2.append(" call result, CODE:\"+g.CODE+\", message:\"+g.result}return g.result};Object.getOwnPropertyNames(a).forEach(function(d){var c=a[d];if(typeof c===\"function\"&&d!==\"callback\"){a[d]=function(){return c.apply(a,[d].concat(Array.prototype.slice.call(arguments,0)))}}});b.");
            sb2.append(this.mInterfacedName);
            sb2.append("=a;console.log(\"");
            sb2.append(this.mInterfacedName);
            sb2.append(" init end\")})(window)");
            this.mPreloadInterfaceJs = sb2.toString();
            sb2.setLength(0);
        } catch (Exception e10) {
            if (LogUtils.isDebug()) {
                e10.getMessage();
            }
        }
    }

    private String genJavaMethodSign(Method method) {
        StringBuilder b6;
        String str;
        String name = method.getName();
        Class<?>[] parameterTypes = method.getParameterTypes();
        for (String str2 : IGNORE_UNSAFE_METHODS) {
            if (str2.equals(name)) {
                LogUtils.isDebug();
                return null;
            }
        }
        for (Class<?> cls : parameterTypes) {
            if (cls == String.class) {
                b6 = h.b(name);
                str = "_S";
            } else if (cls == Integer.TYPE || cls == Long.TYPE || cls == Float.TYPE || cls == Double.TYPE) {
                b6 = h.b(name);
                str = "_N";
            } else if (cls == Boolean.TYPE) {
                b6 = h.b(name);
                str = "_B";
            } else if (cls == JSONObject.class) {
                b6 = h.b(name);
                str = "_O";
            } else if (cls == JsCallback.class) {
                b6 = h.b(name);
                str = "_F";
            } else {
                b6 = h.b(name);
                str = "_P";
            }
            b6.append(str);
            name = b6.toString();
        }
        return name;
    }

    public static String getInterfacedName(JSONObject jSONObject) {
        return jSONObject.optString(KEY_OBJ);
    }

    public static JSONObject getMsgJSONObject(String str) {
        try {
            return new JSONObject(str.substring(9));
        } catch (JSONException e10) {
            e10.printStackTrace();
            return new JSONObject();
        }
    }

    private String getReturn(JSONObject jSONObject, int i10, Object obj, long j10) {
        String format = String.format(RETURN_RESULT_FORMAT, Integer.valueOf(i10), obj == null ? "null" : obj instanceof String ? "\"".concat(String.valueOf(((String) obj).replace("\"", "\\\""))).concat("\"") : String.valueOf(obj));
        if (LogUtils.isDebug()) {
            SystemClock.uptimeMillis();
            Objects.toString(jSONObject);
        }
        return format;
    }

    public static boolean isSafeWebViewCallMsg(String str) {
        return str.startsWith(MSG_PROMPT_HEADER);
    }

    private static String promptMsgFormat(String str, String str2, String str3, String str4) {
        return a.r(c.s("{obj:", str, ",method:", str2, ",types:"), str3, ",args:", str4, "}");
    }

    public String call(WebView webView, JSONObject jSONObject) {
        StringBuilder sb2;
        String sb3;
        int i10;
        long uptimeMillis = LogUtils.isDebug() ? SystemClock.uptimeMillis() : 0L;
        if (jSONObject != null) {
            try {
                String string = jSONObject.getString("method");
                JSONArray jSONArray = jSONObject.getJSONArray(KEY_TYPES);
                JSONArray jSONArray2 = jSONObject.getJSONArray(KEY_ARGS);
                int length = jSONArray.length();
                Object[] objArr = new Object[length];
                int i11 = 0;
                for (int i12 = 0; i12 < length; i12++) {
                    String optString = jSONArray.optString(i12);
                    Object obj = null;
                    if ("string".equals(optString)) {
                        string = string + "_S";
                        if (!jSONArray2.isNull(i12)) {
                            obj = jSONArray2.getString(i12);
                        }
                        objArr[i12] = obj;
                    } else if ("number".equals(optString)) {
                        string = string + "_N";
                        i11 = (i11 * 10) + i12 + 1;
                    } else if ("boolean".equals(optString)) {
                        string = string + "_B";
                        objArr[i12] = Boolean.valueOf(jSONArray2.getBoolean(i12));
                    } else if ("object".equals(optString)) {
                        string = string + "_O";
                        if (!jSONArray2.isNull(i12)) {
                            obj = jSONArray2.getJSONObject(i12);
                        }
                        objArr[i12] = obj;
                    } else if ("function".equals(optString)) {
                        string = string + "_F";
                        objArr[i12] = new JsCallback(webView, this.mInterfacedName, jSONArray2.getInt(i12));
                    } else {
                        string = string + "_P";
                    }
                }
                Method method = this.mMethodsMap.get(string);
                if (method == null) {
                    return getReturn(jSONObject, 500, "not found method(" + string + ") with valid parameters", uptimeMillis);
                }
                if (i11 > 0) {
                    Class<?>[] parameterTypes = method.getParameterTypes();
                    while (i11 > 0) {
                        int i13 = (i11 - ((i11 / 10) * 10)) - 1;
                        Class<?> cls = parameterTypes[i13];
                        if (cls == Integer.TYPE) {
                            objArr[i13] = Integer.valueOf(jSONArray2.getInt(i13));
                        } else if (cls == Long.TYPE) {
                            objArr[i13] = Long.valueOf(Long.parseLong(jSONArray2.getString(i13)));
                        } else {
                            objArr[i13] = Double.valueOf(jSONArray2.getDouble(i13));
                        }
                        i11 /= 10;
                    }
                }
                return getReturn(jSONObject, 200, method.invoke(this.mInterfaceObj, objArr), uptimeMillis);
            } catch (Exception e10) {
                e = e10;
                LogUtils.safeCheckCrash(TAG, "call", e);
                if (e.getCause() != null) {
                    sb2 = new StringBuilder("method execute result:");
                    e = e.getCause();
                } else {
                    sb2 = new StringBuilder("method execute result:");
                }
                sb2.append(e.getMessage());
                sb3 = sb2.toString();
                i10 = 500;
            }
        } else {
            i10 = 500;
            sb3 = "call data empty";
        }
        return getReturn(jSONObject, i10, sb3, uptimeMillis);
    }

    public String getPreloadInterfaceJs() {
        return this.mPreloadInterfaceJs;
    }
}