- 在阿里云管理控制臺創(chuàng)建你的應(yīng)用默伍,得到
AppKey、AppSecret、RSA - 在你的Androidmanifest.xml文件中添加如下代碼
<meta-data
android:name="com.taobao.android.hotfix.IDSECRET"
android:value="你的AppKey" />
<meta-data
android:name="com.taobao.android.hotfix.APPSECRET"
android:value="你的AppSecret" />
<meta-data
android:name="com.taobao.android.hotfix.RSASECRET"
android:value="你的RSA" />
其中RSA建議在下圖為止復(fù)制
image.png
- 根據(jù)阿里給出的文檔接入(建議直接采用穩(wěn)健接入方式)
https://help.aliyun.com/document_detail/53240.html?spm=a2c4g.11174283.6.546.ydTSCV
(1)在你的工程級別的gradle下焙矛,添加maven倉庫
repositories {
maven {
url "http://maven.aliyun.com/nexus/content/repositories/releases"
}
}
(2)在你的主工程下的gradle中添加依賴
compile 'com.aliyun.ams:alicloud-android-hotfix:3.2.4'
如果你的gradle依賴有問題,那么就去下載本地SDK残腌,然后在項目中添加進去薄扁,下載地址
https://mhub.console.aliyun.com/?spm=a2c4g.11186623.2.3.OOmSwv#/download
image.png
(3)在AndroidManifest.xml中添加如下權(quán)限
<! -- 網(wǎng)絡(luò)權(quán)限 -->
<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" />
<! -- 外部存儲讀權(quán)限,調(diào)試工具加載本地補丁需要 -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
//備注READ_EXTERNAL_STORAGE權(quán)限屬于Dangerous Permissions废累,僅調(diào)試工具獲取外部補丁需要,不影響線上發(fā)布的補丁加載脱盲,調(diào)試時請自行做好android6.0以上的運行時權(quán)限獲取邑滨。
(4)添加混淆
#基線包使用,生成mapping.txt
-printmapping mapping.txt
#生成的mapping.txt在app/build/outputs/mapping/release路徑下钱反,移動到/app路徑下
#修復(fù)后的項目使用掖看,保證混淆結(jié)果一致
#-applymapping mapping.txt
#hotfix
-keep class com.taobao.sophix.**{*;}
-keep class com.ta.utdid2.device.**{*;}
#防止inline
-dontoptimize
(5)復(fù)制這個類
package com.my.pkg;
import android.app.Application;
import android.content.Context;
import android.support.annotation.Keep;
import android.util.Log;
import com.taobao.sophix.PatchStatus;
import com.taobao.sophix.SophixApplication;
import com.taobao.sophix.SophixEntry;
import com.taobao.sophix.SophixManager;
import com.taobao.sophix.listener.PatchLoadStatusListener;
import com.my.pkg.MyRealApplication;
/**
* Sophix入口類匣距,專門用于初始化Sophix,不應(yīng)包含任何業(yè)務(wù)邏輯哎壳。
* 此類必須繼承自SophixApplication毅待,onCreate方法不需要實現(xiàn)。
* 此類不應(yīng)與項目中的其他類有任何互相調(diào)用的邏輯归榕,必須完全做到隔離尸红。
* AndroidManifest中設(shè)置application為此類,而SophixEntry中設(shè)為原先Application類刹泄。
* 注意原先Application里不需要再重復(fù)初始化Sophix外里,并且需要避免混淆原先Application類。
* 如有其它自定義改造特石,請咨詢官方后妥善處理盅蝗。
*/
public class SophixStubApplication extends SophixApplication {
private final String TAG = "SophixStubApplication";
// 此處SophixEntry應(yīng)指定真正的Application,并且保證RealApplicationStub類名不被混淆姆蘸。
@Keep
@SophixEntry(MyRealApplication.class)
static class RealApplicationStub {}
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
// 如果需要使用MultiDex墩莫,需要在此處調(diào)用。
// MultiDex.install(this);
initSophix();
}
private void initSophix() {
String appVersion = "0.0.0";
try {
appVersion = this.getPackageManager()
.getPackageInfo(this.getPackageName(), 0)
.versionName;
} catch (Exception e) {
}
final SophixManager instance = SophixManager.getInstance();
instance.setContext(this)
.setAppVersion(appVersion)
.setSecretMetaData(null, null, null)
.setEnableDebug(true)
.setEnableFullLog()
.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) {
Log.i(TAG, "sophix load patch success!");
} else if (code == PatchStatus.CODE_LOAD_RELAUNCH) {
// 如果需要在后臺重啟逞敷,建議此處用SharePreference保存狀態(tài)狂秦。
Log.i(TAG, "sophix preload patch success. restart app to make effect.");
}
}
}).initialize();
}
}
//這里的初始化和[快速接入](https://help.aliyun.com/document_detail/53240.html)中的是一樣的,務(wù)必放在attachBaseContext中兰粉,onCreate不需要自行實現(xiàn)故痊。同時自定義的SophixStubApplication需要繼承com.taobao.sophix.SophixApplication。初始化設(shè)置選項如有疑問玖姑,請參考快速接入中的[接口說明](https://help.aliyun.com/document_detail/53240.html#1.3.2%20%E6%8E%A5%E5%8F%A3%E8%AF%B4%E6%98%8E)愕秫。
最重要的一點!焰络!
@Keep
@SophixEntry(MyRealApplication.class)
static class RealApplicationStub {}
把MyRealApplication.class換成你自定義的Application
SophixEntry應(yīng)指定項目中原先真正的Application(原項目里application的android::name指定的)戴甩,這里用MyRealApplication指代。并且保證RealApplicationStub類名不被混淆闪彼。而SophixStubApplication的類名和包名可以自行取名甜孤。
這里的Keep是android.support包中的類,目的是為了防止這個內(nèi)部靜態(tài)類的類名被混淆畏腕,因為sophix內(nèi)部會反射獲取這個類的SophixEntry缴川。如果項目中沒有依賴android.support的話,就需要在progurad里面手動指定RealApplicationStub不被混淆描馅,詳見下文把夸。
-keepclassmembers class com.my.pkg.MyRealApplication {
public <init>();
}
# 如果不使用android.support.annotation.Keep則需加上此行
# -keep class com.my.pkg.SophixStubApplication$RealApplicationStub
最后,需要把AndroidManifest里面的application改為這個新增的SophixStubApplication類:
<application
android:name="com.my.pkg.SophixStubApplication"
... ...>
... ...
-
注意事項:
如果運行報錯
image.png
說明是你的utdid沖突了铭污,趕快檢查你項目中引用到阿里系列的包(友盟統(tǒng)計恋日、友盟推送膀篮、阿里支付、andfix等等)最后確認只留下一個utdid的引用即可岂膳。
- 打包測試
(1)打好2個差異包之后誓竿,用測試工具生成sophix-patch.jar包
調(diào)試工具地址:http://ams-hotfix-repo.oss-cn-shanghai.aliyuncs.com/hotfix_debug_tool-release.apk
(2)查看你的程序中,目前的版本號是多少谈截,就是你AndroidManifest.xml中的android:versionName="1.0"或者build.gradle中的android:versionName="1.0筷屡。
在阿里云管理后臺,新建版本1.0
image.png
注意:版本號必須完全一致才可以I得恕K偃铩!
(3)然后再上傳補丁娘赴,就是你用工具生成的sophix-patch.jar包
image.png
(4)點擊下圖區(qū)域
image.png
掃碼測試沒問題后规哲,發(fā)布灰度測試
image.png
灰度測試通過后,點擊全量發(fā)布
image.png
至此诽表,OK唉锌,歡迎交流