阿裡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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...