安卓熱修複之AndFIX

來源:互聯網
上載者:User

標籤:其他   按鈕   mod   lang   ini   欄位   類比   時間   文字   

我致力於最新的前沿安卓技術分析和使用教學,不打算將很多很深的東西,因為有多少人願意沉下你的心境去學習痛點?我一般只會簡單提及.文字錯漏在所難免還希望同學們喜歡

熱修複介紹

熱修複是什麼? 如果你一個項目已經上線,出現了嚴重缺陷,那麼你第一反應是推送新版本.那麼問題來.老子剛下你的APP 你就叫我重新下載?啥東西!卸了.從而導致使用者流量的減退.而熱修複就是推送一個補丁檔案到用戶端(很小),使用者開啟應用時自動安裝.是不是很棒?

AndFix 熱修複原理

已經翻譯的源碼分析

阿里github官網(英文)

推薦自行看官網
如果時間上允許我會幫大家翻譯完整版的

AndFix注意的地方
  1. 不支援添加欄位 方法 資源 布局修改 類
  2. 雖然不支援添加欄位 但是你可以在方法內添加 局部變數(後面解釋)

錯誤:
1. 如果添加了在產生補丁包會有如下錯誤(大家先看看不需要Crowdsourced Security Testing道怎麼產生,後面闡述)

成功:
仔細看 上面的文字會有什麼add modifie(添加修改) com.xxx(你修改的檔案)

AndFix使用
  1. 首先添加依賴

    dependencies {        compile ‘com.alipay.euler:andfix:0.5.0@aar‘}
  2. 初始化 一般在application的實作類別
    我們首先建立一個類繼承之 application 然後在oncreat方法初始化,
    我先介紹幾個API:

    此API返回你的應用版本名()
    java
    String appversion; appversion=getPackageManager().getPackageInfo(getPackageName(),0).ersionName;

    再來看個依賴包的類PatchManager

     public PatchManager patchManager ;

    此類有如下幾個方法

    參數為上下文 一般都在application中

    patchManager = new PatchManager(this);
        初始化 這裡傳入的是版本名 可以用上面介紹的一個api填入 也可以直接寫死
     patchManager.init("1.0"); patchManager.init(versionName);

    初始化載入補丁 (你直接當寫死就行一般預設在new出來並初始版本後調用.這裡還是不真正的載入方法)

      patchManager.loadPatch();

    打入補丁 參數為字串 打入後生效 路徑你隨意寫 檔案名稱也是一樣
    addPatch(你的補丁路徑)
    //移除補丁路徑
    patchManager.removeAllPatch();

    String path = Environment.getExternalStorageDirectory().getAbsoluteFile() + File.separator + "out.apatch";        File file = new File(path);        if (file.exists()){            Log.e("fmy","檔案存在");            try {                patchManager.addPatch(path);                patchManager.removeAllPatch();                Log.e("fmy","熱修複成功");            } catch (IOException e) {                Log.e("fmy","熱修複失敗:"+e.getMessage());            }        }else{            Log.e("fmy","檔案不存在");        }

    完整代碼:

    package com.example.administrator.myapplication;import android.app.Application;import android.os.Environment;import android.util.Log;import com.alipay.euler.andfix.patch.PatchManager;import java.io.File;import java.io.IOException;/** * Created by Administrator on 2016/11/9. */public class MainAppliacation extends Application {    public PatchManager patchManager ;    private String path;    @Override    public void onCreate() {        super.onCreate();        patchManager = new PatchManager(this);        patchManager.init("1.0");        patchManager.loadPatch();        path = Environment.getExternalStorageDirectory().getAbsoluteFile() + File.separator + "out.apatch";        File file = new File(path);        if (file.exists()){            Log.e("fmy","檔案存在");            try {                patchManager.addPatch(path);                patchManager.removeAllPatch();                Log.e("fmy","熱修複成功");            } catch (IOException e) {                Log.e("fmy","熱修複失敗:"+e.getMessage());            }        }else{            Log.e("fmy","檔案不存在");        }    }}
  3. 添加許可權和把我們自訂application關聯上
    許可權:

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

    //關聯我們自訂application類

     <application        android:name=".MainAppliacation"        ....

    完整資訊清單檔:

    <?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"    package="com.example.administrator.myapplication">    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />    <application        android:name=".MainAppliacation"        android:allowBackup="true"        android:icon="@mipmap/ic_launcher"        android:label="@string/app_name"        android:supportsRtl="true"        android:theme="@style/AppTheme">        <activity android:name=".MainActivity">            <intent-filter>                <action android:name="android.intent.action.MAIN" />                <category android:name="android.intent.category.LAUNCHER" />            </intent-filter>        </activity>    </application></manifest>
  4. 產生新舊版本的兩個已經簽名的APK(簽名需一樣)
    假設我們原本的apk 兩個類 一個是activity 類 和一個我們自訂的application類(上面已經說了)

    我們看看activity 檔案

    package com.example.administrator.myapplication;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.View;import android.widget.Toast;public class MainActivity extends AppCompatActivity {    String name ="你好";    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);    }    //一個按鈕的點擊事件    public void onClick(View view) {        Toast.makeText(this, name, Toast.LENGTH_SHORT).show();    }}

    看下布局檔案吧

    <?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:id="@+id/activity_main"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:paddingBottom="@dimen/activity_vertical_margin"    android:paddingLeft="@dimen/activity_horizontal_margin"    android:paddingRight="@dimen/activity_horizontal_margin"    android:paddingTop="@dimen/activity_vertical_margin"    tools:context="com.example.administrator.myapplication.MainActivity">    <Button        android:onClick="onClick"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="看看熱修複是否成功" /></RelativeLayout>

    大概的

    打包簽名此apk 並取名為old.apk(這裡是為了後面好講此命名)

    修改一下activity檔案
    修改了name的數值

    package com.example.administrator.myapplication;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.View;import android.widget.Toast;public class MainActivity extends AppCompatActivity {    String name ="修複了!!!!";    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);    }    //一個按鈕的點擊事件    public void onClick(View view) {        Toast.makeText(this, name, Toast.LENGTH_SHORT).show();    }}

    打包簽名此apk 並取名為new.apk(這裡是為了後面好講此命名)

  5. 下載產生補丁工具
    阿里github官網(英文)

    在github下載源碼不用我教吧?把阿里整個master下載到本地 並解壓![這裡寫圖片描述](http://img.blog.csdn.net/20161109113056564)

    開啟上述目錄的tools目錄 解壓工具包到你喜歡的位置

    現在我開啟我解壓的後的目錄

  6. 將我們產生的new.apk 和old.apk 還有簽名檔案一併放入此檔案夾

  7. 產生補丁
    在此目錄下按下Shit鍵+滑鼠右鍵 選擇 可以看到一個選項為”在此處開啟一個命令視窗” —>>不好 一點就關掉了所以 I’m so sorry

    在跳出命令視窗輸入如下命令

    命令 : apkpatch.bat -f new.apk -t old.apk -o output1 -k debug.keystore -p android -a androiddebugkey -e android-f <new.apk> :新版本-t <old.apk> : 舊版本-o <output> : 輸出目錄-k <keystore>: 打包所用的keystore-p <password>: keystore的密碼-a <alias>: keystore 使用者別名-e <alias password>: keystore 使用者別名密碼

    提示在 dos 視窗按下tab 輸入此檔案夾下的某個檔案名稱首字母或者一段可以提示哦

-o o 我這裡的用法是 在此目錄下建立一個o檔案夾然後將生產的東西放入此檔案夾

我們開啟看看我們的o檔案夾有什麼

可以看到有一個叫
“new-4d459be7271c372742862b1a885b176a.apatch”的檔案
這個就是我們需要的 其他檔案用處我以後會補充的 如加固的一些問題

我們把此檔案改名 “out.apatch”

現在呢我們示範一下吧:
首先安裝old.apk 到手機中 我們運行看看

我們把檔案out.apath匯入到此模擬器的sd卡根目錄 在關閉程式(記得清後台!!!!!) 不然你不會重新調用application的oncreat

What ?為什麼沒有變成我們後面改成的字串?其實是我故意寫下的一個坑 我的目的很簡單 如果讓同學一帆風順的寫下來你永遠不會影響深刻對AndFIX哪些部分可以熱修複 如前文 布局檔案等

這裡之所以 不出來 是因為他把重新再name的類中賦值當成重建了一個欄位(前面說過新欄位不可以熱修複),所以解鎖方法如下

package com.example.administrator.myapplication;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.View;import android.widget.Toast;public class MainActivity extends AppCompatActivity {    String name ="你好";    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);    }    //一個按鈕的點擊事件    public void onClick(View view) {        name ="修複了";        Toast.makeText(this, name, Toast.LENGTH_SHORT).show();    }}

然後重建一個new.apk 在次和簽名檔案產生一個新的補丁效果就出來了.這裡我就不重複無聊的步驟了,我現在匯入正確的補丁

(^__^) 我很無聊吧?

後期我還會教大家一個最新的熱修複

阿里百川計劃 …

安卓熱修複之AndFIX

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.