上周花了一天的时间,了解了下Anroid热更新的相关知识点。今天用nuwa方式初步实现了下,体验了下。感觉不错。
首先,可以通过这个blog:QQ空间热更新原理。先了解下热更新的基本原理与实现方式。实际上,热更新的设计理念比较简单,就是android app启动时候,进行多dex文件加载,且将需要修复的文件优先加载。具体的可以看看blog。
技术的魅力在于打破既有的逻辑,然后创新。通过网上的资料,我们也可以了解到热更新技术在tencent、alibaba、baidu中研究较为深入。在qihoo公司,也有较多的实践者。我觉得作为一个优秀的工程师,其创新能力是最优考核点。只可惜我所经历的三家公司都没有这样的同事。
下面,来简单记录下如何使用nuwa,来进行热更新。
1. 新建工程 NuwaUseDemo。
在工程的build.gradle文件中:
dependencies {
classpath 'com.android.tools.build:gradle:1.2.3'
classpath 'cn.jiajixin.nuwa:gradle:1.2.2'
修改下gradle版本,导入nuwaGradle。
2. 修改下module的build.gradle文件
上面导入:
apply plugin: "cn.jiajixin.nuwa"
依赖中导入:
compile 'cn.jiajixin.nuwa:nuwa:1.0.0'
最后添加:
nuwa {
//括号里是Application类以及要排除Application父类
excludeClass = ['com/nuwademo/MyApplication.class']
}
我们这里,新建了一个MyApplication
类,继承Application.java。需要在AndroidManifest.xml文件中注册下。
<application
android:name=".MyApplication"
3. MyApplication.java中,onCreate方法中,添加代码:
Nuwa.init(this);
Nuwa.loadPatch(this, Environment.getExternalStorageDirectory().getAbsolutePath().concat("/patch.jar"));
注:1)我们的patch文件叫:patch.jar,且放在sdcard目录下。
2)这里需要sdcard的读权限,(在这个点上吃了亏)
比如,我们的测试机器是Android L,其读权限添加:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
4. 新建一个类Controller.java。这个类的构造函数形参为Activity。在Activity的onCreate方法中,将此类的对象创建。
new Controller(this);
package com.nuwademo;
import android.content.Context;
import android.widget.Toast;
/**
* Created by vnbo on 16-10-31.
*/
public class Controller {
private Context mContext;
private Toast mToast;
public Controller(Context context) {
mContext = context;
mToast = new Toast(context);
sayHelloToNuwa();
useNuwaTest();
}
private void sayHelloToNuwa() {
mToast.makeText(mContext,"你好,女娲",Toast.LENGTH_LONG).show();
}
private void useNuwaTest() {
mToast.cancel();
new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(8000);
} catch (Exception e){
e.printStackTrace();
}
System.exit(-1);
}
}).start();
}
}
之后在手机上运行。
5. 复制此时nuwa文件夹。
将app/build/outputs/nuwa文件夹,复制到其他目录,比如:
vnbo@vnbo-Lenovo-IdeaPad-Y500:~/hotFixTest$
目录下。
6. 修改代码:
更改上面Controller类中的函数:useNuwaTest
private void useNuwaTest() {
mToast.cancel();
//添加一句话,模拟文件修改
mToast.makeText(mContext,"女娲working",Toast.LENGTH_LONG).show();
new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(8000);
} catch (Exception e){
e.printStackTrace();
}
System.exit(-1);
}
}).start();
}
7.制作patch.jar文件。
在Android Studio的terminal中操作也可以,由于习惯,我还是比较喜欢ubuntu的shell环境中操作。在我们刚才创建的工程下,执行如下命令:
./gradlew clean nuwaDebugPatch -P NuwaDir=/home/vnbo/hotFixTest/nuwa
log中显示successful,则表示patch构建成功。
注意点:a) ANDROID_HOME is not defined
解决:linux下 export ANDROID_HOME=/home/vnbo/android_env/sdk
windows下,set ANDROID_HOME=/home/vnbo/android_env/sdk
b ) gradle is not defined
解决: 个人主目录下添加:
GRADLE_HOME=/opt/android-studio2/gradle
export PATH=$PATH:$GRADLE_HOME/bin
c) 如果在build.gradle文件中,添加:
productFlavors {
tylauncher {
}
}
那么执行的命令为:
./gradlew clean nuwaTylauncherDebugPatch -P NuwaDir=/home/vnbo/hotFixTest/nuwa
8. 执行完上面命令之后,会有文件:./app/build/outputs/nuwa/debug/patch.jar 。
我们将这个文件push 到sdcard目录下。
adb push ./app/build/outputs/nuwa/debug/patch.jar /sdcard/
9. 重新启动应用程序即可看到效果了。