AndFix 實現熱修復功能

參考資料:http://blog.csdn.net/qxs965266509/article/details/49802429php

              http://blog.csdn.net/yaya_soft/article/details/50460102java

              http://www.jianshu.com/p/479b8c7ec3e3android

              http://blog.hwangjr.com/2016/03/02/Android-HotFix%E6%96%B9%E6%A1%88/git

 

隨着開發需求的不斷迫切,目前開源已經涌現了不少Hot Fix項目,可是從方案上來講,主要是基於rovo89/Xposedalibaba/dexposed;以方法hook,從Field切入的AndFixDex分包Nuwa。而相同原理的不一樣實現有不少,這裏就再也不累贅。這三個實現原理大相徑庭,各有各自優缺點,讓咱們走近這幾個方案。github

本文只實現了AndFix來實現熱修復功能app

1.首先添加依賴關係ide

   compile ‘com.alipay.euler:andfix:0.3.1@aar’工具

2.而後在Application的onCreate方法中初始化AndFix(自定義BaseApplication,繼承Application) 測試

public class BaseApplication extends Application {
      private String appVersion;
      private PatchManager patchManager;
      private static final String APATCH_PATH = "/out.apatch";
      private String patchFile;
      @Override
      public void onCreate() {
          super.onCreate();
          try {
              appVersion = getApplicationContext().getPackageManager().
                      getPackageInfo(getPackageName(), 0).versionName;
          } catch (PackageManager.NameNotFoundException e) {
              e.printStackTrace();
          }
          // 初始化patch管理類
          patchManager = new PatchManager(this);
          // 初始化patch版本
          patchManager.init(appVersion);
          // 加載已經添加到PatchManager中的patch
          patchManager.loadPatch();
          try {
              //自動獲取路徑
              //patchFile = Environment.getExternalStorageDirectory()
              //.getAbsolutePath().concat(APATCH_PATH);
              //暫時寫固定路徑,測試用
              patchFile ="/sdcard" + APATCH_PATH;
              //添加到patch
              patchManager.addPatch(patchFile);
             } catch (IOException e) {
               e.printStackTrace();
          }
      }
   }
       

3.在須要的地方調用addPatch方法加載新補丁,如第2步,好比在下載補丁文件後調      用這個方法。this

4.修改有bug的地方,分別打出apk包,命名爲old.apk,new.apk以下:   

public class MainActivity extends AppCompatActivity {
    private TextView mTextView;

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

        mTextView = (TextView) findViewById(R.id.textview);
        mTextView.setText(R.string.old_name);
    }
}

此時 TextView顯示的字爲「這是old app」,打出一個包,更名字爲old.apk。

將MainActivity的修改成:
    public class MainActivity extends AppCompatActivity {
    private TextView mTextView;

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

        mTextView = (TextView) findViewById(R.id.textview);
        mTextView.setText(R.string.new_name);
    }
}

  

此時 TextView顯示的字爲「這是and_fix app」,打出一個包,更名字爲new.apk。

5.關鍵一步,生成apatch文件,也就是補丁文件,用到的是apkpatch-1.0.3工具,這這一步,要把第四步生成的兩個apk和簽名文件要放到apkpatch的同一文件夾下,如圖:

 

而後在終端運行命令:前提是已經定位到此目錄下,不然會報 commond not found

./apkpatch.sh -f new.apk -t old.apk -o ./ -k andfix.jks -p 1q2w3e4r -a 123456 -e 1q2w3e4r

 

說明: 

-f <new.apk> :新版本

-t <old.apk> : 舊版本

-o <output> : 輸出目錄

-k <keystore>: 打包所用的keystore

-p <password>: keystore的密碼

-a <alias>: keystore 用戶別名

-e <alias password>: keystore 用戶別名密碼

 

運行完命令後:

 

將後綴名爲.apatch的文件改下名字,爲out.apatch,而後拷貝到手機中的sd的根目錄下,從新安裝old.apk,就會看到頁面以下:

 

注意 !!前提要在Manifest中註冊相關權限

 <!-- 在SDCard中建立與刪除文件權限 -->

    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>

    <!-- 往SDCard寫入數據權限 -->

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

相關文章
相關標籤/搜索