Tinker接入记录(一)

    热更新是一个非常常用的功能,我们在开发的时候很常用,其实相较于各个平台,我对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的项目

Tinker接入记录(一)_第1张图片

6、在控制台输入:./gradlew buildTinkerSdk

Tinker接入记录(一)_第2张图片

7、在指定路径看到生成的文件之后,将刚才生成的old.apk和new.apk拷贝进去

Tinker接入记录(一)_第3张图片

8、修改tinker_config.xml

首先修改Application

Tinker接入记录(一)_第4张图片

然后修改签名

Tinker接入记录(一)_第5张图片

9、把自己的签名放进去

Tinker接入记录(一)_第6张图片

然后在这个目录执行命令

java -jar tinker-patch-cli-1.9.8.jar -old old.apk -new new.apk -config tinker_config.xml -out output

得到结果:

Tinker接入记录(一)_第7张图片

图中框出来的文件就是差分好的文件

然后,我来放一下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()之后,应用被关闭,再次打开,测试,得到想要的结果

这样就行了


注:接入编译时可能会报错,需要针对运行时生成进行一个兼容处理

Tinker接入记录(一)_第8张图片

这样即可,之后的深入的使用,之后继续更新

你可能感兴趣的:(android框架工具)