Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android熱修復之AndFix使用教程

Android熱修復之AndFix使用教程

編輯:關於Android編程

AndFix

全稱Android hot-fix,是alibaba的Android熱修復框架,支持Android 2.3到6.0的版本,支持arm與X86系統架構,支持Dalvik和ART Runtime。

原理

AndFix的原理就是方法的替換,把有bug的方法替換成補丁文件中的方法。

原理-替換方法.png

使用教程

1. 添加依賴和混淆

dependencies {
    compile 'com.alipay.euler:andfix:0.4.0@aar'
}

混淆:

-keep class * extends java.lang.annotation.Annotation
-keepclasseswithmembernames class * {
    native ;
}

2. 在Application.onCreate()中初始化PatchManager

public class AndFixApplication extends Application {

    public static PatchManager mPatchManager;

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

        // 初始化patch管理類
        mPatchManager = new PatchManager(this);

        // 初始化patch版本
        mPatchManager.init("1.0");
//        String appVersion = getPackageManager().getPackageInfo(getPackageName(), 0).versionName;
//        mPatchManager.init(appVersion);

        // 加載已經添加到PatchManager中的patch
        mPatchManager.loadPatch();

    }
}

3. 找個地方加載補丁,我們這裡為了演示,點擊按鈕進行加載補丁

    findViewById(R.id.main_btn).setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            update();
        }
    });
private static final String APATCH_PATH = "/fix.apatch"; // 補丁文件名
    private void update() {
        String patchFileStr = Environment.getExternalStorageDirectory().getAbsolutePath() + APATCH_PATH;
        try {
            AndFixApplication.mPatchManager.addPatch(patchFileStr);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

PatchManager的addPatch方法加載新補丁,項目中可以在下載補丁文件之後調用,這裡為了演示就把補丁文件放在本地的SD卡中了,代碼中patchFileStr就是補丁存放的位置,.apatch就是生成補丁文件的後綴名,fix就是補丁文件的名字,這裡我們將其名字寫死。
我們看一下打補丁之前MainActivity的所有代碼

public class MainActivity extends AppCompatActivity {

    private static final String APATCH_PATH = "/fix.apatch"; // 補丁文件名
    private TextView mainTv;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mainTv = (TextView) findViewById(R.id.main_tv);
        mainTv.setText("點擊Toast");
        mainTv.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                showToast();
            }
        });

        findViewById(R.id.main_btn).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                update();
            }
        });

    }

    private void showToast() {
        Toast.makeText(this, "打補丁之前", Toast.LENGTH_LONG).show();
    }

    /**
     * 動態更新,加載補丁文件
     * @author zehua_chen
     * create at 2016/8/3 14:35
     */
    private void update() {
        String patchFileStr = Environment.getExternalStorageDirectory().getAbsolutePath() + APATCH_PATH;
        try {
            AndFixApplication.mPatchManager.addPatch(patchFileStr);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

4. 我們將以上應用打包,我們命名為andfix_v1.0

andfix_v1.0.png


5. 修改MainActivity中的代碼,打包成andfix_v2.0

    private void showToast() {
        Toast.makeText(this, "打補丁之後", Toast.LENGTH_LONG).show();
    }
    mainTv.setText("加載了補丁之後");

上面代碼可知,我們只修改TextView的文字和TextView點擊之後的Toast內容,然後打包

andfix_v2.0.png


6. 使用官方提供的工具apkpatch生成.apatch補丁文件

點擊上面的鏈接下載apkpatch之後解壓

apkpatch.png

將兩個apk文件和該app的簽名文件放入到該目錄中<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4NCjxwPjxpbWcgYWx0PQ=="加入簽名文件和apk.png" src="/uploadfile/Collfiles/20160806/20160806091718975.png" title="\" />

使用命令生成.apatch補丁文件,先cmd進入該目錄

進人apkpatch目錄.png

使用命令生成補丁

生成補丁文件.png

上圖所示則表示補丁包生成完成
apkpatch.bat -f andfix_v2.0.apk -t andfix_v1.0.apk -o output -k AndFixKey.jks -p andfix -a andfix -e andfix

apkpatch.bat -f 新apk -t 舊apk -o 輸出目錄 -k app簽名文件 -p 簽名文件密碼 -a 簽名文件別名 -e 別名密碼

-f  :新apk
-t  : 舊apk
-o : 輸出目錄(補丁文件的存放目錄)
-k : 打包所用的keystore
-p : keystore的密碼
-a : keystore 用戶別名
-e : keystore 用戶別名密碼

生成的output文件:
生成的output文件.png

apatch補丁文件.png

將生成的.apatch補丁文件改成代碼中寫死的fix.apatch

改名成fix.apatch.png


7.運行andfix_v1.0查看修復之前的效果,把補丁文件push到sd卡目錄下, 點擊Button更新按鈕加載補丁文件,再看其效果,到這裡我們就完成了AndFix的熱修復了

打開File Explorer.png

push fix.apatch文件到sd卡中.png

運行andfix_v1.0沒有點擊動態更新按鈕,點擊TextView

打補丁之前.jpg

點擊動態更新Button之後再Toast,我們發現Tost的內容變了,但是TextView的內容沒換

動態更新再Toast.jpg

退出之後我們重新進入該應用就會發現TextView的內容也變化了。

打補丁之後,退出再重新進入.jpg

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved