您的位置:首页 > 移动开发 > Android开发

Android_AndFix支付宝热修复简单使用

2018-01-18 09:56 183 查看
AndFix的依赖:
compile 'com.alipay.euler:andfix:0.5.0@aar'AndFix的管理工具类package com.example.xsj.hotfile;

import android.content.Context;

import com.alipay.euler.andfix.patch.PatchManager;

import java.io.IOException;

/**
* Created by xsj on 2018/1/15.
*/

public class AndFixManager {
private static volatile AndFixManager instance;
private PatchManager patchManager;

public AndFixManager() {
}

public static AndFixManager getInstance(){
if(instance == null){
synchronized (AndFixManager.class){
if(null==instance){
instance=new AndFixManager();
}
}
}
return instance;
}

//初始化Andfix并加载补丁文件
public void initPath(Context context){
patchManager = new PatchManager(context);
patchManager.init(VersionUtil.getVersionName(context));
patchManager.loadPatch();
}

//添加补丁文件
public void addPatch(String path){
if(patchManager!=null){
try {
patchManager.addPatch(path);
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
AndFix需要初始化PatchManager类,需要版本号package com.example.xsj.hotfile;

import android.content.Context;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;

/**
* Created by xsj on 2018/1/15.
*/

public class VersionUtil {

public static String getVersionName(Context context){
//获取版本号
PackageManager packageManager = context.getPackageManager();
String versionName="1.0";
try {
PackageInfo packageInfo = packageManager.getPackageInfo(context.getPackageName(), 0);
versionName = packageInfo.versionName;
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
return versionName;
}
}
AndFix越早注册越好,所以在Appliction注册初始化package com.example.xsj.hotfile;

import android.app.Application;

/**
* Created by xsj on 2018/1/15.
*/

public class BaseAppliction extends Application{

@Override
public void onCreate() {
super.onCreate();

//初始化AndFix
initPath();
}

private void initPath() {
//这个初始化需要最早操作
AndFixManager.getInstance().initPath(this);
}

}
清单文件所需依赖
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"></uses-permission>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"></uses-permission>
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
清单文件注册Appliction
android:name=".BaseAppliction"
主代码文件,具有Bug的package com.example.xsj.hotfile;

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.Toast;

import java.io.File;
import java.io.IOException;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

//文件路径
private String path="";
//AndFix后缀名必须是apatch
private String pathName="out.apatch";

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

//获取本地路径
//判断挂载就是查询是否有sd卡
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){

//拿到绝对路径
File externalStorageDirectory = Environment.getExternalStorageDirectory();
String absolutePath = externalStorageDirectory.getAbsolutePath();

path=absolutePath.concat(File.separator).concat(pathName);

Log.e("TAG","补丁路径:"+path);

}

Button bug= (Button) findViewById(R.id.bug);
Button good= (Button) findViewById(R.id.good);

bug.setOnClickListener(this);
good.setOnClickListener(this);

}

@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.bug:
//有bug的
String str=null;
str=str.substring(0,1);
Log.e("TAG","BUG:"+str);
break;
case R.id.good:
fixBug();
break;
}
}

//修复的方法
private void fixBug() {
File file = new File(path);
if(!file.exists()){
try {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}

AndFixManager.getInstance().addPatch(path);
Toast.makeText(MainActivity.this,path+"",Toast.LENGTH_SHORT).show();
}
}
将拿到上线的apk,也就是有bug的apk。就是现在进行打包更名为old.apk然后更改项目中的bug
case R.id.bug:
//没有bug的
String str="hello word";
str=str.substring(0,1);
break;然后进行打包,获得没有bug的apk,更名为new.apk创建新文件夹,将AndFix的管理工具以及old.apk,new.apk,以及打包的签名文件放在一起。然后黑窗口进入该文件夹
在黑窗口操作以下代码,out.apatch为差异文件的文件夹名
apkpatch -f new.apk -t old.apk -o out.apatch -k 签名文件 -p 密码 -a 打包别名(key0) -e 别名密码然后会出现out.apatch文件,里面有一个apatch结尾的文件,将它放在Maintivity中设置的目录下。我的设置的查找文件名为out.apatch,所以,我将它更名为out.apatch。然后在老的APK中修复即可。githup路径:https://github.com/alibaba/AndFix
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: