android 集成tinker的gradle脚本

apply plugin: 'com.android.application'def javaVersion = JavaVersion.VERSION_1_7
def bakPath = file("${buildDir}/bakApk/") //指定基准文件存放位置android {compileSdkVersion 25buildToolsVersion "25.0.1"defaultConfig {applicationId "com.xin"minSdkVersion 15targetSdkVersion 25versionCode 1versionName "1.0"testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"multiDexEnabled true}sourceSets {main {jniLibs.srcDirs = ['libs']}}compileOptions {sourceCompatibility javaVersiontargetCompatibility javaVersion}//recommenddexOptions {jumboMode = true}signingConfigs {release {try {storeFile file("release.keystore")storePassword "testres"keyAlias "testres"keyPassword "testres"} catch (ex) {throw new InvalidUserDataException(ex.toString())}}}buildTypes {release {minifyEnabled truesigningConfig signingConfigs.releaseproguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'}}//真正的多渠道脚本支持productFlavors {googleplayer {manifestPlaceholders = [UMENG_CHANNEL_VALUE: "googleplayer"]}baidu {manifestPlaceholders = [UMENG_CHANNEL_VALUE: "baidu"]}productFlavors.all {flavor -> flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]}}
}dependencies {compile fileTree(dir: 'libs', include: ['*.jar'])androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {exclude group: 'com.android.support', module: 'support-annotations'})compile 'com.android.support:appcompat-v7:25.1.1'testCompile 'junit:junit:4.12'//生成appilcation时使用compile("com.tencent.tinker:tinker-android-lib:${TINKER_VERSION}") { changing = true }provided("com.tencent.tinker:tinker-android-anno:${TINKER_VERSION}") { changing = true }compile "com.android.support:multidex:1.0.1"compile 'com.squareup.okhttp3:okhttp:3.3.0' //okttp依赖compile 'de.hdodenhof:circleimageview:2.1.0'compile 'com.readystatesoftware.systembartint:systembartint:1.0.3'
}ext {tinkerEnable = truetinkerOldApkPath = "${bakPath}/app-0511-12-36-20"tinkerID = "1.0"tinkerApplyMappingPath = "${bakPath}/app-0511-12-36-20"tinkerApplyResourcePath = "${bakPath}/app-0511-12-36-20"tinkerBuildFlavorDirectory = "${bakPath}/app-0511-12-36-20"
}def buildWithTinker() {return ext.tinkerEnable
}def getOldApkPath() {return ext.tinkerOldApkPath
}def getApplyMappingPath() {return ext.tinkerApplyMappingPath
}def getApplyResourceMappingPath() {return ext.tinkerApplyResourcePath
}def getTinkerIdValue() {return ext.tinkerID
}def getTinkerBuildFlavorDirectory(){return ext.tinkerBuildFlavorDirectory
}if (buildWithTinker()) {//启用tinkerapply plugin: 'com.tencent.tinker.patch'//所有tinker相关的参数配置tinkerPatch {oldApk = getOldApkPath() //指定old apk文件径ignoreWarning = false   //不忽略tinker的警告,有则中止patch文件的生成useSign = true  //强制patch文件也使用签名tinkerEnable = buildWithTinker(); //指定是否启用tinkerbuildConfig {applyMapping = getApplyMappingPath()  //指定old apk打包时所使用的混淆文件applyResourceMapping = getApplyResourceMappingPath()  //指定old apk的资源文件tinkerId = getTinkerIdValue() //指定TinkerIDkeepDexApply = false}dex {dexMode = "jar" //jar、rawpattern = ["classes*.dex", "assets/secondary-dex-?.jar"] //指定dex文件目录loader = ["com.xin.tinker.MyTinkerApplication"] //指定加载patch文件时用到的类}lib {pattern = ["libs/*/*.so"]}res {pattern = ["res/*", "assets/*", "resources.arcs", "AndoridManifest.xml"]//指定tinker可以修改的资源路径ignoreChange = ["assets/sample_meta.txt"] //指定不受影响的资源路径largeModSize = 100 //资源修改大小默认值}packageConfig {configField("patchMessage", "fix the 1.0 version's bugs")configField("patchVersion", "1.0")}}List<String> flavors = new ArrayList<>();project.android.productFlavors.each { flavor ->flavors.add(flavor.name)}boolean hasFlavors = flavors.size() > 0/*** 复制基准包和其它必须文件到指定目录*/android.applicationVariants.all { variant ->/*** task type, you want to bak*/def taskName = variant.namedef date = new Date().format("MMdd-HH-mm-ss")tasks.all {if ("assemble${taskName.capitalize()}".equalsIgnoreCase(it.name)) {it.doLast {copy {def fileNamePrefix = "${project.name}-${variant.baseName}"def newFileNamePrefix = hasFlavors ? "${fileNamePrefix}" : "${fileNamePrefix}-${date}"def destPath = hasFlavors ? file("${bakPath}/${project.name}-${date}/${variant.flavorName}") : bakPathfrom variant.outputs.outputFileinto destPathrename { String fileName ->fileName.replace("${fileNamePrefix}.apk", "${newFileNamePrefix}.apk")}from "${buildDir}/outputs/mapping/${variant.dirName}/mapping.txt"into destPathrename { String fileName ->fileName.replace("mapping.txt", "${newFileNamePrefix}-mapping.txt")}from "${buildDir}/intermediates/symbols/${variant.dirName}/R.txt"into destPathrename { String fileName ->fileName.replace("R.txt", "${newFileNamePrefix}-R.txt")}}}}}}project.afterEvaluate {if (hasFlavors) {task(tinkerPatchAllFlavorRelease) {group = 'tinker'def originOldPath = getTinkerBuildFlavorDirectory()for (String flavor : flavors) {def tinkerTask = tasks.getByName("tinkerPatch${flavor.capitalize()}Release")dependsOn tinkerTaskdef preAssembleTask = tasks.getByName("process${flavor.capitalize()}ReleaseManifest")preAssembleTask.doFirst {String flavorName = preAssembleTask.name.substring(7, 8).toLowerCase() + preAssembleTask.name.substring(8, preAssembleTask.name.length() - 15)project.tinkerPatch.oldApk = "${originOldPath}/${flavorName}/${project.name}-${flavorName}-release.apk"project.tinkerPatch.buildConfig.applyMapping = "${originOldPath}/${flavorName}/${project.name}-${flavorName}-release-mapping.txt"project.tinkerPatch.buildConfig.applyResourceMapping = "${originOldPath}/${flavorName}/${project.name}-${flavorName}-release-R.txt"}}}task(tinkerPatchAllFlavorDebug) {group = 'tinker'def originOldPath = getTinkerBuildFlavorDirectory()for (String flavor : flavors) {def tinkerTask = tasks.getByName("tinkerPatch${flavor.capitalize()}Debug")dependsOn tinkerTaskdef preAssembleTask = tasks.getByName("process${flavor.capitalize()}DebugManifest")preAssembleTask.doFirst {String flavorName = preAssembleTask.name.substring(7, 8).toLowerCase() + preAssembleTask.name.substring(8, preAssembleTask.name.length() - 13)project.tinkerPatch.oldApk = "${originOldPath}/${flavorName}/${project.name}-${flavorName}-debug.apk"project.tinkerPatch.buildConfig.applyMapping = "${originOldPath}/${flavorName}/${project.name}-${flavorName}-debug-mapping.txt"project.tinkerPatch.buildConfig.applyResourceMapping = "${originOldPath}/${flavorName}/${project.name}-${flavorName}-debug-R.txt"}}}}}
}

Android 集成Tinker的gradle脚本相关推荐

  1. 【Android 修炼手册】Gradle 篇 -- Gradle 的基本使用

    预备知识 基本的 android 开发知识 了解 Android Studio 基本使用 看完本文可以达到什么程度 掌握 gradle 的基本使用 了解 gradle 及 android gradle ...

  2. 用Gradle脚本管理Manifest文件

    编译时区分不同的manifest 很多Android项目都会区分debug和release的manifest文件,以便调试,一些组件化的项目甚至有多个manifest文件来调试不同的组件.举个简单的例 ...

  3. 用Kotlin写Android Gradle脚本

    Android应用开发中,离不开Gradle脚本的构建.大部分Android开发同学忽视了脚本的力量,甚至有很大一部分同学不知道Gradle脚本是什么,用什么语言编写的:当然,也有相当一部分同学知道G ...

  4. 【错误记录】Android Studio 中编写 Gradle 编译脚本时没有 Groovy 代码提示 ( Cannot find declaration to go to )

    文章目录 一.报错信息 二.解决方案 一.报错信息 在 Android Studio 工程中 , 编辑 build.gradle 脚本时 , 无法进行代码提示 ; 按住 Ctrl 键 , 点击相应的属 ...

  5. 拥抱 Android Studio 之五:Gradle 插件开发

    实践出真知 笔者有位朋友.每次新学一门语言,都会用来写一个贪吃蛇游戏,以此来检验自己学习的成果.笔者也有相似体会.所谓纸上得来终觉浅,绝知此事要躬行.这一章.笔者将以开发和公布一个 Gradle 插件 ...

  6. Android 系统(198)---Android解放双手之Gradle自动化打包实战

    Android解放双手之Gradle自动化打包实战 https://www.jianshu.com/u/0111a7da544b 前言 解放双手,双击桌面快捷方式生成apk包,基于Gradle.bat ...

  7. Android集成腾讯X5浏览器内核库

    Android集成腾讯X5浏览器内核库 一.相关配置 1. 相关地址 2.引入SDK 3. AndroidManifest配置 二.Application中初始化内核 三.代码实现 1. 自定义带Pr ...

  8. Android 集成Chrome 浏览器内核 Crosswalk

    Crosswalk 内核的兴起与消亡 Android 4.4 版本之前,使用的是基于 androidWebKit 的 WebView 但实际上,由于 Android 的碎片化问题(大量存在不同的 An ...

  9. Android Studio构建时报gradle相关错误的解决办法

    坑1:Connection timed out: connect. If you are behind an HTTP proxy, please configure the proxy settin ...

  10. Android开发必备的Gradle知识

    前言 本篇文章来自本人以前的学习笔记,本来笔记语言比较生硬,之前有同事问我关于Gradle的知识,对我的笔记评价还不错.于是趁最近有时间对语言稍加润色,发出来供大家参考.这篇笔记来自<巧用Gra ...

最新文章

  1. 图片去噪:python,线性回归
  2. C++之肥大的界面之感想
  3. 大型互联网网站架构心得之二:并、换和其它(转)
  4. 面试题整理12 求字符串括号最大深度子串
  5. ZOJ-2770 Burn the Linked Camp 差分约束
  6. C# 进程Process基本的操作说明
  7. python程序设计语言的执行方式_编程语言用Python执行程序的4种方式
  8. as it exceeds the max of 500KB._我的英雄学院The “Ultra” Stage角色介绍第三弹!
  9. torch GPU分布式训练 模型并行
  10. java get resttemplate 请求传递数组_Java面试中遇到的坑【4】
  11. Notepad++--常用的插件
  12. 用js写卡牌游戏(四)
  13. Qt:Qt Widgets
  14. 数论 初等数论 北师大 张秀平 自学 学习 经验 视频 信息 奥赛 NOIP
  15. cloc统计代码字数
  16. sourcetree如何修改用户名
  17. 数学 - 已知三角形三边长度求面积
  18. oracle中的remark,Oracle cookie remark
  19. 如何读取PSD文件(photoshop)的图层......
  20. 魔百和 机顶盒 UNT401H_IPTV刷机 亲测成功!

热门文章

  1. CentOS 7 新建桌面快捷方式,实现一键跳转到指定的文件夹路径
  2. Liunx 切换用户This account is currently not available
  3. ImportError: DLL load failed while importing ie_api
  4. c语言中分号作用,在C语言中逗号、分号等的用法
  5. 悉尼大学计算机专业本科2019,2019悉尼大学申请条件
  6. 个性签名html,经典个性签名-2021最新QQ经典-QQ经典个性签名-腾牛个性网
  7. 【matlab算法原理详解】车牌识别算法
  8. 10张图带你彻底搞懂限流、熔断、服务降级
  9. SpringCloud面试题及答案(2021年SpringCloud面试题大全带答案)
  10. 磁珠 符号_史上最全面的磁珠知识大全