轉載請注明出處:http://www.lxweimin.com/p/d9201733f3b4
本文出自Shawpoo的簡書
我的博客:CSDN博客
前言
熱修復作為當下熱門的技術,在業界內比較著名的有阿里的AndFix、Dexposed,騰訊QQ空間的超級補丁技術和微信的Tinker。但是我對熱修復基本沒怎么研究過,由于最近一段時間了解到阿里發布了新一代熱修復技術—Sophix。于是我決定折騰一波...
一、開通移動熱修復服務
-
1、注冊阿里云賬號,選擇移動熱修復服務
選擇移動熱修復
選擇之后需要開通此功能,點擊立即開通即可:
- 2、打開管理控制臺,點擊右上角創建APP
這時候返回Hotfix列表,會出現android和ios兩個版本的APP。
ps:這里需要的是注意,一個是移動服務APP列表,一個是Hotfix列表,兩個列表需要區分一下。
- 3、RSA密鑰(后面需要在AndroidManifest文件中配置)
點擊Hoxfix列表android版本的app后面的管理即可查看基本信息:
二、接入熱修復服務
1、添加依賴包
在項目的app.gradle中:
- 1、添加maven倉庫地址:
repositories {
maven {
url "http://maven.aliyun.com/nexus/content/repositories/releases"
}
}
- 2、添加gradle坐標版本依賴:
dependencies {
compile 'com.aliyun.ams:alicloud-android-hotfix:3.1.0'
}
ps:如果項目中也依賴其它阿里系SDK,可能會同時依賴了utdid這個SDK,為了避免沖突可以這樣:
dependencies {
compile ('com.aliyun.ams:alicloud-android-hotfix:3.1.0') {
exclude(module:'alicloud-android-utdid')
}
}
2、AndroidManifest中相關配置
- 1、配置相關權限:
<!-- 網絡權限 -->
<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"/>
- 2、添加元數據:
<application
...
>
<meta-data
android:name="com.taobao.android.hotfix.IDSECRET"
android:value="自己APP的App ID" />
<meta-data
android:name="com.taobao.android.hotfix.APPSECRET"
android:value="自己APP的App Secret" />
<meta-data
android:name="com.taobao.android.hotfix.RSASECRET"
android:value="自己APP的RSA密鑰" />
</application>
3、初始化Sophix
initialize的調用應該盡可能的早,必須在Application.attachBaseContext()或者Application.onCreate()的最開始進行SDK初始化操作,否則極有可能導致崩潰。而查詢服務器是否有可用補丁的操作可以在后面的任意地方。
這里我是繼承Application,在onCreate()方法中進行初始化:
public class SophixApp extends Application {
@Override
public void onCreate() {
super.onCreate();
initSophix();
}
private void initSophix() {
String appVersion;
try {
appVersion = getPackageManager().getPackageInfo(getPackageName(), 0).versionName;
} catch (PackageManager.NameNotFoundException e) {
appVersion = "1.0.0";
e.printStackTrace();
}
// initialize最好放在attachBaseContext最前面
SophixManager.getInstance().setContext(this)
.setAppVersion(appVersion)
.setAesKey(null)
.setEnableDebug(true)
.setPatchLoadStatusStub(new PatchLoadStatusListener() {
@Override
public void onLoad(final int mode, final int code, final String info, final int handlePatchVersion) {
// 補丁加載回調通知
if (code == PatchStatus.CODE_LOAD_SUCCESS) {
// 表明補丁加載成功
} else if (code == PatchStatus.CODE_LOAD_RELAUNCH) {
// 表明新補丁生效需要重啟. 開發者可提示用戶或者強制重啟;
// 建議: 用戶可以監聽進入后臺事件, 然后調用killProcessSafely自殺,以此加快應用補丁,詳見1.3.2.3
} else {
// 其它錯誤信息, 查看PatchStatus類說明
}
}
}).initialize();
// queryAndLoadNewPatch不可放在attachBaseContext 中,否則無網絡權限,建議放在后面任意時刻,如onCreate中
SophixManager.getInstance().queryAndLoadNewPatch();
}
}
三、生成補丁并上傳到控制臺
1、進行第一次運行并打包生成apk
為了簡單測試,以一個TextView為例,且打包命名為first.apk
public class MainActivity extends AppCompatActivity {
private TextView mTextView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTextView = (TextView) findViewById(R.id.textView);
mTextView.setText("這是第一次運行的,");
}
}
2、進行第二次運行并打包生成apk
這時候我們修改TextView的文字設置,且打包命名為second.apk
3、生成補丁
- a 、生成補丁的話需要下載阿里的打補丁工具SophixPatchTool,然后分別選擇兩次打包生成的apk。
ps:
舊包:<必填> 選擇基線包路徑(有問題的APK)。
新包:<必填> 選擇新包路徑(修復過該問題APK)。
日志:打開日志輸出窗口。
高級:展開高級選項。
設置:配置其他信息。
GO!:開始生成補丁。
- b、打開高級設置是否需要冷啟動,本項為默認即可,無需設置:
ps:
強制冷啟動:勾選的話強制生成補丁包為需要冷啟動才能修復的格式。默認不選的話,工具會根據代碼變更情況自動選擇即時熱替換或者冷啟動修復。
不比較資源:打補丁時不比較資源的變化。
不比較SO庫:打補丁時不比較SO庫的變化。
- c、打開設置選項進行簽名信息設置:
- d、點擊Go生成補丁:
- e、上傳補丁
將生成的補丁文件sophix-patch.jar上傳到控制臺:
4、調試并發布補丁
上傳補丁后,查看補丁詳情會發現,補丁狀態是等待發布,阿里建議在正式發布前先使用hotfixdebug工具進行本地測試再發布,當然我們可以直接全量發布。
1、本地測試
下載hotfixdebug工具安裝后,填寫包名,點擊連接應用,然后掃描補丁詳情中的二維碼下載補丁。或者將補丁包放到手機sdcard,填寫絕對路徑也是可以的。
Mode:1 表示掃碼模式, Code:12 表示應用當前已經有一個補丁, 所以新補丁不會立刻加載需要等下一次重啟加載。(因為我已經下載過一次了)
這時候打開我們裝上的first.apk發現并沒有變,殺掉進程,重新進入,發現已經是我們想要的內容了。
2、全量發布補丁
選擇全量發布,所有安裝first.apk的用戶就可以得到修復了,點擊確認發布即可。
發布之后,重新啟動APP,會發現可以內容已經變為我們想要的。(這個過程可能略有延遲)
關于更多具體的發布流程,點擊參考
完美實現熱修復!
總結
Sophix的優點:
- 1、補丁可以即時生效,不需要應用重啟(我測試的過程中是因為本地已經存在了,所以需要重啟APP);
- 2、補丁包同樣采用差量技術,生成的PATCH體積小,阿里采用自己的SophixPatchTool進行補丁生成,簡單易用;
- 3、對應用無侵入,幾乎無性能損耗;
- 4、傻瓜式接入。
缺點:
開始收費,不過有免費閾值,關于價格可以點擊查看