前言
热修复,是目前一个比较热门的技术。它可以在app已上线的情况下,无需重新发布安装包,就可以修复bug。为线上修复紧急bug,提供了一个很便捷也比较人性化的途径。
传统开发与热修复开发的比较
传统开发:
从流程来看,传统的开发流程存在很多弊端:
重新发布版本代价太大;
用户下载安装成本太高;
BUG修复不及时,用户体验太差。
热修复开发:
而热修复的开发流程显得更加灵活,优势很多:
无需重新发版,实时高效热修复;
用户无感知修复,无需下载新的应用,代价小;
修复成功率高,把损失降到最低。
主流方案
目前比较主流、著名的有阿里巴巴的AndFix、Dexposed,腾讯QQ空间的超级补丁技术和微信的Tinker。
而今天,介绍的是微信的Tinker方案。
具体操作
//可选,用于生成application类
provided('com.tencent.tinker:tinker-android-anno:1.7.7')
//tinker的核心库
compile('com.tencent.tinker:tinker-android-lib:1.7.7')
生成apk
@DefaultLifeCycle(application = ".SimpleTinkerInApplication",
flags = ShareConstants.TINKER_ENABLE_ALL,
loadVerifyFlag = false)
public class SimpleTinkerInApplicationLike extends ApplicationLike {
public SimpleTinkerInApplicationLike(Application application, int tinkerFlags, boolean tinkerLoadVerifyFlag, long applicationStartElapsedTime, long applicationStartMillisTime, Intent tinkerResultIntent) {
super(application, tinkerFlags, tinkerLoadVerifyFlag, applicationStartElapsedTime, applicationStartMillisTime, tinkerResultIntent);
}
@Override
public void onBaseContextAttached(Context base) {
super.onBaseContextAttached(base);
}
@Override
public void onCreate() {
super.onCreate();
TinkerInstaller.install(this);
}
}
android:name=".SimpleTinkerInApplication"
如果字显示为红色,请build一下就可以了。
public class MainActivity extends AppCompatActivity {
private Context context;
private TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}
/**
* 初始化界面
*/
private void initView() {
context = this;
textView = (TextView) findViewById(R.id.main_tv);
}
/**
* 点击按钮 加载patch
*
* @param view
*/
public void loadPatch(View view) {
TinkerInstaller.onReceiveUpgradePatch(context,
Environment.getExternalStorageDirectory().getAbsolutePath() + "/patch_signed.apk");
}
}
这里需要权限,需要在清单文件中添加:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<?xml version="1.0" encoding="utf-8"?>
<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:id="@+id/main_tv"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="bug修复前!" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="loadPatch"
android:text="加载patch" />
</LinearLayout>
-applymapping mapping.txt
如果没有混淆代码,忽略此注意。只需要按照步骤生成新的apk就可以了。生成Patch
java -jar tinker-patch-cli-1.7.7.jar -old old.apk -new new.apk -config tinker_config.xml -out output
<loader value="tinker.sample.android.SampleApplication"/>
替换成自己的application。测试热修复效果
size 3324 verifyPatchMetaSignature fail