1. 程式人生 > >阿裏SopHix熱修復框架

阿裏SopHix熱修復框架

控制臺 易用 com style compile 第一個 val 機制 二維

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萬臺設備免費。具體資費請查看:價格資費

阿裏SopHix熱修復框架