Android 集成Tinker的Gradle配置文件
来源:互联网 发布:网络电影市场 编辑:程序博客网 时间:2024/06/06 14:01
gradle 配置文件:
apply plugin: 'com.android.application'def javaVersion = JavaVersion.VERSION_1_7def bakPath = file("${buildDir}/bakApk/") //指定基准文件存放位置android { compileSdkVersion 25 buildToolsVersion "25.0.1" defaultConfig { applicationId "com.xin" minSdkVersion 15 targetSdkVersion 25 versionCode 1 versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" multiDexEnabled true } sourceSets { main { jniLibs.srcDirs = ['libs'] } } compileOptions { sourceCompatibility javaVersion targetCompatibility javaVersion } //recommend dexOptions { 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 true signingConfig signingConfigs.release proguardFiles 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 = true tinkerOldApkPath = "${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()) { //启用tinker apply plugin: 'com.tencent.tinker.patch' //所有tinker相关的参数配置 tinkerPatch { oldApk = getOldApkPath() //指定old apk文件径 ignoreWarning = false //不忽略tinker的警告,有则中止patch文件的生成 useSign = true //强制patch文件也使用签名 tinkerEnable = buildWithTinker(); //指定是否启用tinker buildConfig { applyMapping = getApplyMappingPath() //指定old apk打包时所使用的混淆文件 applyResourceMapping = getApplyResourceMappingPath() //指定old apk的资源文件 tinkerId = getTinkerIdValue() //指定TinkerID keepDexApply = false } dex { dexMode = "jar" //jar、raw pattern = ["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.name def 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}") : bakPath from variant.outputs.outputFile into destPath rename { String fileName -> fileName.replace("${fileNamePrefix}.apk", "${newFileNamePrefix}.apk") } from "${buildDir}/outputs/mapping/${variant.dirName}/mapping.txt" into destPath rename { String fileName -> fileName.replace("mapping.txt", "${newFileNamePrefix}-mapping.txt") } from "${buildDir}/intermediates/symbols/${variant.dirName}/R.txt" into destPath rename { 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 tinkerTask def 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 tinkerTask def 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" } } } } }}
阅读全文
0 0
- Android 集成Tinker的Gradle配置文件
- Android 集成Tinker的gradle脚本
- 怎么快速集成 Android 热修复 Tinker Gradle Plugin
- Android热修复(微信tinker的集成)
- Android实战——Tinker的集成和使用
- Android 热修复 Tinker Gradle Plugin解析
- Android 热修复 Tinker Gradle Plugin解析
- android笔记之 tinker初步集成
- Android 三分钟集成微信热修复Tinker
- Android Tinker热修复集成解析
- Tinker集成和使用(一)Tinker简介和运行Tinker示例出现的问题
- 热更新Tinker的初次集成使用
- 热更新Tinker的集成使用
- 集成Tinker后的坑 , noclassdeffounderror异常
- Tinker的集成和多渠道打包
- 热更新Tinker 的研究与集成
- Android热修复框架Tinker的集成和遇到的问题
- android gradle配置文件
- SciPy-数值计算库
- sht10裸机程序分析(与cc2530进行通讯)
- Camera-Radar Fusion
- 关于IIS的Error503错误
- LeetCode Game With Sticks
- Android 集成Tinker的Gradle配置文件
- Spring的事务处理
- mysql 根据关联查询结果 修改 或者 添加 数据
- 初学数组并使用数组编写九九乘法表
- NAPT和NATD
- MyLayout和XIB或SB的混合使用方法
- IP地址 网段的划分
- matlab的使用问题(—):每次双击.m文件都会自动打开一个matlab程序
- JavaScript HTML DOM(二)