Android studio3.0 命令行方式简单集成腾讯Tinker热修复插件

来源:互联网 发布:e商盟软件 编辑:程序博客网 时间:2024/06/08 18:13

简介:

关于热修复的介绍现在网上有很多,所以在此我就不过多BB,此篇博客的特点有两个,首先,这是一个针对Android studio3.0用户的博客,其次,这里采用的是命令行的方式,这是方式在工作中并不经常使用,相反,在工作中基本都是使用gradle配置的方式,但是命令行的方式相比于gradle是简单很多的,所以这就这是一个入门级的tinker集成,意在让大家了解tinker这个相对最为全面的热修复框架(高手请绕路,前方低能)。


1、在gradle.properties中配置我们tinker的版本。这种配置方式就相当于定义一个变量,用于指定我们导入依赖的版本,这样对于同一框架的多个依赖可以进行很好的版本控制。

粘贴板:TINKER_VERSION=1.9.0


2、module中导入依赖,在这里可以看到我们刚刚定义的变量在这里得以使用

粘贴板:

    //可选,用于生成application类    implementation("com.tencent.tinker:tinker-android-lib:${TINKER_VERSION}") { changing = true }    //tinker的核心库    annotationProcessor("com.tencent.tinker:tinker-android-anno:${TINKER_VERSION}") { changing = true }    compileOnly("com.tencent.tinker:tinker-android-anno:${TINKER_VERSION}") { changing = true }    implementation "com.android.support:multidex:1.0.2"

3、创建一个管理类,来管理我们Tinker中所有的api,方便我们的使用和以后对其他工程的植入。代码都有注释,这里就直接上代码了

package com.jiaxin.tinkerthree.tinker;import android.content.Context;import com.tencent.tinker.lib.tinker.Tinker;import com.tencent.tinker.lib.tinker.TinkerInstaller;import com.tencent.tinker.loader.app.ApplicationLike;/** * Created by Zzw on 2017/12/24.14:06 * * @function 对Tinker的所有api做一层封装 */public class TinkerManger {    //判断tinker是否已经初始化    private static boolean isInstalled = false;    private static ApplicationLike mAppLike;    /**     * 由外部调用完成tinker 的初始化     * @param applicationLike     */    public static void instaillTinker(ApplicationLike applicationLike){        mAppLike = applicationLike;        if (isInstalled){            return;        }        TinkerInstaller.install(mAppLike);//完成tinker初始化        isInstalled = true;    }    /**     * 完成patch文件加载     * @param path     */    public static  void loadPatch(String path){        if (Tinker.isTinkerInstalled()){            TinkerInstaller.onReceiveUpgradePatch(getApplicationContext(), path);        }    }    /**     * 通过applicationLike获取context     * @return     */    private static Context getApplicationContext(){        if (mAppLike != null){            return mAppLike.getApplication().getApplicationContext();        }        return null;    }}

3、根据官方的要求我们要使用ApplicationLike这个类,来生成application,所以我们这里创建一个类来继承他

package com.jiaxin.tinkerthree.tinker;import android.app.Application;import android.content.Context;import android.content.Intent;import android.support.multidex.MultiDex;import com.tencent.tinker.anno.DefaultLifeCycle;import com.tencent.tinker.loader.app.ApplicationLike;import com.tencent.tinker.loader.shareutil.ShareConstants;/** * Created by Zzw on 2017/12/24.14:11 */@DefaultLifeCycle(application = ".MyTinkerApplication" ,        flags = ShareConstants.TINKER_ENABLE_ALL , loadVerifyFlag = false)public class CustomTinkerLike extends ApplicationLike {    public CustomTinkerLike(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);        MultiDex.install(base);//使应用支持分包        TinkerManger.instaillTinker(this);    }}

注意这里我们使用了 一个注解,注解中后面两个参数可以认为是固定参数,第一个是我们指定的生成Application类的名字,这里我们叫他"MyTinkerApplication"

以上配置都完毕后我们编译整个工程,tinker的注解就会为我们生成一个MyTinkerApplication类。

4、清单文件中配置

这里的配置就是指定application为我们刚刚生成的"MyTinkerApplication",还有一个TINKER_ID的配置,这个主要是因为tinker在加载补丁文件的时候会只能的判断当前版本和补丁版本是否一致,如果不一致就会认为此补丁文件无效,就不会加载,所以我们这里做测试的话两次apk生成的时候只要这里不该动就好了

<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"    package="com.jiaxin.tinkerthree">    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />    <application
<!-- 此处指定application为tinker为我们生成的application -->        android:name=".tinker.MyTinkerApplication"        android:allowBackup="true"        android:icon="@mipmap/ic_launcher"        android:label="@string/app_name"        android:roundIcon="@mipmap/ic_launcher_round"        android:supportsRtl="true"        android:theme="@style/AppTheme">        <activity android:name=".MainActivity">            <intent-filter>                <action android:name="android.intent.action.MAIN" />                <category android:name="android.intent.category.LAUNCHER" />            </intent-filter>        </activity>        <meta-data            android:name="UMENG_CHANNEL"            android:value="${UMENG_CHANNEL_VALUE}" />
<!-- 此处为tinker配置当前的应用版本 -->        <meta-data            android:name="TINKER_ID"            android:value="tinker_id_123456"            />    </application></manifest>


5、以上步骤完成后,我们tinker的配置工作基本也就完成了,接下来只要使用我们的tinker管理类,生成两个不同版本的apk即可,这里因为tinker是支持布局文件的修改的,所以我模拟了点击一个按钮增加一个按钮的功能, 下面是我activity中的使用,布局就不写了哈

package com.jiaxin.tinkerthree;import android.os.Bundle;import android.os.Environment;import android.support.v7.app.AppCompatActivity;import android.util.Log;import android.view.View;import android.widget.Toast;import com.jiaxin.tinkerthree.tinker.TinkerManger;import java.io.File;public class MainActivity extends AppCompatActivity {    //log key    public static final String TAG = "myLog";    //file's end name    private static final String FILE_END = ".apk";    //patch file's path    private String mPatchDir;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        mPatchDir = Environment.getExternalStorageDirectory().getAbsolutePath();        Log.d(TAG, "onCreate: " + mPatchDir);        File file = new File(mPatchDir);        if (file.exists()){            Toast.makeText(this, "文件存在", Toast.LENGTH_SHORT).show();        }else{            boolean mkdirs = file.mkdir();            Toast.makeText(this, mkdirs ? "创建成功" : "创建失败", Toast.LENGTH_SHORT).show();        }    }    /**     * @click     * @param view     * load tinker patch for application     */    public void loadPatch(View view){        TinkerManger.loadPatch(getPathName());    }    //get tinker patch fileName    private String getPathName() {        return mPatchDir.concat("/tinker").concat(FILE_END);    }}

6、好,接下来我们只要改变布局文件生成两个版本不同的apk即可,我这里是在新的apk中添加了一个按钮,所以old版本的apk只有一个按钮,用于点击加载补丁文件,new版本的apk中在第一个按钮的基础上又添加了一个按钮。

7、两个apk版本生成成功后接下来就是生成补丁apk,我们采用的是命令行的方式,所以当然是要使用tinker为我们提供的工具,我们将所有要使用到的文件和新旧两个版本的apk文件以及jks签名文件放在同一个目录下(建议新建一个文件夹),然后打开命令行工具进入该文件夹,执行jar文件:

java -jar  tinker-patch-cli-1.7.7.jar


可以看到tinker提示我们该命令需要一堆参数,可以看到新旧版本apk文件我们已经准好了,只差一个tinker_config文件,我们打开这个文件,修改其中的loader为我们的application的名字,修改issue配置为我们签名的配置和密码



8、配置完毕后,打开命令行工具,指定好参数在执行刚刚的命令就可以在output文件夹中看到tinker为我们生成的apk文件,将patch_signed.apk(签名版的)这个文件改为我们一开始指定的文件名称(我这里是tinker.apk),再将其拷贝到我们一开始指定的路径,我这里指定的是sd下默认路径,安装old版本apk整个过程就完成了~~。

9、打开安装好的旧版本apk,点击按钮,程序会闪退,再次打开就会发现后添加的按钮就已经被添加上去了,这里闪退不用担心,这是tinker默认的设置,因为tinker在加载补丁文件完毕后,不重新启动是不会生效的。这个也可以通过配置来更改,具体可以通过查看相关文档来实现。

工具下载请戳我~~

阅读全文
'); })();
1 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 美亚沙发怎么样 凯源 凯源超话 凯源少年 凯源完结文 凯源play 凯源h 凯源r18 凯源燃气客服电话 凯源按压内壁软肉 凯源课桌play 凯源肉走一步顶一下 凯源囚禁软肉分身 凯源校园甜宠文 凯源甜腻宠文兄弟恋 凯源甜宠文完结 凯源天然气客服电话 凯源肉 凯源图片 凯源腐文 凯源吧 凯特王妃 凯特 凯特阿普顿 凯特戴琳斯 凯特芒果 凯特琳 凯特贝文 凯特芒 美尔凯特 范尼凯特 宫泽凯特 凯特摩丝 凯特尔 凯特哈德森 凯特驾校 凯特 戴琳斯 凯特琳娜 乔丹凯特 凯特英语 凯特人