热修复框架有很多 其中AndFix使用很简单 但局限性很高,只能修复方法 不过可以及时修复不需要退出程序
一:使用前的准备
compile 'com.alipay.euler:andfix:0.5.0@aar'
二:初始化的时候用到了版本号 写一个提供版本号的工具类
public class VersionUtils {
public static String getVersionName(Context context) {
String versionName = "";
PackageManager packageManager = context.getPackageManager();
String packageName = context.getPackageName();
try {
PackageInfo packageInfo = packageManager.getPackageInfo(packageName,0);
versionName = packageInfo.versionName;
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
return versionName;
}
}
三:AndFix工具类 用来封装初始化与添加补丁文件
public class AndFixManger {
private static volatile AndFixManger instance;
private PatchManager patchManager;
private AndFixManger() {
}
public static AndFixManger getInstance() {
if (instance == null) {
synchronized (AndFixManger.class) {
if (instance == null) {
instance = new AndFixManger();
}
}
}
return instance;
}
//初始化,越早调用越好 推荐Application的oncreat方法中调用
public void initPatch(Context context) {
//创建对象
patchManager = new PatchManager(context);
//传入了版本号
patchManager.init(VersionUtils.getVersionName(context));
patchManager.loadPatch();
}
//添加补丁文件 修复时调用
public void addPatch(String path){
if(patchManager!=null){
try {
patchManager.addPatch(path);
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
四:App中调用初始化方法
public class App extends Application{
@Override
public void onCreate() {
super.onCreate();
AndFixManger.getInstance().initPatch(this);
}
}
五:主页面代码操作
public class MainActivity extends AppCompatActivity {
private Button bug;
private Button fix;
private String path;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//获取id
bug = (Button)findViewById(R.id.bug);
fix = (Button)findViewById(R.id.fix);
//判断sd卡的挂载状态
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
//设置补丁包的路径
path = Environment.getExternalStorageDirectory().getAbsolutePath().concat("/out.apatch");
}
Log.i("TAG",path);
//写了一个bug
bug.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String str = "this is one a ";
str.substring(0,1);
}
});
//点击添加补丁文件修复bug
fix.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
File file = new File(path);
//判断文件是否存在
if(!file.exists()){
try {
//不存在创建
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
//调用添加补丁文件的方法
AndFixManger.getInstance().addPatch(path);
}
});
}
}
问题来了,补丁文件是怎么来的?
一:新建一个文件夹 随便建在哪里都可以
二:文件夹中放入工具解压文件 1:apkpatch.bat 2:apkpatch.sh 3:apkpatch-1.0.3.jar 不用管是干什么的,放进去就可以
三:签名打包 放入一个有bug的包与没有bug的包 , 还需要放入一个签名文件.jks 项目中可以找到 签名之后才可以找到
四:开始生成
打开黑窗口 windows+r 输入cmd
进入自己创建的文件夹中 输入命令
例如:
Microsoft Windows [版本 10.0.10586]
(c) 2015 Microsoft Corporation。保留所有权利。
C:\Users\Administrator>D:
D:\>cd D:\AndFix\
D:\AndFix>
输入命令
apkpatch -f <new> -t <old> -o <output> -k <keystore> -p <***> -a <alias> -e <***>
new = 没有bug的文件名
old = 有bug的文件名
output = 生成的补丁文件名
keystore = .jks文件名
第一个*** 签名密码
alias = key0 这里我是key0 签名的时候写的啥就写啥
第二个*** key0密码
回车 回车 两次
补丁包就生成了,把补丁包放入手机或者模拟器中 放入的路径和上面的路径需要一样
运行有问题的app,点击修复添加补丁文件,bug就修复了