Android_热修复之AndFix

一: 热修复框架有很多   其中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();
            }
        }
    }

}
//添加补丁文件时需要传入一个path路径   这个路径就是 .apatch补丁文件

public class MainActivity extends AppCompatActivity {

    private Button fix;
    private String path;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
	//获取id
        fix = (Button)findViewById(R.id.fix);
	//判断sd卡的挂载状态
        if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
             path = Environment.getExternalStorageDirectory().getAbsolutePath().concat("/out.apatch");
        }
	//打印path路径
        Log.i("TAG",path);
	//点击添加补丁
        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();
                    }
                }
		//调用AndFix工具类中的添加补丁方法
                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  -t  -o  -k  -p <***> -a  -e <***>

       new  =  没有bug的文件名
       
       old   =  有bug的文件名

       output  =  生成的补丁文件名

       keystore  =  .jks文件名   

       第一个***   签名密码

       alias  =  key0  这里我是key0   签名的时候写的啥就写啥 

       第二个***   key0密码

       回车  回车  两次

       补丁包就生成了,把补丁包放入手机或者模拟器中   放入的路径和上面的路径需要一样   
       
       运行有问题的app,点击修复添加补丁文件,bug就修复了










你可能感兴趣的:(Android_热修复之AndFix)