废话不多说 什么优缺点 大家肯定已经比较过。
如果不知道热更新是个啥 大家可以自行百度
这个到没有贬低哪家的意思,现在做功能大家都想找个简单快捷的集成方式 所以还是决定听话不吃亏 哈哈哈
在开始之前 我是遇到了一个问题 截止发文前 官方工单还没给我一个解决办法 在高版本上 打出来的包 无法进行生成补丁 一直会卡在构建 ,so 目前的办法是降低 版本 我的之前是7+的 后改到了 3+ 所以有用高版本的兄弟萌要注意下
那么好 接下来就进入正式的爬坑之路,
1 首先要登陆阿里云 注册账号,创建应用
输入应用名 包名 然后创建应用
按位置把相关配置文件下载 放到它该呆的地方
接下来就是把代码放到指定的位置
那么问题来了 有人说 直接按官方文档就行了 干嘛还要看些的这些文章
呵呵 小了 兄弟你格局小了
接下来听我细细道来 到此在阿里云上把应用注册好 要用到里面的一些参数来配置
2 大家应该用的都是AS吧 接下来我把所有的文件都贴出来 大家自行查看
项目的build.gradle
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
repositories {
google()
mavenCentral()
// maven {
// url 'https://maven.aliyun.com/nexus/content/repositories/releases/'
// }
}
dependencies {
classpath 'com.android.tools.build:gradle:3.2.1'
// 添加emas-services插件
// classpath 'com.aliyun.ams:emas-services:1.0.1'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
google()
jcenter()
maven { url 'https://jitpack.io' }
// maven {url 'http://maven.aliyun.com/nexus/content/repositories/releases/'}
// maven{ url 'http://maven.aliyun.com/nexus/content/repositories/central/'}
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
app的build.gradle
plugins {
id 'com.android.application'
}
//apply plugin: 'com.aliyun.ams.emas-services'
android {
compileSdkVersion 28
buildToolsVersion "29.0.0"
defaultConfig {
applicationId "com.example.demotestaliemas"
minSdkVersion 16
targetSdkVersion 28
versionCode 1
versionName "1.0.8"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
repositories {
maven {
url "https://maven.aliyun.com/nexus/content/repositories/releases"
}
}
dependencies {
implementation 'androidx.appcompat:appcompat:1.2.0'
implementation 'com.google.android.material:material:1.3.0'
implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
testImplementation 'junit:junit:4.+'
androidTestImplementation 'androidx.test.ext:junit:1.1.2'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
implementation 'com.aliyun.ams:alicloud-android-hotfix:3.3.0'
implementation 'com.github.tbruyelle:rxpermissions:0.10.2'
implementation 'io.reactivex.rxjava2:rxjava:2.0.4'
implementation 'io.reactivex.rxjava2:rxandroid:2.0.1'
implementation 'cn.pedant.sweetalert:library:1.3'
}
接下来就是咱们的 混淆文件 Proguard-rules.pro
这里要注意下了 文档上说的是会生成一个 mapping.txt 文件 but 俺没有!俺没有!俺没有!
#基线包使用,生成mapping.txt
-printmapping mapping.txt
#生成的mapping.txt在app/build/outputs/mapping/release路径下,移动到/app路径下
#修复后的项目使用,保证混淆结果一致
#-applymapping mapping.txt
#hotfix
-keep class com.taobao.sophix.**{*;}
-keep class com.ta.utdid2.device.**{*;}
#防止inline
-dontoptimize
在activity 中 没有代码片段 不过大家在之后的生成补丁包的时候 可以在xml文件中可以修改一点文字,或者添加一张图片来测试效果
哦 Android 6.0 记得要获取下权限哦
重点来了:
重点来了:
重点来了:
重点来了:
public class SophixStubApplication extends SophixApplication {
private final String TAG = "SophixStubApplication";
// 此处SophixEntry应指定真正的Application,并且保证RealApplicationStub类名不被混淆。
@Keep
@SophixEntry(MyRealApplication.class)
static class RealApplicationStub {}
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
// 如果需要使用MultiDex,需要在此处调用。
// 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("填你自己的", "填你自己的", "填你自己的")
.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保存状态。
Log.i(TAG, "sophix preload patch success. restart app to make effect.");
}
}
}).initialize();
}
}
接下来你会发现 MyRealApplication.class 爆红了 不用担心 咱们新建个
public class MyRealApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
//hot fix. Load patch from aliyun service.
SophixManager.getInstance().queryAndLoadNewPatch();
}
}
记得要在 清单文件中 application 中把 SophixStubApplication 添加进去
还有权限:
<!-- 网络权限-->
<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" />
还有配置的参数:
<meta-data
android:name="com.taobao.android.hotfix.IDSECRET"
android:value="填你自己的" />
<meta-data
android:name="com.taobao.android.hotfix.APPSECRET"
android:value="填你自己的" />
<meta-data
android:name="com.taobao.android.hotfix.RSASECRET"
android:value="填你自己的"/>
到此就代码写完成了接下来就是打包 新包 旧包做区分 比如说 新包比旧包多加载个imgview 主要是测试效果
给你们5分钟打包时间 我出去抽根烟去
好了咱们继续
接下来就该生成补丁包了 注意在生成补丁包之前要设置一些参数
参数设置好后就把新包 旧包路径添加进去 点击 GO!
再等个 1- 2分钟 你们出去抽根烟的时间
sopjix-patch.jar 就是咱们生成的 补丁包
最后就是把刚打好的补丁包扔到 阿里云平台
添加版本--》上传版本
确定---》发布
新建发布---》选择发布类型--》确定
至此整个流程就完成了 大家等跟烟的功夫 就可以测试了 先安装个旧版的App
打开后过一会儿把进程杀掉 重新打开 看一看 图片或者文字 有没有加载进来
好了 就完事了 还有20分钟下班 再抽根烟去
哦对了 大家可以下载demo查看
距离下班还有10分钟。。。
看在这么博主辛苦的份上 拜托大家给点点赞
上两张图看效果吧 左边是oldApp 右边是newApp