參考資料: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/Xposed的alibaba/dexposed;以方法hook,從Field切入的AndFix;Dex分包的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"/>