前面简单介绍了一下Tinker热修复的使用,包含debug和release,今天就来分享一下微信针对Tinker热修复提供的一个平台,TinkerPatch补丁管理后台。
Tinker 需要使用者有一个后台可以下发和管理补丁包,并且需要处理传输安全等部署工作,TinkerPatch 平台帮你做了这些工作,提供了补丁后台托管,版本管理,保证传输安全等功能,让你无需搭建一个后台,无需关心部署操作,只需引入一个 SDK 即可立即使用 Tinker。
市面上可能还有其他的一些热补丁服务,为什么我们需要选择 TinkerPatch 平台呢?
首先我们需要注册 TinkerPatch 平台账号,欢迎点击前往注册。
添加app,生成appkey
添加版本,如:1.0.0
项目下的build.gradle文件中
dependencies {
classpath 'com.android.tools.build:gradle:2.2.3'
classpath "com.tinkerpatch.sdk:tinkerpatch-gradle-plugin:1.2.2"
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
app下的build.gradle文件中
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
compile 'com.android.support:appcompat-v7:22.2.+'
provided("com.tinkerpatch.tinker:tinker-android-anno:1.9.2")
compile("com.tinkerpatch.sdk:tinkerpatch-android-sdk:1.2.2")
testCompile 'junit:junit:4.12'
}
然后在app目录下,创建tinkerpatch.gradle
(可以去后面的链接下载源码,把这个文件拷进去,或者直接复制下面代码)
tinkerpatch.gradle文件信息
apply plugin: 'tinkerpatch-support'
/**
* TODO: 请按自己的需求修改为适应自己工程的参数
*/
def bakPath = file("${buildDir}/bakApk/")
def baseInfo = "app-1.0.0-0304-14-24-28"// 注意!!! 改成对应的路径
def variantName = "release"
//def variantName = "debug"
/**
* 对于插件各参数的详细解析请参考
* http://tinkerpatch.com/Docs/SDK
*/
tinkerpatchSupport {
/** 可以在debug的时候关闭 tinkerPatch **/
tinkerEnable = true
reflectApplication = true
autoBackupApkPath = "${bakPath}"
appKey = "99621a0f8eea6666"// 注意!!! 需要修改成你的appkey
/** 注意: 若发布新的全量包, appVersion一定要更新 **/
appVersion = "1.0.0"
def pathPrefix = "${bakPath}/${baseInfo}/${variantName}/"
def name = "${project.name}-${variantName}"
baseApkFile = "${pathPrefix}/${name}.apk"
baseProguardMappingFile = "${pathPrefix}/${name}-mapping.txt"
baseResourceRFile = "${pathPrefix}/${name}-R.txt"
/**
* 若有编译多flavors需求, 可以参照: https://github.com/TinkerPatch/tinkerpatch-flavors-sample
* 注意: 除非你不同的flavor代码是不一样的,不然建议采用zip comment或者文件方式生成渠道信息(相关工具:walle 或者 packer-ng)
**/
}
/**
* 用于用户在代码中判断tinkerPatch是否被使能
*/
android {
defaultConfig {
buildConfigField "boolean", "TINKER_ENABLE", "${tinkerpatchSupport.tinkerEnable}"
}
}
/**
* 一般来说,我们无需对下面的参数做任何的修改
* 对于各参数的详细介绍请参考:
* https://github.com/Tencent/tinker/wiki/Tinker-%E6%8E%A5%E5%85%A5%E6%8C%87%E5%8D%97
*/
tinkerPatch {
ignoreWarning = false
useSign = true
dex {
dexMode = "jar"
pattern = ["classes*.dex"]
loader = []
}
lib {
pattern = ["lib/*/*.so"]
}
res {
pattern = ["res/*", "r/*", "assets/*", "resources.arsc", "AndroidManifest.xml"]
ignoreChange = []
largeModSize = 100
}
packageConfig {
}
sevenZip {
zipArtifact = "com.tencent.mm:SevenZip:1.1.10"
// path = "/usr/local/bin/7za"
}
buildConfig {
keepDexApply = false
}
}
appKey 和 appVersion 换成前面你申请得到的信息。
之后在app下的 build.gradle文件中 添加(引入文件)
apply from: 'tinkerpatch.gradle'
也可以看官方配置文档:http://tinkerpatch.com/Docs/SDK
as工具右边点击 Gradle --->点击展开目录,如图:
点击assembleRelease生成apk ,如下图: (如果出错 则需要关闭Instant Run )
打开显示补丁未修复消息。
先修改我们程序上面要修改的错误,我的只是测试,很简单(项目中你可以修改很多bug)
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}
private void initView(){
//未修复钱
//Toast.makeText(this, "补丁未修复", Toast.LENGTH_SHORT).show();
//修复后
Toast.makeText(this, "补丁已修复", Toast.LENGTH_SHORT).show();
}
}
在前面创建的tinkerpatch.gradle
文件中,修改补丁文件路径,前面生成的apk文件
def baseInfo = "app-1.1.0-0304-14-53-11"// 注意!!! 改成对应的路径
改好之后我们就可以生成修复补丁包了,点击tinkerPatchRelease 生成,如图:
生成补丁包,如图:
把生成的补丁包,在TinkerPatch平台发布,如图:
提交之后,就可以去打开你前面安装的未修复apk文件了,打开时就会自动下载补丁修复,
然后重新启动app就可以看到修复的效果了,如图:
TinkerPatch平台也可以看你的下载 合并的数据,如图:
appKey 和 appVersion 要对应,若发布新的全量包, appVersion一定要更新。
生成补丁文件之前,要修改补丁操作,修改指定修复文件路径。
Application类中 fetchPatchUpdate值要为true 时时访问后台补丁文件(项目中就不用,按时间段好点)
// 初始化TinkerPatch SDK, 更多配置可参照API章节中的,初始化SDK
TinkerPatch.init(tinkerApplicationLike)
.reflectPatchLibrary()
//向后台获取是否有补丁包更新,默认的访问间隔为3个小时
//若参数为true,即每次调用都会真正的访问后台配置
.fetchPatchUpdate(true)
.setPatchRollbackOnScreenOff(true)
.setPatchRestartOnSrceenOff(true);
// 每隔3个小时去访问后台时候有更新,通过handler实现轮训的效果
new FetchPatchHandler().fetchPatchWithInterval(3);
def variantName = "release"
//def variantName = "debug"
我的Demo中 debug版和 release版 (需要配置签名)我都测试成功了,可以下载参考
Github:https://github.com/DickyQie/android-tinker
官网源码:https://github.com/TinkerPatch/tinkerpatch-sample
相关信息: http://tinkerpatch.com/