阿裡SopHix熱修複框架

来源:https://www.cnblogs.com/ganchuanpu/archive/2018/03/15/8571493.html
-Advertisement-
Play Games

2015年以來,Android開發領域里對熱修複技術的討論和分享越來越多,同時也出現了一些不同的解決方案,如QQ空間補丁方案、阿裡AndFix以及微信Tinker(Bugly sdk也集成Tikner熱更新)和阿裡最新出品Sophix.它們在原理各有不同,適用場景各異。不過從技術上來說多數熱修複框架 ...


2015年以來,Android開發領域里對熱修複技術的討論和分享越來越多,同時也出現了一些不同的解決方案,如QQ空間補丁方案、阿裡AndFix以及微信Tinker(Bugly sdk也集成Tikner熱更新)和阿裡最新出品Sophix.它們在原理各有不同,適用場景各異。不過從技術上來說多數熱修複框架是基於ClassLoader載入機制。下麵是常見熱修複框架的比較。
這裡寫圖片描述

開通熱修複服務

讀者可以打開Sophix熱修複的官網:Sophix官網1、註冊阿裡雲賬號,選擇移動熱修複服務 ,選擇之後需要開通此功能,點擊立即開通即可。

2、打開管理控制台,點擊右上角創建APP。 

3、點擊Hoxfix列表android版本的app後面的管理即可查看基本信息(AppId、AppSecret和密鑰)。

本地接入熱修複服務

1,添加依賴庫和包
打開項目的app的build.gradle文件,添加maven倉庫地址和hotfix庫依賴:

repositories {
   maven {
       url "http://maven.aliyun.com/nexus/content/repositories/releases"
   }
}

dependencies {
    compile 'com.aliyun.ams:alicloud-android-hotfix:3.1.0'
}

註:如果項目中也依賴其它阿裡系SDK,可能會同時依賴了utdid這個SDK,為了避免衝突可以這樣。

dependencies {
      compile ('com.aliyun.ams:alicloud-android-hotfix:3.1.0') {
           exclude(module:'alicloud-android-utdid')
      }
}

2,AndroidManifest相關配置
在AndroidManifest配置文件中添加如下配置:

<!-- 網路許可權 -->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<!-- 外部存儲讀許可權,調試工具載入本地補丁需要 -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

在application標簽下添加如下信息:

1 <meta-data
2             android:name="com.taobao.android.hotfix.IDSECRET"
3             android:value="AppId" />
4 <meta-data
5             android:name="com.taobao.android.hotfix.APPSECRET"
6             android:value="AppSecret" />
7 <meta-data
8             android:name="com.taobao.android.hotfix.RSASECRET"
9             android:value="RSA密鑰" />

3,在Application中初始化Sophix。
initialize的調用應該儘可能的早,必須在Application.attachBaseContext()或者Application.onCreate()的最開始進行SDK初始化操作,否則極有可能導致崩潰。而查詢伺服器是否有可用補丁的操作可以在後面的任意地方。
例如:

 1 public class SophixApp extends Application {
 2 
 3     @Override
 4     public void onCreate() {
 5         super.onCreate();
 6         initSophix();
 7     }
 8 
 9     private void initSophix() {
10         String appVersion;
11 
12         try {
13             appVersion = getPackageManager().getPackageInfo(getPackageName(), 0).versionName;
14         } catch (PackageManager.NameNotFoundException e) {
15             appVersion = "1.0.0";
16             e.printStackTrace();
17         }
18 
19         // initialize最好放在attachBaseContext最前面
20         SophixManager.getInstance().setContext(this)
21                 .setAppVersion(appVersion)
22                 .setAesKey(null)
23                 .setEnableDebug(true)
24                 .setPatchLoadStatusStub(new PatchLoadStatusListener() {
25                     @Override
26                     public void onLoad(final int mode, final int code, final String info, final int handlePatchVersion) {
27                         // 補丁載入回調通知
28                         if (code == PatchStatus.CODE_LOAD_SUCCESS) {
29                             // 表明補丁載入成功
30                         } else if (code == PatchStatus.CODE_LOAD_RELAUNCH) {
31                             // 表明新補丁生效需要重啟. 開發者可提示用戶或者強制重啟;
32                             // 建議: 用戶可以監聽進入後臺事件, 然後調用killProcessSafely自殺,以此加快應用補丁,詳見1.3.2.3
33                         } else {
34                             // 其它錯誤信息, 查看PatchStatus類說明
35                         }
36                     }
37                 }).initialize();
38         // queryAndLoadNewPatch不可放在attachBaseContext 中,否則無網路許可權,建議放在後面任意時刻,如onCreate中
39         SophixManager.getInstance().queryAndLoadNewPatch();
40     }
41 
42 }

記得在AndroidManifest中使用我們自己的Application。

生成補丁並上傳到控制台

1,為了簡單,我們需要生成兩個apk,兩個apk做一個簡單的內容區分即可。將第一個命名為old.apk,代碼如下:

 1 public class MainActivity extends AppCompatActivity {
 2 
 3     private TextView mTextView;
 4 
 5     @Override
 6     protected void onCreate(Bundle savedInstanceState) {
 7         super.onCreate(savedInstanceState);
 8         setContentView(R.layout.activity_main);
 9 
10         mTextView = (TextView) findViewById(R.id.textView);
11         mTextView.setText("版本修複前");
12 
13     }
14 }

將第二個命名為new.apk,內容如下:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
       TextView tv= findViewById(R.id.fix_text);
       tv.setText("版本修複後數據...");
       Toast.makeText(this,"版本修複完成",Toast.LENGTH_LONG).show();
    }
}

2,生成補丁的話需要下載阿裡的打補丁工具SophixPatchTool,選擇對應的平臺,然後分別選擇兩次打包生成的apk,點擊go即可。
這裡寫圖片描述

補丁生成後,上傳到阿裡雲平臺,版本信息和代碼的versionName對應。 

 

然後點擊上傳補丁即可。 

 

 

在選擇正式發佈之前,官方建議您先進行本地測試。下載hotfixdebug工具安裝後,填寫包名,點擊連接應用,然後掃描補丁詳情中的二維碼下載補丁。或者將補丁包放到手機sdcard,填寫絕對路徑也是可以的。 

 

 

Mode:1 表示掃碼模式, Code:12 表示應用當前已經有一個補丁, 所以新補丁不會立刻載入需要等下一次重啟載入。

總結

Sophix的優點:
1、補丁可以即時生效,不需要應用重啟(我測試的過程中是因為本地已經存在了,所以需要重啟APP);
2、補丁包同樣採用差量技術,生成的PATCH體積小,阿裡採用自己的SophixPatchTool進行補丁生成,簡單易用;
3、對應用無侵入,幾乎無性能損耗;
4、傻瓜式接入。
缺點:
開始收費,不過有免費閾值,每月5萬台設備免費。具體資費請查看:價格資費


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1.MySQL資料庫基礎 顯示當前的伺服器版本 SELECT VERSION(); 顯示當前的日期時間 SELECT NOW(); 顯示當前用戶 SELECT USER(); 查看資料庫 SHOW DATABASES; 查看警告 SHOW WARNINGS; 2.MySQL語句的規範 (1) 關鍵字 ...
  • 2 HDFS Users Guide 2 HDFS Users Guide. 1 2.1目的... 1 2.2.概述... 1 2.3.先決條件... 2 2.4. Web Interface. 2 2.5. Shell Command. 2 2.5.1 DFSAdmin 命令... 3 2.6 S ...
  • [mysql]port=3306socket=/var/lib/mysql/mysql.sockdefault-character-set = utf8mb4 [mysqld]server-id=2log-bin=mysql-bin datadir=/data/mysqlsocket=/var/li ...
  • #啟動mongo命令/data/liudi/mongodb/bin/mongo --port 27010 #顯示資料庫show dbs; #使用tps_live資料庫use tps_live; #顯示對象show tables; #刪除liveVo對象集中的數據db.liveVo.remove({} ...
  • 參考博客 "MySQL資料庫備份(linux)" "MySQL mysqldump數據導出詳解" 備份地址 https://files.cnblogs.com/files/jxner/MySQL%E6%95%B0%E6%8D%AE%E5%BA%93%E5%A4%87%E4%BB%BD%EF%BC%8 ...
  • 1、下載並安裝好FineReport9.0和SQL Server 2016 2、開始——>所有應用——>Microsoft SQL Server 2016——>SQL Server 2016 Master Data Services Configuration Manager(單擊打開) 3、創建數 ...
  • 在資料庫的運用過程中,我們時常會碰到根據身份證號碼來獲取當前的年齡,今天我在這裡寫了一個函數,就是關於獲取年齡的 下麵是函數調用的SQL語句: ...
  • SQL server數據類型 String類型: 數據類型: 描述 存儲 char(n) 固定長度的字元串。最多 8,000 個字元。定義類型為char(5),那麼就表示該類型可以存儲5個字元,即使存入2個字元,剩餘的3個字元也會用空格補齊。 Defined width varchar(n) 可變長 ...
一周排行
    -Advertisement-
    Play Games
  • 前言 在我們開發過程中基本上不可或缺的用到一些敏感機密數據,比如SQL伺服器的連接串或者是OAuth2的Secret等,這些敏感數據在代碼中是不太安全的,我們不應該在源代碼中存儲密碼和其他的敏感數據,一種推薦的方式是通過Asp.Net Core的機密管理器。 機密管理器 在 ASP.NET Core ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 順序棧的介面程式 目錄順序棧的介面程式頭文件創建順序棧入棧出棧利用棧將10進位轉16進位數驗證 頭文件 #include <stdio.h> #include <stdbool.h> #include <stdlib.h> 創建順序棧 // 指的是順序棧中的元素的數據類型,用戶可以根據需要進行修改 ...
  • 前言 整理這個官方翻譯的系列,原因是網上大部分的 tomcat 版本比較舊,此版本為 v11 最新的版本。 開源項目 從零手寫實現 tomcat minicat 別稱【嗅虎】心有猛虎,輕嗅薔薇。 系列文章 web server apache tomcat11-01-官方文檔入門介紹 web serv ...
  • C總結與剖析:關鍵字篇 -- <<C語言深度解剖>> 目錄C總結與剖析:關鍵字篇 -- <<C語言深度解剖>>程式的本質:二進位文件變數1.變數:記憶體上的某個位置開闢的空間2.變數的初始化3.為什麼要有變數4.局部變數與全局變數5.變數的大小由類型決定6.任何一個變數,記憶體賦值都是從低地址開始往高地 ...
  • 如果讓你來做一個有狀態流式應用的故障恢復,你會如何來做呢? 單機和多機會遇到什麼不同的問題? Flink Checkpoint 是做什麼用的?原理是什麼? ...
  • C++ 多級繼承 多級繼承是一種面向對象編程(OOP)特性,允許一個類從多個基類繼承屬性和方法。它使代碼更易於組織和維護,並促進代碼重用。 多級繼承的語法 在 C++ 中,使用 : 符號來指定繼承關係。多級繼承的語法如下: class DerivedClass : public BaseClass1 ...
  • 前言 什麼是SpringCloud? Spring Cloud 是一系列框架的有序集合,它利用 Spring Boot 的開發便利性簡化了分散式系統的開發,比如服務註冊、服務發現、網關、路由、鏈路追蹤等。Spring Cloud 並不是重覆造輪子,而是將市面上開發得比較好的模塊集成進去,進行封裝,從 ...
  • class_template 類模板和函數模板的定義和使用類似,我們已經進行了介紹。有時,有兩個或多個類,其功能是相同的,僅僅是數據類型不同。類模板用於實現類所需數據的類型參數化 template<class NameType, class AgeType> class Person { publi ...
  • 目錄system v IPC簡介共用記憶體需要用到的函數介面shmget函數--獲取對象IDshmat函數--獲得映射空間shmctl函數--釋放資源共用記憶體實現思路註意 system v IPC簡介 消息隊列、共用記憶體和信號量統稱為system v IPC(進程間通信機制),V是羅馬數字5,是UNI ...