1. 程式人生 > >熱修復系列——AndFix使用教程基礎篇

熱修復系列——AndFix使用教程基礎篇

一、前言

      最近研究阿里的開源熱修復框架AndFix,本文參考AndFix官方教程,給出我所使用詳細小白demo教程,包括在構建測試demo過程中所遇到對問題也列出來。阿里github連結:https://github.com/alibaba/AndFix

      限制:

      1、支援的Android版本為2.3-7.0(即:Android API 9 ~ Android API 24),本文在7.1版本的真機中測試失敗。

       2、無法新增刪除類和欄位,只能修改。

       3、如建構函式等靜態函式可能會有問題。

二、生成帶bug的APK

     1、用AndroidStudio新建專案。

       踩坑說明:

       在使用AS建立專案時候,不管你選擇的是那個Target版本,在gradle中預設的SDK都是最高版本。而我一開始用最高版本時,專案/build/outputs資料夾下沒有apk資料夾,使用如下步驟生成apk檔案:

           此時output目錄下生成apk資料夾,但最後生成補丁包時報錯如下:

      因此最後我選擇手動修改gradle配置檔案,降低SDK版本,同時由於本文為demo測試,刪除了一些不需要的依賴項。

      本文使用Gradle將sdk編譯版本設定為23,並且將最低目標版本為21(這個大家可以根據官網支援的版本修改),同時刪除了所有dependencies依賴項,只新增AndFix依賴,具體對應位置修改如下:

compileSdkVersion 23
minSdkVersion 21
dependencies {
    compile 'com.alipay.euler:andfix:[email protected]'
}

       此時,當我們修改完成後,gradle sync發現會報許多資源錯誤。這是因為建立的專案資原始檔中使用了高版本SDK和一些依賴包中的東西,因此需要將不必要的資原始檔或裡面引用的標籤刪除,大致包括AndroidManifest.xml中的標籤,res資料夾下的資原始檔。如果是生成的BasicActivity,那麼在這個Activity中,也可以將其他東西刪除。

本文最終的使用的MainActivity.java關鍵程式碼如下:

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;

public class MainActivity extends Activity {

    // Used to load the 'native-lib' library on application startup.
    static {
        System.loadLibrary("native-lib");
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // Example of a call to a native method
        Log.d("euler", "test");
        TextView tv = (TextView) findViewById(R.id.text);
        tv.setText(change());
    }


    /**
     * A native method that is implemented by the 'native-lib' native library,
     * which is packaged with this application.
     */
    public native String stringFromJNI();
    public String change(){
        return "old";
    }

佈局檔案activity_main.xml程式碼如下:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
    <Button
        android:id="@+id/change_text"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Change Text" />
    <TextView
        android:id="@+id/text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:text="Hello world"/>
</RelativeLayout>

補丁框架所需要的類MainApplication.java,直接放在與啟動類MainActivity同一目錄下,具體程式碼如下:

import java.io.IOException;

import android.app.Application;
import android.os.Environment;
import android.util.Log;

import com.alipay.euler.andfix.patch.PatchManager;

/**
 * sample application
 * 
 * @author [email protected]
 * 
 */
public class MainApplication extends Application {
	private static final String TAG = "euler";

	private static final String APATCH_PATH = "/out.apatch";
	/**
	 * patch manager
	 */
	private PatchManager mPatchManager;

	@Override
	public void onCreate() {
		super.onCreate();
		// initialize
		mPatchManager = new PatchManager(this);
		mPatchManager.init("1.0");
		Log.d(TAG, "inited.");

		// load patch
		mPatchManager.loadPatch();
		Log.d(TAG, "apatch loaded.");

		// add patch at runtime
		try {
			// .apatch file path
			String patchFileString = Environment.getExternalStorageDirectory()
					.getAbsolutePath() + APATCH_PATH;
			mPatchManager.addPatch(patchFileString);
			Log.d(TAG, "apatch:" + patchFileString + " added.");
		} catch (IOException e) {
			Log.e(TAG, "", e);
		}

	}
}

由於本文程式碼需要對sdcard進行讀寫,且實現MainApplication類,因此需要修改AndroidManifest.xml檔案,本文具體程式碼如下:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.andfixdemo1">
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <application
        android:name="com.example.andfixdemo1.MainApplication"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true">
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

此時專案生成基本完成,gradle能夠build成功。如果還有什麼錯誤,只需要根據提示安裝即可。

2、生成keystore檔案

AndFix在使用補丁工具生成補丁包時,需要keystore檔案和金鑰等,如果你已經有自己的keystore檔案,則可跳過這步。具體步驟如下:







finish後軟體會自動在指定目錄下生成jks檔案,並提示生成成功。

3、生成簽名apk

建立好keystore後,需要配置用該檔案作為apk的簽名檔案,具體步驟如下:





配置完成後,選擇本次編譯版本,因為簽名配置使用簽名檔案的版本為release版,因此編譯選項選擇release版。具體步驟如下:



      然後執行安裝app即可,在專案路徑/app/build/outputs/apk/release/app-release.apk即為帶Bug的apk。

     本文儲存該apk並更名為old.apk,解壓原始碼AndFix-master/tools/apkpatch-1.0.3.zip,將old.apk放在解壓後的apkpatch-1.0.3資料夾下。

      需要注意的是,本文demo使用了儲存裝置讀取許可權,因此安裝後需要手動在應用管理中開啟儲存許可權

三、生成修復APK

       本文更新的apk檔案,只是將MainActivity中change函式的返回字串更改為new,重新編譯得到更新後的apk檔案,並重命名為new.apk,同樣複製到apkpatch-1.0.3資料夾下,此時手機裡執行的仍然是帶bug的old.apk。

四、生成補丁檔案

        進入apkpatch-1.0.3資料夾資料夾,使用如下命令生成補丁.apatch檔案。

./apkpatch.sh -o /Users/xxx/Desktop/ -k /Users/xxx/xxx.jks -p ******** -a xxx -e ******** -t ./old.apk -f ./new.apk

        命令引數說明:

         此時,Desktop目錄下將生成了兩個檔案,關注.patch檔案,重新命名為MainApplication中用到的常量名稱out.patch。

五、修復測試

         將補丁檔案放入指定位置,本文所用測試機對應位置為/sdcard,因此使用命令如下:

adb push /Users/xxx/Desktop/out.apatch /sdcard/out.apatch

          對於其他機型,本文程式碼對應可能使用的命令如下:

adb push /Users/xxx/Desktop/out.apatch /storage/emulated/0/out.apatch

           重新啟動應用,發現bug已經被修復。

相關推薦

修復系列——AndFix使用教程基礎

一、前言      最近研究阿里的開源熱修復框架AndFix,本文參考AndFix官方教程,給出我所使用詳細小白demo教程,包括在構建測試demo過程中所遇到對問題也列出來。阿里github連結:https://github.com/alibaba/AndFix     

Android修復AndFix使用教程

AndFix的github地址 AndFix 全稱Android hot-fix,是alibaba的Android熱修復框架,支援Android 2.3到6.0的版本,支援arm與X86系統架構,支援Dalvik和ART Runtime。 原理 AndFix的原理就是方法的替換,把有bug的方法替換成

修復系列之一----Android 修復原理及幾大方案比較

熱修復說白了就是”即時無感打補丁”,比如你們公司上線一個app,使用者反應有重大bug,需要緊急修復。2015年以來,Android開發領域裡對熱修復技術的討論和分享越來越多,同時也出現了一些不同的解決方案.如果按照通常做法,那就是程式猿加班搞定bug,然後測試,重新打包

修復系列調研及收費對比

原文地址: https://www.jianshu.com/p/dd4e424071e7   主流工具對比: image.png 收費情況: 阿里 Sophix收費詳細連結 Sophix 免費閾值   Spohix 收費

最新微信Tinker 修復平臺接入教程(超詳細)

目錄 Tinker接入文件 1 Tinker簡介 1.1Tinker優點 1.2 Tinker缺點 1.Tinker不支援修改AndroidManifest.xml,Tinker不支援新增四大元件(1.9.0支援新增非export的A

版本管理之gitlab實踐教程 基礎 1

這幾篇文章主要面向對git和gitlab稍有基礎,但是又不太會用的使用者,通過這幾文章你可以學到如下gitlab的使用方法: sshkey的設定 建立專案 分支操作 使用者/許可權/組的操作 配置專案可見性 Merge Re

微信小程式開發教程(基礎)6-logs頁面解析

上一篇教程中對index頁面進行了解析,這一篇來解析下logs頁面 老規矩先上圖 該頁面包含返回按鈕(用於返回index頁面),頁面title和程式啟動日誌列表。 和index頁面相比,logs頁面多了一個logs.json檔案,來配置頁面title的

微信小程式開發教程(基礎)3-app.js 解析

上一篇教程中寫道,開發工具會生成一個預設的程式框架,其中程式的主流程程式碼包含在app.js中。預設實現中,該部分功能比較簡單,不過對於學研究小程式開發還是比較有價值的。 由於程式碼行數不多,下面一次性貼出來後進行講解 //app.js App({

Android修復框架——AndFix

一直關注App的熱修復的技術發展,之前做的應用也沒用使用到什麼熱修復開源框架。在App的熱修復框架沒有流行之前,做的應用上線後發現一個小小的Bug,就要馬上發一個新的版本。今天看了熱修復技術,感覺挺好玩的,就實現了使用的全過程。下面記錄使用開源框架阿里巴巴的AndFix過程

[Unity XLua]更新XLua入門(一)-基礎

Aladdin_XLua 前言 前段時間騰訊開源了一個內部熱更框架XLua在Unity開發群裡引起一陣熱議,也受到廣大開發者的熱捧,然後我當然也抱著好奇的心去學習學習。後面也會將擴充套件之後的工程放在git上,大家一起學習交流!在此感謝XLua作者創造出

探索ASP.NET MVC5系列之~~~1.基礎---必須知道的小技能

其實任何資料裡面的任何知識點都無所謂,都是不重要的,重要的是學習方法,自行摸索的過程 MVC==>Model View Controller  Model ====>模型就是要去顯示,儲存,建立,更新和刪除的物件(實體) View =====>檢視是使用者看到並與之互動的介

Gradle教程--基礎

Gradle 是什麼 Gradle是一種依賴管理工具,基於Groovy語言,面向Java應用為主,它拋棄了基於XML的各種繁瑣配置,取而代之的是一種基於Groovy的內部領域特定(DSL)語言。 安裝Gradle 在 Android Studio 中新

微信小程式開發教程(基礎)8-資料繫結下

教程接上篇,當需要展示一組資料時,可以使用wx:for //.wxml <view wx:for="{{array}}"> {{index}}: {{item.message}} </view> //.js age({ d

持續集成之jenkins實踐教程 基礎 4 集成redmine

如何 沒有 iss 技術 文章 proc head pac redmin 作為持續集成的利器Jenkins已經得到了廣泛地應用,僅僅作為一個工具,Jenkins已然了了自己的生態圈,支持其的plugin更是超過1300+。在實際中如何使用以及如何更好地使用jenki

版本管理之gitlab實踐教程 基礎 3

symbol 為什麽 reg details pro == 什麽 操作 requests comment是版本管理中非常重要的內容,尤其是在經年累月的大型項目中,鐵打的項目,流水的SE,哪怕只言片語的留下,對後來者問題的對應很多時候都能起到重要作用,這篇文章用來講解

[Android 效能優化系列]記憶體之基礎--Android如何管理記憶體

轉載請標明出處(http://blog.csdn.net/kifile),再次感謝 在接下來的一段時間裡,我會每天翻譯一部分關於效能提升的Android官方文件給大家 下面是本次的正文: ################ 隨機訪問儲存器(Ram) 不管在哪種軟體開發

Modelsim/QuestaSim教程——基礎

寫完HDL程式碼,當然要模擬一下,這時可以使用quartus自帶的qsim或者ISE自帶的isim來模擬,但是,業界推薦使用Modelsim。 Modelsim的版本比較多,一般是用功能最全的SE版,

Android修復Andfix和Hotfix,兩種方案的比較與實現

Andfix和hotfix是兩種android熱修復框架。 android的熱修復技術我看的最早的應該是QQ空間團隊的解決方案,後來真正需要了,才仔細調查,現在的方案中,阿里有兩種Dexposed和Andfix框架,由於前一種不支援5.0以上android系統

1.偏頭痛楊的中高階java後端面試題攻略系列之java基礎(持續更新)

前戲即使不跳槽也建議每隔一段時間出去面試幾次,面試的目的不在於拿offer入職,而是在於你知道你自己目前的水平是幾斤幾兩,是否有被市場所淘汰的危機。終身學習,居安思危,保持危機意識。每個人的時間與精力都是有限的,有限的時間做有限的事情,不要什麼都學,做減法,要有自己的強項,知

QT/C++從新手到老手系列之QT基礎-李浩林-專題視訊課程

QT/C++從新手到老手系列之QT基礎篇—1620人已學習 課程介紹        本系列課程勵志於帶領你學習QT5/C++,從開發環境(QTCreator和VS2013兩種)搭建到實際專案實戰,從入門到精通。每一個部分均有理論知識介紹、介面講解、例項程式碼講解,講解過程中不