现在热修复技术在Android开发中使用的越来越多,市场上关于热修复的框架也越来越多。Tinker 是微信官方的Android热补丁解决方案,它支持动态下发代码、so库以及资源,让应用能够在不需要重新安装的情况下实现更新。当然,你也可以使用 Tinker 来更新你的插件。Tinker对比市场上其他的一些框架:
因此我在自己的项目中加入热修复功能时选择了Tinker。
一、接入
首先在我们项目的 build.gradle 文件中加入:
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.3.3'
/**热修复导入*/
classpath "com.tinkerpatch.sdk:tinkerpatch-gradle-plugin:1.1.7"
}
}
然后在app的build.gradle 文件中加入:
dependencies {
provided("com.tinkerpatch.tinker:tinker-android-anno:1.7.11")
compile("com.tinkerpatch.sdk:tinkerpatch-android-sdk:1.1.7")
}
将在下载的tinkerpatch.gradle文件放入自己项目的app目录下。当然在在app的build.gradle需要加入apply from: 'tinkerpatch.gradle'
将这个文件引用。
打开tinkerpatch.gradle文件,里面有几个参数需要注意
/**
* TODO: 请按自己的需求修改为适应自己工程的参数
*/
def bakPath = file("${buildDir}/bakApk/")
def baseInfo = "app-1.1.0-0629-16-21-53"
def variantName = "release"
tinkerpatchSupport {
reflectApplication = true
appKey = "7d703361323c657d"
/** 注意: 若发布新的全量包, appVersion一定要更新 **/
appVersion = "1.0.0"
}
当你第一次打包上线的时候需要appKey设置为你在官网上申请到的appkey,如果你的项目有自己的application那么你就需要将reflectApplication参数设置为true,appVersion尽量与你项目的versionCode保持一致,每次我们的项目新版本上线记得更新它。打包以后记得将bakApk文件夹里面的文件保存起来。剩下的bakPath、baseInfo、variantName在接下来会讲到。
因为我们的reflectApplication参数设置的是true,接下来我们创建一个简单的application:
public class MyApplication extends Application {
private ApplicationLike tinkerApplicationLike;
@Override
public void onCreate() {
super.onCreate();
// 我们可以从这里获得Tinker加载过程的信息
tinkerApplicationLike = TinkerPatchApplicationLike.getTinkerPatchApplicationLike();
// 初始化TinkerPatch SDK, 更多配置可参照API章节中的,初始化SDK
TinkerPatch.init(tinkerApplicationLike)
.reflectPatchLibrary()
.setPatchRollbackOnScreenOff(true)
.setPatchRestartOnSrceenOff(true)
.setFetchPatchIntervalByHours(3);
TinkerPatch.with().fetchPatchUpdate(true);
}
}
里面的TinkerPatch.with().fetchPatchUpdate(true);表示去检查是否有补丁需要更新。放在application的oncreate方法中意味着当我们每次启动app的时候就会去检查是否有补丁需要更新。
接下来在我们的activity中写一段比较简单的代码:
public class MainActivity extends AppCompatActivity {
private TextView mTextView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void clickButton(View view) {
Toast.makeText(this, "这是测试,这里有BUG",Toast.LENGTH_LONG).show();
}
}
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="20dp"
android:text="热修复测试"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="20dp"
android:background="#00ff00"
android:onClick="clickButton"
android:padding="10dp"
android:text="点击"/>
</LinearLayout>
这里我们使用 gradlew assembleRelease命令打一个正式包,然后我们会在app/build/目录下发现一个bakApk文件夹,在继续打开会有一个release文件夹,里面会有3个文件
将这个apk安装到手机上打开:
将bakApk目录下的
文件夹保存下来。
接下来我们修改源代码
public void clickButton(View view) {
Toast.makeText(this, "这是测试,这里BUG通过热修复修复了", Toast.LENGTH_LONG).show();
}
将toast的内容改变一下。接下来就是如何打补丁包了:
这时候我们就需要修改上面提到的3个参数了。bakPath一般情况下不需要修改,baseInfo需要修改为刚刚你生成的bakApk包下的文件夹名,variantName如果你使用的是assembleRelease生成正式包就是release,否则就是bug。这3个参数是为了打补丁包时能够找到
这3个文件从而对比生成补丁包。改好以后就可以使用命令gradlew tinkerPatchRelease生成补丁包了。
然后找到
里面这个patch_signed_7zip.apk 就是我们需要使用的补丁包了。
打开Tinker官网
填写项目版本号。
选择发布补丁。这时候重启手机上的demo就会去下载补丁了,但补丁生效需要再次重启应用。
更多设置可以去http://www.tinkerpatch.com/Docs/api 查看。
Tinker简单接入到这就完成了。