熱修復系列——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兩種)搭建到實際專案實戰,從入門到精通。每一個部分均有理論知識介紹、介面講解、例項程式碼講解,講解過程中不