runFix熱修復插件應用

runFix

runFix熱修復

熱修復勃救,支持Class類(dex文件)碍讨,SO(so庫文件夾),資源文件(apk文件)修復剪芥。

需求背景:

隨著用戶量的上升垄开,對一個APP的穩(wěn)定性要求也越來越高,而在代碼的世界中即便是萬分小心税肪,還是會出現各種意料之外的異常溉躲。對于異常的發(fā)生如何快速定位和解決是對程序員的重大考驗。

但若每次一發(fā)生異骋嫘郑或修改一些簡單的代碼锻梳,就去更新一次APP,這不僅僅增加了程序員自身的工作量净捅,最關鍵的是十分影響用戶體驗疑枯,那么如何在用戶無感知的情況下修復已知異常呢?runFix熱修復便是一個很好的解決方案蛔六。

引入runFix插件:

  1. 在根gradle文件中引入jitpack倉庫:
allprojects {
    repositories {
        ...
        maven { url 'https://jitpack.io' }
    }
}
  1. 在工程gradle文件中引入MaoKePlayer插件
dependencies {
    implementation 'com.github.zrunker:runFix:v1.0'
}

執(zhí)行修復 - RunFix:

RunFix類提供了本地和網絡兩種修復方式荆永,相關API如下:

  1. 修復網絡文件:

    // url待修復資源的網絡鏈接
    RunFix.getInstance(context).fixUrl(String url);
    
    // urls待修復資源的網絡鏈接集合
    RunFix.getInstance(context).fixUrlList(ArrayList<String> urls);
    

    注意:默認下載url是通過get的方式進行下載。

  2. 修復本地文件:

    // filePath待修復資源文件的本地地址
    // class -> dex文件
    // so -> armeabi国章,armeabi-v7a具钥,x86,mips液兽,arm64- v8a骂删,mips64,x86_64文件夾
    // res -> apk文件
    RunFix.getInstance(context).fixFile(String filePath);
    
  3. 修復本地文件夾:

    // dirPath待修復資源的本地文件夾地址
    RunFix.getInstance(context).fixDir(String dirPath);
    
  4. 修復默認文件夾(推薦):

    RunFix的默認修復文件夾地址為${applicationid}/fix目錄四啰,所以把待修復資源文件放入該目錄下宁玫,執(zhí)行如下方法就能夠完成修復功能:

    // 執(zhí)行待修復資源默認目錄
    RunFix.getInstance(context).fix();
    

    補充:

    // 獲取待修復資源默認目錄地址
    RunFix.getInstance(context).fixDefaultDir();
    

待修復文件生成:

runFix支持Class類,SO庫以及資源文件的修復柑晒,但三種類型文件修復需要包裝成特定格式文件才行欧瘪。

  • Class類的修復:需要將待修復的Class類文件一起打包成dex文件。
  • SO庫的修復:需要將待修復的so庫放入特定的armeabi匙赞,armeabi-v7a佛掖,x86,mips罚屋,arm64- v8a苦囱,mips64,x86_64文件夾下脾猛。
  • 資源文件的修復:需要將APP中所有資源文件一起打包成apk文件撕彤。

假如將所有待修復文件放入云端提供修復下載,那么該如打包出不同類型的修復文件呢?

一. 修復Class類文件【DEX文件】:

如何打DEX文件包羹铅?

如果工程遇到屬于類文件代碼導致的BUG蚀狰,那么就需要修復類文件,并將修復之后的類文件打包成DEX文件职员,上傳至之前設置好的云平臺麻蹋,那么如何打包成DEX文件呢?


1.png

1焊切、Java文件編譯成Class文件扮授,可以使用AS 執(zhí)行 Make Project,或者使用javac命令執(zhí)行Java文件专肪。

  1. 編譯前:


    2.png
  2. 編譯后:生成build文件目錄刹勃,而class文件便在該build文件目錄內。


    3.png

找到編輯后的class文件嚎尤,build/intermediates/javac/debug/classes/....不同AS版本可能目錄不一致荔仁。

將編輯之后的class文件,連同目錄一起復制到一個單獨的目錄下芽死。

例如:修復的文件是在com.baidu.runFix.MainActivity乏梁,那么就將com文件目錄拷貝到一個單獨目錄用于打包DEX文件。


4.png

例如將其放置桌面fix目錄下:


5.png

2关贵、使用dx工具將class文件打包成dex文件遇骑。

6.png

找到Android SDK目錄,該目錄中將會有dx工具坪哄,一般位置是/Users/zoufengli01/Library/Android/sdk/build-tools/28.0.3/dx质蕉。

使用shell終端势篡,執(zhí)行dx命令將會生成DEX文件:

/Users/zoufengli01/Library/Android/sdk/build-tools/28.0.3/dx --dex --output=/Users/zoufengli01/Desktop/fix/classes-fix-1.dex /Users/zoufengli01/Desktop/fix
<!--dx --dex --output-->
7.png

classes-fix-1.dex就是打包之后的DEX文件翩肌,也是需要上傳至云端的dex補丁。

二禁悠、修復資源文件【APK文件】:

只保留APP工程中的資源文件(如:res目錄中文件)念祭,將其他文件全部刪除,然后將剩下文件打包成APK文件碍侦,上傳至云端提供下載粱坤。

三、修復so庫文件【ZIP文件或文件夾】:

如何打包SO庫瓷产?

將JNI代碼編譯成So庫站玄,一般情況下都是使用NDK進行編譯,通常是直接使用NDK執(zhí)行腳本命令濒旦,例如:音視頻播放器【NA】一文中是使用Shell命令進行編譯株旷。

另外如果是自己開發(fā)打包成SO庫的話,采用Android Studio+CMake也是十分方便,只需要簡單配置CMakeLists.txt:

cmake_minimum_required(VERSION 3.10.2)

project("test")

add_library( # Sets the name of the library.
             native-lib

             # Sets the library as a shared library.
             SHARED

             # Provides a relative path to your source file(s).
             native-lib.cpp )

find_library( # Sets the name of the path variable.
              log-lib

              # Specifies the name of the NDK library that
              # you want CMake to locate.
              log )

target_link_libraries( # Specifies the target library.
                       native-lib

                       # Links the target library to the log library
                       # included in the NDK.
                       ${log-lib} )

目錄結構如下:


8.png

其中native-lib.cpp便是需要編譯的c++文件晾剖。

編譯好代碼之后锉矢,保存,點擊編譯按鈕齿尽,便會自動生成相應CPU架構SO庫:


9.png

之后將這些編譯之后的so庫打包上傳到云端即可沽损,注意:打包時要將整個CPU架構文件夾都一起打包,而不能只打包單一的so庫循头。


10.png

例如:將libs文件夾打包(將其壓縮成zip包)上傳至云端提供下載绵估。

閱讀原文

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市卡骂,隨后出現的幾起案子壹士,更是在濱河造成了極大的恐慌,老刑警劉巖偿警,帶你破解...
    沈念sama閱讀 219,188評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件躏救,死亡現場離奇詭異,居然都是意外死亡螟蒸,警方通過查閱死者的電腦和手機盒使,發(fā)現死者居然都...
    沈念sama閱讀 93,464評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來七嫌,“玉大人少办,你說我怎么就攤上這事∷性” “怎么了英妓?”我有些...
    開封第一講書人閱讀 165,562評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長绍赛。 經常有香客問我蔓纠,道長,這世上最難降的妖魔是什么吗蚌? 我笑而不...
    開封第一講書人閱讀 58,893評論 1 295
  • 正文 為了忘掉前任腿倚,我火速辦了婚禮,結果婚禮上蚯妇,老公的妹妹穿的比我還像新娘敷燎。我一直安慰自己,他們只是感情好箩言,可當我...
    茶點故事閱讀 67,917評論 6 392
  • 文/花漫 我一把揭開白布硬贯。 她就那樣靜靜地躺著,像睡著了一般陨收。 火紅的嫁衣襯著肌膚如雪饭豹。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,708評論 1 305
  • 那天,我揣著相機與錄音墨状,去河邊找鬼卫漫。 笑死,一個胖子當著我的面吹牛肾砂,可吹牛的內容都是我干的列赎。 我是一名探鬼主播,決...
    沈念sama閱讀 40,430評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼镐确,長吁一口氣:“原來是場噩夢啊……” “哼包吝!你這毒婦竟也來了?” 一聲冷哼從身側響起源葫,我...
    開封第一講書人閱讀 39,342評論 0 276
  • 序言:老撾萬榮一對情侶失蹤诗越,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后息堂,有當地人在樹林里發(fā)現了一具尸體嚷狞,經...
    沈念sama閱讀 45,801評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,976評論 3 337
  • 正文 我和宋清朗相戀三年荣堰,在試婚紗的時候發(fā)現自己被綠了床未。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,115評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡振坚,死狀恐怖薇搁,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情渡八,我是刑警寧澤啃洋,帶...
    沈念sama閱讀 35,804評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站屎鳍,受9級特大地震影響宏娄,放射性物質發(fā)生泄漏。R本人自食惡果不足惜哥艇,卻給世界環(huán)境...
    茶點故事閱讀 41,458評論 3 331
  • 文/蒙蒙 一绝编、第九天 我趴在偏房一處隱蔽的房頂上張望僻澎。 院中可真熱鬧貌踏,春花似錦、人聲如沸窟勃。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽秉氧。三九已至眷昆,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背亚斋。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評論 1 272
  • 我被黑心中介騙來泰國打工作媚, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人帅刊。 一個月前我還...
    沈念sama閱讀 48,365評論 3 373
  • 正文 我出身青樓纸泡,卻偏偏與公主長得像,于是被迫代替她去往敵國和親赖瞒。 傳聞我的和親對象是個殘疾皇子女揭,可洞房花燭夜當晚...
    茶點故事閱讀 45,055評論 2 355

推薦閱讀更多精彩內容