阿裏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萬臺設備免費。具體資費請查看:價格資費
阿裏SopHix熱修復框架