Android 热修复是个热门技术,各大公司都推出了自己的热修复框架,阿里也推出了全新的Sophix,我决定写个Demo 测试一下,看了阿里的快速接入指南感觉挺简单的,没想到这么简单的事情需要注意的地方也不少,下面就说一下体验的整个过程以及整个过程中应该注意的问题:
一、编写有Bug的测试Demo
//testObj=new TestClass(); //testObj.str="hello world"; txt_test=(TextView)findViewById(R.id.txt_test); btn_click=(Button)findViewById(R.id.btn_click); txt_test.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(getApplicationContext(),"测试补丁",Toast.LENGTH_LONG).show(); Toast.makeText(getApplicationContext(),testObj.str,Toast.LENGTH_LONG).show(); } });
对象不进行声明点击按钮就会导致崩溃。
###二、按照快速接入方法接入 (1)打开链接:进行程序的相关配置和Sophix 补丁修复代码编写 (2) 先打包一个有bug 的apk,然后再修复Demo中的bug 再打包一个apk,下载阿里的补丁生成工具 (3) 用阿里的补丁生成工具生成补丁,然后上传到阿里云平台,并发布补丁。
(4) 安装有Bug 的Demo 然后重启,提示补丁应用成功时既测试成功。
###三、需要注意的地方
(1) 阿里建议采用setSecretMetaData(idSecret, appSecret, rsaSecret) 方法代替在AndroidManifest里的设置。AndroidManifest 配置内容如下:
理解错误: 我以为是可以删除配置内容直接利用函数即可,结果怎么测试都不行。正确的理解是配置内容还需要有,但是可以不设置配置的值,如下:
(2) 当把setDebug 设为false 时,怎么也不起作用。后来发现是因为签名不一致。特别提醒:一定要保存好签名,另外在打补丁的时候移动保持签名信息一致。
(3) 增加补丁应用成功后重启代码,如下:
Intent mStartActivity = new Intent(getBaseContext(), MainActivity.class); int mPendingIntentId = 123456; PendingIntent mPendingIntent = PendingIntent.getActivity(getBaseContext(), mPendingIntentId, mStartActivity, PendingIntent.FLAG_CANCEL_CURRENT); AlarmManager mgr = (AlarmManager)getBaseContext().getSystemService(Context.ALARM_SERVICE); mgr.set(AlarmManager.RTC, System.currentTimeMillis() + 100, mPendingIntent); System.exit(0);
感悟: 事情虽小,只有亲身实践过才知道其中的坑,真是应了那句话:“千看万看,不如经手一遍啊”!