Meituan-Dianping / Robust

Robust is an Android HotFix solution with high compatibility and high stability. Robust can fix bugs immediately without a reboot.
Apache License 2.0
4.4k stars 805 forks source link

热修复后导致数据库执行变慢 #404

Open CallBackMe opened 4 years ago

CallBackMe commented 4 years ago

异常类型:热修复完成,执行速度度变慢

手机型号:小米6

手机系统版本:如:Android 8.0

Robust版本:0.4.99

Gradle版本:3.4.1

系统:mac

现在app有数据导入的操作,出现问题。 没有打补丁包之前需要5秒左右能够执行完成, 打了补丁之后需要29秒左右完成导入。

现在测试热修复后,导致数据库执行变慢了。

以下是执行函数:

private static final int MAX_COUNT_6 = 200;
/**
 * eg: replace into test_tbl (id,dr) values (1,'2'),(2,'3'),...(x,'y');
 * 插入数据合成组装后,再插入数据
 * @param table  表名
 * @param list   需要修改的内容
 * @return       是否成功
 */
public boolean repaceResSynthetic(String table, String[][] list) {
    boolean isSuccess = false;
    try {
        StringBuilder mSqlBuffer = new StringBuilder();
        //添加表名
        mSqlBuffer.append("REPLACE INTO ");
        mSqlBuffer.append(table);
        //添加key
        for (int k = 0; k < list[0].length; k++) {
            if(k == 0){
                mSqlBuffer.append("(");
            }
            //key
            mSqlBuffer.append(list[0][k]);

            if(k == (list[0].length-1)){
                mSqlBuffer.append(")");
            }else{
                mSqlBuffer.append(",");
            }
        }
        //添加values
        mSqlBuffer.append("values");
        //表名参数字符串
        String baseSql = mSqlBuffer.toString();
        Log.e("xxx"," +++++++++++++++++  repaceResSynthetic baseSql = " + baseSql);
        //添加values
        List<String> sqlList = new ArrayList<>();
        StringBuffer valuesBuffer = new StringBuffer();
        valuesBuffer.append(baseSql);
        for (int i = 1; i < list.length; i++) {
            for (int j = 0; j < list[0].length; j++) {
                if(j == 0){
                    valuesBuffer.append("(");
                }
                //value
                String value = list[i][j];
                if(TextUtils.isEmpty(value)){
                    valuesBuffer.append("\"\"");
                }else {
                    valuesBuffer.append("\"" + value + "\"");
                }

                if(j == (list[0].length-1)){
                    valuesBuffer.append(")");
                }else{
                    valuesBuffer.append(",");
                }
            }

            if(i%MAX_COUNT_6 == 0){
                String sqlString = valuesBuffer.toString();
                sqlList.add(sqlString);
                if(i < (list.length-1)){
                    valuesBuffer = new StringBuffer();
                    valuesBuffer.append(baseSql);
                }
            }else {
                if(i < (list.length-1)){
                    valuesBuffer.append(",");
                }
            }
        }
        String sqlString = valuesBuffer.toString();
        sqlList.add(sqlString);
        SqlRequest[] sqlRequests = new SqlRequest[sqlList.size()];
        for (int i = 0; i < sqlList.size(); i++) {
            sqlRequests[i] = new SqlRequest(sqlList.get(i), null);
        }
        isSuccess = opration.execSqls(sqlRequests);
        Log.e("xxx"," +++++++++++++++++  repaceResSynthetic  isSuccess = " + isSuccess);
    } catch (Exception e) {
        e.printStackTrace();
    }
    return isSuccess;
}
CallBackMe commented 4 years ago

进一步确定,拼接sql的2个for循环耗时比较长 !当然后执行sql也会比没有修复之前慢一点。Robust会影响执行速度吗 ?

hedex commented 3 years ago

可能是这个函数体被挪到了一个单独的补丁dex里面,相比于原始apk的dex,可能是新补丁dex的加载速度和反射指令导致的比原始dex的执行慢