Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android 開發之AndFix

Android 開發之AndFix

編輯:關於Android編程

阿裡巴巴開源項目,地址:https://github.com/alibaba/AndFix

\

tools裡面有我們需要的工具,docs是一些文檔介紹。AndFix解決在線修復bug,而不是重新發布新版本apk,AndFix支持Android版本從2.3到6.0。我們從下圖來了解一下實現原理

修復過程示意圖<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4NCjxwPjxpbWcgYWx0PQ=="" src="/uploadfile/Collfiles/20160423/20160423090417299.png" title="\" />

我們該如何使用這個庫呢?首先要添加依賴

//.........Maven 方式...........

    com.alipay.euler
    andfix
    0.4.0
    aar


//..............Gradle方式..................
dependencies {
    compile 'com.alipay.euler:andfix:0.4.0@aar'
}

接著我們得在Application裡面初始化PatchManager,並提供兩個方法:打補丁、移除所有補丁(發布版本更新需要移除無用的補丁),具體代碼如下:


/**
 * Created by idea on 2016/4/21.
 */
public class MyApplication extends Application {

    protected PatchManager patchManager;

    @Override
    public void onCreate() {
        super.onCreate();
        patchManager = new PatchManager(this);
        patchManager.init(getAppVersion());
        patchManager.loadPatch();
    }

    /**
     * 獲取系統當前版本號,默認1.0
     *
     * @return
     */
    private String getAppVersion() {
        try {
            PackageManager manager = getPackageManager();
            PackageInfo info = manager.getPackageInfo(getPackageName(), 0);
            String version = info.versionName;
            return version;
        } catch (Exception e) {
            e.printStackTrace();
            return "1.0";
        }
    }

    /**
     * 熱修復打補丁,根據版本信息與服務器匹配下載補丁文件到手機,並記錄路徑和版本號,配合加載補丁
     * @param path
     */
    public void addPatch(String path) {
        try {
            patchManager.addPatch(path);//path of the patch file that was downloaded
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 安裝新版本APK需要調用該方法
     */
    public void removeAllPatch() {
        //刪除所有已加載的patch文件
        patchManager.removeAllPatch();
    }
}

具體怎麼運用到實際開發中呢,進過一番思考寫下了這麼一個概要,稍後准備工作完成後我們來寫一個demo實踐

/**
 * Created by idea on 2016/4/21.
 */
public class HotFix {

    private boolean isRemovePatch = true;

    private String patchVersion;

    private String apkVersion;

    private String updateAPKUrl;

    private String updatePatchUrl;

    private boolean isUpdateAPK;

    private boolean isUpdatePatch;


    public void onUpdateAPKWithHotFix(String apkVersion, String patchVersion, OnUpdateAPKListener onUpdateAPKListener){

    }

    interface OnUpdateAPKListener{

        void onResponse(HotFix hotFix);
    }

}

以上代碼稍後實踐,tools文件下 apkpatch-1.0.3 工具的使用可以在命令行切換到解壓目錄下,輸入apkpatch查看,如下圖

\

簡單對這些命令說明一下

apkpatch -f  -t  -o -k  -p <***> -a  -e <***>

-f  :新版本apk
-t  : 舊版本apk
-o : 輸出目錄
-k : 打包所用的keystore
-p <***>: keystore的密碼
-a : keystore 用戶別名
-e <***>: keystore 用戶別名密碼

簡單的測試一下工具的使用:TextView賦值的bug修復(不為null),第一個版本 (簽名打包一個old.apk)


public class MainActivity extends BaseActivity {

    private String content = "null";

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }

    @Bind(R.id.hotFix_TextView)
    TextView hotFixTextView;

    @Override
    public int getLayoutResId() {
        return R.layout.activity_main;
    }

    @Override
    protected void initialView() {
        super.initialView();
        hotFixTextView.setText(getContent());
    }
}

這裡留的bug content==null 賦值現實問題,修復bug代碼修改如下:(重新打包生成new.apk)

  private String content = "null";

    public String getContent() {
        if(content == null || content.equals("null")){
            return "未知";
        }else{
            return content;
        }
    }

使用工具生成.apatch文件

\

在進行demo編寫之前,我們先對其業務邏輯進行分析,得出下圖

接口設計請求參數:

接口響應值Data:

正式的開發中應該是按照上面這個流程來的,但是為了方便我們demo就直接把.apatch文件放入sdcard,直接模擬請求實現熱修復,下面是相關源碼下載地址:http://download.csdn.net/detail/analyzesystem/9499245;把.apatch文件放入指定位置即可。(開發集成一定不要忘記添加讀寫權限),下圖是實現效果圖:

\

朋友告訴我這個庫熱修復會有很多問題,在很多手機上有bug,不過這不是我現在關心的問題,實踐成功了待以後開發應用中遇到再說。如果你們誰有遇到bug坑,還請留言,以便於累計少踩坑。

Dexposed

貌似又是阿裡巴巴的,項目地址:https://github.com/alibaba/dexposed

項目集成依賴可選直接添加到您的項目dexposed AAR編譯的庫,它包含一個jar文件”dexposedbridge .jar,兩libdexposed.so libdexposed_l.so文件,gradle依賴如下:

 dependencies {
        compile 'com.taobao.android:dexposed:0.1.1@aar'
    }

將下面一行插入到你的應用程序的初始化

 public class MyApplication extends Application {

        @Override public void onCreate() {        
            // 檢查當前設備是否支持該庫
            if (DexposedBridge.canDexposed(this)) {
                // 使用Dexposed啟動AOP

            }
        }
        ...
    }

dexposed Dalvik運行ARM架構支持所有設備從Android 2.3到4.4(不包括3),然而在我查詢了一些資料後,特別是看了http://pcedu.pconline.com.cn/484/4841077.html這篇文章後,放棄了對該庫的深入了解,需要root權限在某些定制機上還需要定制版,開發還需要走各種分支,簡直就是不能忍受!!這個時代不屬於它了。HotFix、Nuwa、DroidFix、DynamicAPK、AndHotFix、AndFixx也粗略過了一遍,集成來說還是AndFix方便點

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