AndFix热修复文档
AndFix只能用来更改带有Bug的某个方法,还是有很大限制的.
在ManiFest中
首先,配置好热修复环境:
implementation 'com.alipay.euler:andfix:0.5.0@aar'
加完依赖:Sync New 此依赖前缀是Studio3.0的更改
在此就把SD卡权限添加上:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
配置完之后,创建我们的AndFix执行热修复的执行器(管理者):
public class AndFixManager { private static volatile AndFixManager andFixManager; private PatchManager patchManager; public AndFixManager() { } public static AndFixManager getInstence(){ if(null==andFixManager){ synchronized (AndFixManager.class){ if(andFixManager == null){ andFixManager = new AndFixManager(); } } } return andFixManager; } public void initFace(Context context){ //执行热修复的方法 patchManager = new PatchManager(context); patchManager.init(VersonUtil.getVerson(context));//获取版本号 patchManager.loadPatch(); } public void addPath(String path){//点击修复Bug,AndFix执行器存在的话,需要执行修复操作,添加补丁路径,之后会自动修复. if(patchManager != null){ try { patchManager.addPatch(path); } catch (IOException e) { e.printStackTrace(); } } } }
获取版本号的工具类:在AndFix执行器中需要用到.
public class VersonUtil { public static String getVerson(Context context){ String versionName = "1.0"; PackageManager packageManager = context.getPackageManager(); try { PackageInfo packageInfo = packageManager.getPackageInfo(context.getPackageName(),0); versionName = packageInfo.versionName; } catch (PackageManager.NameNotFoundException e) { e.printStackTrace(); } return versionName; } }
在这里:需要在Manifest中配置Applocation了,就是配置AndFix执行器执行的修复操作,这个initFace()方法必须在App启动之后的第一执行的操作.
public class AppLocations extends Application { @Override public void onCreate() { super.onCreate(); AndFixManager.getInstence().initFace(this); } }
MainActivity中执行最终修复:
public class MainActivity extends AppCompatActivity implements View.OnClickListener{ private Button btnBug; private Button btnNew; private String path = ""; //补丁路径 private String pathName = "out.apatch"; //这是我们补丁文件名 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); btnBug = findViewById(R.id.btn_bug); btnNew = findViewById(R.id.btn_new); btnBug.setOnClickListener(this); btnNew.setOnClickListener(this); //判断SD卡 if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){ File file = Environment.getExternalStorageDirectory(); String absalutePath = file.getAbsolutePath(); path = absalutePath.concat(File.separator).concat(pathName); } } @Override public void onClick(View view) { switch (view.getId()){case R . id . btn_bug : //int k = 2/0; //Bugint k = 2/1; break; case R.id.btn_new: fixBug(); break; } } private void fixBug() { File f = new File(path); if(!f.exists()){ try { f.createNewFile(); } catch (IOException e) { e.printStackTrace(); } } AndFixManager.getInstence().addPath(path); //把补丁路径添加到AndFix热修复的执行器中,之后会自动执行修复操作 } }
最后生成APK包,Bug包和HotFix包,jks密钥文件,在黑窗口执行dos命令操作,生成补丁包
命令:
apkpatch.sh -f new.apk -t old.apk -o apatch-k hotfixjks.jks -p 123456 -a key0 -e 123456
工具文件 HotFixAKP BugApk jks密钥 密码 密钥编号 密钥
apatch是生成的补丁包放入哪个文件夹中,会自动生成到当前目录下.
最后安装BugApk,修复,OK.
工具就不提供了,这些只是思路,看看就行了.