Open Baifann opened 7 years ago
MainActivity.onCreate(android.os.Bundle) haven't insert code by Robust.Cannot patch this method,
这个方法没有插桩 可以看看你的robust.xml的配置吗?为什么没有插桩呢?
robust.xml如下
<?xml version="1.0" encoding="utf-8"?>
<resources>
<switch>
<!--true代表打开Robust,请注意即使这个值为true,Robust也默认只在Release模式下开启-->
<!--false代表关闭Robust,无论是Debug还是Release模式都不会运行robust-->
<turnOnRobust>true</turnOnRobust>
<!--<turnOnRobust>false</turnOnRobust>-->
<!--是否开启手动模式,手动模式会去寻找配置项patchPackname包名下的所有类,自动的处理混淆,然后把patchPackname包名下的所有类制作成补丁-->
<!--这个开关只是把配置项patchPackname包名下的所有类制作成补丁,适用于特殊情况,一般不会遇到-->
<!--<manual>true</manual>-->
<manual>false</manual>
<!--是否强制插入插入代码,Robust默认在debug模式下是关闭的,开启这个选项为true会在debug下插入代码-->
<!--但是当配置项turnOnRobust是false时,这个配置项不会生效-->
<!--<forceInsert>true</forceInsert>-->
<forceInsert>false</forceInsert>
<!--是否捕获补丁中所有异常,建议上线的时候这个开关的值为true,测试的时候为false-->
<catchReflectException>true</catchReflectException>
<!--<catchReflectException>false</catchReflectException>-->
<!--是否在补丁加上log,建议上线的时候这个开关的值为false,测试的时候为true-->
<!--<patchLog>true</patchLog>-->
<patchLog>true</patchLog>
<!--项目是否支持progaurd-->
<proguard>true</proguard>
<!--<proguard>false</proguard>-->
<!--项目是否支持ASM进行插桩,默认使用ASM,推荐使用ASM,Javaassist在容易和其他字节码工具相互干扰-->
<useAsm>true</useAsm>
<!--<useAsm>false</useAsm>-->
</switch>
<!--需要热补的包名或者类名,这些包名下的所有类都被会插入代码-->
<!--这个配置项是各个APP需要自行配置,就是你们App里面你们自己代码的包名,
这些包名下的类会被Robust插入代码,没有被Robust插入代码的类Robust是无法修复的-->
<packname name="hotfixPackage">
<!--<name>com.meituan</name>-->
<!--<name>com.sankuai</name>-->
<!--<name>com.dianping</name>-->
<name>cn.nfcm.rebusthitfixdemo</name>
</packname>
<!--不需要Robust插入代码的包名,Robust库不需要插入代码,如下的配置项请保留,还可以根据各个APP的情况执行添加-->
<exceptPackname name="exceptPackage">
<name>com.meituan.robust</name>
<name>com.meituan.sample.extension</name>
</exceptPackname>
<!--补丁的包名,请保持和类PatchManipulateImp中fetchPatchList方法中设置的补丁类名保持一致( setPatchesInfoImplClassFullName("com.meituan.robust.patch.PatchesInfoImpl")),
各个App可以独立定制,需要确保的是setPatchesInfoImplClassFullName设置的包名是如下的配置项,类名必须是:PatchesInfoImpl-->
<patchPackname name="patchPackname">
<!--<name>com.meituan.robust.patch</name>-->
<name>cn.nfcm.rebusthitfixdemo</name>
</patchPackname>
<!--自动化补丁中,不需要反射处理的类,这个配置项慎重选择-->
<noNeedReflectClass name="classes no need to reflect">
</noNeedReflectClass>
</resources>
另外这是我的MainActivity.java
package cn.nfcm.rebusthitfixdemo;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import com.meituan.robust.Patch;
import com.meituan.robust.PatchExecutor;
import com.meituan.robust.RobustCallBack;
import com.meituan.robust.patch.annotaion.Add;
import com.meituan.robust.patch.annotaion.Modify;
import java.io.File;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private Button mBtnLoadPatch;
private Button mBtnLoadText;
private TextView mTvInfo;
private final static String TAG = "MainActivity";
@Modify
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mBtnLoadPatch = (Button) findViewById(R.id.btn_patch);
mBtnLoadText = (Button) findViewById(R.id.btn_text);
mTvInfo = (TextView) findViewById(R.id.tv_info);
mBtnLoadPatch.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
loadPath();
}
});
mBtnLoadText.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mTvInfo.setText(getString1());
}
});
}
private String getString() {
return "呵呵哒";
}
@Add
private String getString1() {
return "呵呵哒 hehehe";
}
private void loadPath() {
Patch patch = new Patch();
patch.setLocalPath(Environment.getExternalStorageDirectory().getAbsolutePath()
+ "/robust/patch");
File file = new File(patch.getLocalPath());
Log.i(TAG, "文件路径:" + file.getAbsolutePath());
if (file.exists()) {
Log.i(TAG, "文件存在");
} else {
Log.i(TAG, "文件不存在");
}
Log.i(TAG, "loadPath");
new PatchExecutor(getApplicationContext(), new PatchManipulateImp(), new RobustCallBack() {
@Override
public void onPatchListFetched(boolean result, boolean isNet, List<Patch> patches) {
Log.i(TAG, "onPatchListFetched result:" + result);
}
@Override
public void onPatchFetched(boolean result, boolean isNet, Patch patch) {
Log.i(TAG, "onPatchFetched result:" + result);
}
@Override
public void onPatchApplied(boolean result, Patch patch) {
Log.i(TAG, "onPatchApplied result:" + result);
}
@Override
public void logNotify(String log, String where) {
Log.i(TAG, "logNotify log:" + log);
}
@Override
public void exceptionNotify(Throwable throwable, String where) {
Log.i(TAG, "exceptionNotify log:" + where);
}
}).start();
}
}
你是在debug下面执行的?请在release下执行哈
我是在release下面执行的....
同样的问题 找到原因了么
我也是同样的问题, :app:transformClassesWithAutoPatchTransformForRelease FAILED
FAILURE: Build failed with an exception.
java.lang.reflect.UndeclaredThrowableException (no error message)
robust目录下只生成了dx.jar 、baksmali-2.1.2.jar 、smali-2.1.2.jar三个文件,并没有生成patch.jar patch.dex
解决了吗?今天也在搞这个,也是到了这一步出现这个问题
同样的问题。。。~
重新同步一下就好了。。。。
大家有解决这个问题吗,我也遇到了,求解
@iwantthink 请问具体是怎么解决的?我一直报这个错,尝试了很多办法都不行。
遇到了同样的问题,请问解决了吗?
+1
FAILURE: Build failed with an exception.
java.lang.reflect.UndeclaredThrowableException (no error message)
+1,也遇到了这个问题。robust.xml文件中有配置,修复的方法也并不都是只存在赋值语句
异常类型:编译异常
Robust版本:0.4.7
Gradle版本:2.2.3
系统:Mac
堆栈/日志:
日志报错日下
前几次编译还好好的,后面突然就这样了