首先呢 就是AndFix的依赖(大家都知道吧)
compile 'com.alipay.euler:andfix:0.5.0@aar'
然后呢,在Activity布局:我事先的效果图为
那么就粘一下布局吧
<Button android:id="@+id/btn_bug" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="BUG" /> <Button android:id="@+id/btn_fix" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="修复BUG" />
上代码
package com.exam.com.andfixdemo; import android.os.Bundle; import android.os.Environment; import android.support.v7.app.AppCompatActivity; import android.util.Log; import android.view.View; import android.widget.Button; import java.io.File; import java.io.IOException; public class MainActivity extends AppCompatActivity implements View.OnClickListener { private Button btnBUG; private Button btnFix; private String path = ""; private String patchName = "out.apatch"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); btnBUG = (Button) findViewById(R.id.btn_bug); btnFix = (Button) findViewById(R.id.btn_fix); //判断sd卡的挂载状态 if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){ File directory = Environment.getExternalStorageDirectory(); //得到绝对路径 String absolutePath = directory.getAbsolutePath(); //加载路径拼接 path = absolutePath.concat("/").concat(patchName); } btnBUG.setOnClickListener(this); btnFix.setOnClickListener(this); } @Override public void onClick(View v) { switch (v.getId()){ case R.id.btn_bug: creatBUG(); break; case R.id.btn_fix: fixBUG(); break; } } private void fixBUG() { File file = new File(path); //没有,则新创建一个 if(!file.exists()){ try { file.createNewFile(); } catch (IOException e) { } } AndFixMessage.getInstance().addPatch(path); } private void creatBUG() { String str = null;//old.apk其中要涉及到AndFix最主要的类AndFixMessageString str = "Hello World";//new.apk
str = str.substring(0,1); Log.e("TAG",str); }}
public class AndFixMessage { private static volatile AndFixMessage instance; private PatchManager patchManager; private AndFixMessage(){ } public static AndFixMessage getInstance(){ if(instance == null){ synchronized (AndFixMessage.class){ if(null == instance){ instance = new AndFixMessage(); } } } return instance; } /** * 初始化并加载补丁文件 * @param context */ public void initShow(Context context){ patchManager = new PatchManager(context); patchManager.init(VerSionUtils.getVerSion(context)); patchManager.loadPatch(); } /** * 添加补丁文件 * @param path */ public void addPatch(String path){ if(patchManager != null){ try { patchManager.addPatch(path); } catch (IOException e) { e.printStackTrace(); } } } }为了防止版本名称的改变,还要创建一个获取版本名称的类VerSionUtils
public class VerSionUtils { public static String getVerSion(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) { } return versionName; } }记的粘完代码后要打俩个包,一个是old.apk,另一个是new.apk,还有一个你打包的patch.jks文件
然后在黑框口中输入
apkpatch -f new.apk -t old.apk -o out.apatch -k patch.jks -p 123456 -a key0 -e 123456
就可以得到一个.apatch文件,将这个文件放入模拟器的文件管理中,重新运行old.apk,在点击修复BUG,就会发现不报错了