热更新是一个非常常用的功能,我们在开发的时候很常用,其实相较于各个平台,我对RePlugin是比较钟意的,不过限于目前公司业务方面SDK的需求来说,还是得先从Tinker入手,因为,Thinker可以脱离Gradle即可实现,首先是Tinker的地址:
https://github.com/Tencent/tinker
然后,Thinker本身有两种接入方式,一种Gradle方式,一种命令行接入,Gradle接入方式我就不详细介绍了,其实官方文档都有,但是独立的命令行接入本身其实我个人觉得不是很清晰,所以现在来记录一下
命令行接入方式:
由于我是在AndroidStudio中演示的,所以截图都是AndroidStudio的
1、首先添加Thinker的依赖
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
// //可选,用于生成application类
// provided('com.tencent.tinker:tinker-android-anno:1.9.1')
//tinker的核心库
compile('com.tencent.tinker:tinker-android-lib:1.9.1')
}
因为我不准备让Gradle自动生成Application,而是自定义Application,所以第一个依赖我们是不需要的
2、自定义一个类,继承ApplicationLike
public class SimpleApplicationLike extends ApplicationLike {
public SimpleApplicationLike(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);
}
@TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH)
public void registerActivityLifecycleCallbacks(Application.ActivityLifecycleCallbacks callback) {
getApplication().registerActivityLifecycleCallbacks(callback);
}
}
3、自定义一个Application
public class SimpleApplication extends TinkerApplication {
public SimpleApplication() {
super(
ShareConstants.TINKER_ENABLE_ALL,
"com.morningtec.developtool.hotfix.SimpleApplicationLike");//填写上面继承了ApplicationLike的类
}
}
4、在Manifest中注册我们写的Application
5、首先把目前的项目打成apk,命名为old.apk
6、修改一下代码,再打成apk,命名为new.apk
5、下载Thinker的项目
6、在控制台输入:./gradlew buildTinkerSdk
7、在指定路径看到生成的文件之后,将刚才生成的old.apk和new.apk拷贝进去
8、修改tinker_config.xml
首先修改Application
然后修改签名
9、把自己的签名放进去
然后在这个目录执行命令
java -jar tinker-patch-cli-1.9.8.jar -old old.apk -new new.apk -config tinker_config.xml -out output
得到结果:
图中框出来的文件就是差分好的文件
然后,我来放一下MainActivity的代码
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.text).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
onCLick();
}
});
findViewById(R.id.text2).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
loadFix();
}
});
}
public void onCLick(){
Toast.makeText(this, "33333333", Toast.LENGTH_SHORT).show();
}
public void loadFix(){
TinkerInstaller.onReceiveUpgradePatch(getApplicationContext(),
Environment.getExternalStorageDirectory().getAbsolutePath() + "/patch_signed.apk");
}
老得代码是弹一排1,新代码是弹一排3,这里调用loadFix()之后,应用被关闭,再次打开,测试,得到想要的结果
这样就行了
注:接入编译时可能会报错,需要针对运行时生成进行一个兼容处理
这样即可,之后的深入的使用,之后继续更新