Tinker接入实践

一 . 准备工作

1. 在工程根目录中的build.gradle添加插件依赖

classpath "com.tinkerpatch.sdk:tinkerpatch-gradle-plugin:1.2.8"
dependencies {
       classpath 'com.android.tools.build:gradle:3.1.1'
       classpath 'com.jakewharton:butterknife-gradle-plugin:8.5.1'
       classpath 'com.github.dcendents:android-maven-gradle-plugin:1.5'
       // TinkerPatch 插件
       classpath "com.tinkerpatch.sdk:tinkerpatch-gradle-plugin:1.2.8"
       // NOTE: Do not place your application dependencies here; they belong
       // in the individual module build.gradle files
   }

2. 在app/build.gradle添加TinkerPatch SDK 库:

在defaultConfig里添加

multiDexEnabled true
multiDexKeepProguard file("tinkerMultidexKeep.pro")

// 多dex 打包的类库
    defaultConfig {
       applicationId "com.mingtao.mtedu"
       minSdkVersion 19
       targetSdkVersion 25
       multiDexEnabled true
       versionCode 28
       versionName "3.1.3"

       multiDexEnabled true
       multiDexKeepProguard file("tinkerMultidexKeep.pro") //keep specific classes using proguard syntax
       javaCompileOptions { annotationProcessorOptions { includeCompileClasspath = true } }
//        ndk {
//            abiFilters "arm64-v8a"
//            abiFilters "armeabi-v7a"
//        }
添加 TinkerPatch SDK 库的 denpendencies 依赖
// 多dex 打包的类库
   api 'com.android.support:multidex:1.0.3'
   compileOnly("com.tinkerpatch.tinker:tinker-android-anno:1.9.8")
   api("com.tinkerpatch.sdk:tinkerpatch-android-sdk:1.2.8")

3. 在app目录下新建tinkerpatch.gradle

// 多dex 打包的类库
  apply plugin: 'tinkerpatch-support'

/**
* TODO: 请按自己的需求修改为适应自己工程的参数
*/
def bakPath = file("${buildDir}/bakApk/")
def baseInfo = "app-3.1.3-0627-14-14-33"  //正常打包后在app/build/bakApk目录下的名字替换此处
def variantName = "release"

/**
* 对于插件各参数的详细解析请参考
* http://tinkerpatch.com/Docs/SDK
*/
tinkerpatchSupport {
   /** 可以在debug的时候关闭 tinkerPatch **/
   /** 当disable tinker的时候需要添加multiDexKeepProguard和proguardFiles,
    这些配置文件本身由tinkerPatch的插件自动添加,当你disable后需要手动添加
    你可以copy本示例中的proguardRules.pro和tinkerMultidexKeep.pro,
    需要你手动修改'tinker.sample.android.app'本示例的包名为你自己的包名, com.xxx前缀的包名不用修改
    **/
   tinkerEnable = true
   reflectApplication = true
   /**
    * 是否开启加固模式,只能在APK将要进行加固时使用,否则会patch失败。
    * 如果只在某个渠道使用了加固,可使用多flavors配置
    **/
   protectedApp = true
   /**
    * 实验功能
    * 补丁是否支持新增 Activity (新增Activity的exported属性必须为false)
    **/
   supportComponent = true

   autoBackupApkPath = "${bakPath}"

   appKey = "替换自己的appKey"

   /** 注意: 若发布新的全量包, appVersion一定要更新 **/
   appVersion = "3.1.3"

   def pathPrefix = "${bakPath}/${baseInfo}/${variantName}/"
   def name = "${project.name}-${variantName}"

   baseApkFile = "${pathPrefix}/${name}.apk"
   baseProguardMappingFile = "${pathPrefix}/${name}-mapping.txt"
   baseResourceRFile = "${pathPrefix}/${name}-R.txt"
   /**
    *  若有编译多flavors需求, 可以参照: https://github.com/TinkerPatch/tinkerpatch-flavors-sample
    *  注意: 除非你不同的flavor代码是不一样的,不然建议采用zip comment或者文件方式生成渠道信息(相关工具:walle 或者 packer-ng)
    **/
}
/**
* 用于用户在代码中判断tinkerPatch是否被使能
*/
android {
   defaultConfig {
       buildConfigField "boolean", "TINKER_ENABLE", "${tinkerpatchSupport.tinkerEnable}"
   }
}

/**
* 一般来说,我们无需对下面的参数做任何的修改
* 对于各参数的详细介绍请参考:
* https://github.com/Tencent/tinker/wiki/Tinker-%E6%8E%A5%E5%85%A5%E6%8C%87%E5%8D%97
*/
tinkerPatch {
   ignoreWarning = false
   useSign = true
   dex {
       dexMode = "jar"
       pattern = ["classes*.dex"]
       loader = []
   }
   lib {
       pattern = ["lib/*/*.so"]
   }

   res {
       pattern = ["res/*", "r/*", "assets/*", "resources.arsc", "AndroidManifest.xml"]
       ignoreChange = []
       largeModSize = 100
   }

   packageConfig {
   }
   sevenZip {
       zipArtifact = "com.tencent.mm:SevenZip:1.1.10"
//        path = "/usr/local/bin/7za"
   }
   buildConfig {
       keepDexApply = false
   }
}

并在app/build.gradle 最后面添加代码:

apply from: 'tinkerpatch.gradle'

4. 修改项目的application

-public class YourApplication extends Application {
+public class SampleApplicationLike extends DefaultApplicationLike {

@SuppressWarnings("unused")
@DefaultLifeCycle(application = "com.mingtao.mtedu.MTApplication",//把AndroidManifest.xml中application的name修改为这个
       flags = ShareConstants.TINKER_ENABLE_ALL,
       loadVerifyFlag = false)
public class SampleApplicationLike extends DefaultApplicationLike {

   public SampleApplicationLike(Application application, int tinkerFlags, boolean tinkerLoadVerifyFlag, long applicationStartElapsedTime, long applicationStartMillisTime, Intent tinkerResultIntent) {
       super(application, tinkerFlags, tinkerLoadVerifyFlag, applicationStartElapsedTime, applicationStartMillisTime, tinkerResultIntent);
   }
/**
    * install multiDex before install tinker
    * so we don't need to put the tinker lib classes in the main dex
    *
    * @param base
    */
   @TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH)
   @Override
   public void onBaseContextAttached(Context base) {
       super.onBaseContextAttached(base);
       context = getApplication();
       //you must install multiDex whatever tinker is installed!
       MultiDex.install(base);
   }

   @TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH)
   public void registerActivityLifecycleCallbacks(Application.ActivityLifecycleCallbacks callback) {
       getApplication().registerActivityLifecycleCallbacks(callback);
   }
@Override
   public void onCreate() {
       super.onCreate();
       initTinker();
       ......
     //添加自己的application中初始化的代码
}
private void initTinker() {
       if (BuildConfig.TINKER_ENABLE) {
           //开始检查是否有补丁,这里配置的是每隔访问3小时服务器是否有更新。
           TinkerPatch.init(this)
                   .reflectPatchLibrary()
                   .setPatchRollbackOnScreenOff(true)
                   .setPatchRestartOnSrceenOff(true)
                   .setFetchPatchIntervalByHours(3);


           //每隔3个小时去访问后台时候有更新,通过handler实现轮训的效果
           TinkerPatch.with().fetchPatchUpdateAndPollWithInterval();
       }
   }

}

在清单文件AndroidManifest.xml中把application的name改为SampleApplicationLike中定义的application全名

<application
       android:name="***.MTApplication"//SampleApplicationLike中定义的名字
       android:allowBackup="true"
       android:icon="@mipmap/ic_launcher"
       android:label="@string/app_name"
       android:supportsRtl="true"
       android:theme="@style/AppTheme.NoActionBar"> 

5. 在MainActivity或其他Activity中添加补丁下载代码

//加载补丁包
       TinkerInstaller.onReceiveUpgradePatch(getApplicationContext(), Environment.getExternalStorageDirectory().getAbsolutePath() + "/patch_signed_7zip");
       TinkerPatch.with().fetchPatchUpdate(true);

二 . 测试

1.打包

会在app/build/bakApk目录下生成一个文件夹


1.png

把app-release.apk安装到手机上

2.生成补丁

修改代码完成后在Android Studio右上角打开Gradle 双击tinkerPatchRelease
会在生成 app\build\outputs\apk\tinkerPatch

2.png

把生成的patch_signed_7zip.apk上传到Tinker后台


3.png

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容