tinker热修复gradle接入,app软件开发课程
keyAlias ‘china’
keyPassword ‘123456’
storeFile file(‘D:/work/release.jks’)
storePassword ‘123456’
} catch (ex) {
throw new InvalidUserDataException(ex.toString())
}
}
debug {
storeFile file(‘D:/work/debug.jks’)
keyAlias ‘china’
keyPassword ‘123456’
storePassword ‘123456’
}
}
defaultConfig {
applicationId “tinker.sample.android”
minSdkVersion 10
targetSdkVersion 22
versionCode 1
versionName “1.0.0”
/**
- you can use multiDex and install it in your ApplicationLifeCycle implement
*/
multiDexEnabled true
/**
buildConfig can change during patch!
we can use the newly value when patch
*/
buildConfigField “String”, “MESSAGE”, ““I am the base apk””
// buildConfigField “String”, “MESSAGE”, ““I am the patch apk””
/**
client version would update with patch
so we can get the newly git version easily!
*/
buildConfigField “String”, “TINKER_ID”, "“1.0"”
buildConfigField “String”, “PLATFORM”, ““all””
}
// aaptOptions{
// cruncherEnabled false
// }
// //use to test flavors support
// productFlavors {
// flavor1 {
// applicationId ‘tinker.sample.android.flavor1’
// }
//
// flavor2 {
// applicationId ‘tinker.sample.android.flavor2’
// }
// }
buildTypes {
release {
minifyEnabled true
signingConfig signingConfigs.release
proguardFiles getDefaultProguardFile(‘proguard-android.txt’), ‘proguard-rules.pro’
}
debug {
debuggable true
minifyEnabled false
signingConfig signingConfigs.debug
proguardFiles getDefaultProguardFile(‘proguard-android.txt’), ‘proguard-rules.pro’
}
}
sourceSets {
main {
jniLibs.srcDirs = [‘libs’]
}
}
}
def bakPath = file("${buildDir}/bakApk/")
/**
you can use assembleRelease to build you base apk
use tinkerPatchRelease -POLD_APK= -PAPPLY_MAPPING= -PAPPLY_RESOURCE= to build patch
add apk from the build/bakApk
*/
//老版本的文件所在的位置,大家也可以动态配置,不用每次都在这里修改
ext {
//for some
《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》
【docs.qq.com/doc/DSkNLaERkbnFoS0ZF】 完整内容开源分享
reason, you may want to ignore tinkerBuild, such as instant run debug build?
tinkerEnabled = true
//for normal build
//old apk file to build patch apk
tinkerOldApkPath = “${bakPath}/app-release-0313-16-16-16.apk”
//proguard mapping file to build patch apk
tinkerApplyMappingPath = “${bakPath}/app-release-0313-16-16-mapping.txt”
//resource R.txt to build patch apk, must input if there is resource changed
tinkerApplyResourcePath = “${bakPath}/app-release-0313-16-16-R.txt”
//only use for build all flavor, if not, just ignore this field
tinkerBuildFlavorDirectory = “${bakPath}/app-1018-17-32-47”
}
def getOldApkPath() {
return hasProperty(“OLD_APK”) ? OLD_APK : ext.tinkerOldApkPath
}
def getApplyMappingPath() {
return hasProperty(“APPLY_MAPPING”) ? APPLY_MAPPING : ext.tinkerApplyMappingPath
}
def getApplyResourceMappingPath() {
return hasProperty(“APPLY_RESOURCE”) ? APPLY_RESOURCE : ext.tinkerApplyResourcePath
}
//废弃
/*def getTinkerIdValue() {
return hasProperty(“TINKER_ID”) ? TINKER_ID : gitSha()
}*/
def buildWithTinker() {
return hasProperty(“TINKER_ENABLE”) ? TINKER_ENABLE : ext.tinkerEnabled
}
def getTinkerBuildFlavorDirectory() {
return ext.tinkerBuildFlavorDirectory
}
if (buildWithTinker()) {
apply plugin: ‘com.tencent.tinker.patch’
tinkerPatch {
/**
necessary,default ‘null’
the old apk path, use to diff with the new apk to build
add apk from the build/bakApk
*/
oldApk = getOldApkPath()
/**
optional,default ‘false’
there are some cases we may get some warnings
if ignoreWarning is true, we would just assert the patch process
case 1: minSdkVersion is below 14, but you are using dexMode with raw.
it must be crash when load.
case 2: newly added Android Component in AndroidManifest.xml,
it must be crash when load.
case 3: loader classes in dex.loader{} are not keep in the main dex,
it must be let tinker not work.
case 4: loader classes in dex.loader{} changes,
loader classes is ues to load patch dex. it is useless to change them.
it won't crash, but these changes can't effect. you may ignore it
case 5: resources.arsc has changed, but we don’t use applyResourceMapping to build
*/
ignoreWarning = true
/**
optional,default ‘true’
whether sign the patch file
if not, you must do yourself. otherwise it can’t check success during the patch loading
we will use the sign config with your build type
*/
useSign = true
/**
optional,default ‘true’
whether use tinker to build
*/
tinkerEnable = buildWithTinker()
/**
- Warning, applyMapping will affect the normal android build!
*/
buildConfig {
/**
optional,default ‘null’
if we use tinkerPatch to build the patch apk, you’d better to apply the old
apk mapping file if minifyEnabled is enable!
Warning:
you must be careful that it will affect the normal assemble build!
*/
applyMapping = getApplyMappingPath()
/**
optional,default ‘null’
It is nice to keep the resource id from R.txt file to reduce java changes
*/
applyResourceMapping = getApplyResourceMappingPath()
/**
necessary,default ‘null’
because we don’t want to check the base apk with md5 in the runtime(it is slow)
tinkerId is use to identify the unique base apk when the patch is tried to apply.
we can use git rev, svn rev or simply versionCode.
we will gen the tinkerId in your manifest automatic
*/
tinkerId = “1.0”/getTinkerIdValue()/
/**
if keepDexApply is true, class in which dex refer to the old apk.
open this can reduce the dex diff file size.
*/
keepDexApply = false
}
dex {
/**
optional,default ‘jar’
only can be ‘raw’ or ‘jar’. for raw, we would keep its original format
for jar, we would repack dexes with zip format.
if you want to support below 14, you must use jar
or you want to save rom or check quicker, you can use raw mode also
*/
dexMode = “jar”
/**
necessary,default ‘[]’
what dexes in apk are expected to deal with tinkerPatch
it support * or ? pattern.
*/
pattern = [“classes*.dex”,
“assets/secondary-dex-?.jar”]
/**
necessary,default ‘[]’
Warning, it is very very important, loader classes can’t change with patch.
thus, they will be removed from patch dexes.
you must put the following class into main dex.
Simply, you should add your own application {@code tinker.sample.android.SampleApplication}
own tinkerLoader, and the classes you use in them
*/
loader = [
//use sample, let BaseBuildInfo unchangeable with tinker
“tinker.sample.android.app.BaseBuildInfo”
]
}
lib {
/**
optional,default ‘[]’
what library in apk are expected to deal with tinkerPatch
it support * or ? pattern.
for library in assets, we would just recover them in the patch directory
you can get them in TinkerLoadResult with Tinker
*/
pattern = [“lib//.so”]
}
res {
/**
optional,default ‘[]’
what resource in apk are expected to deal with tinkerPatch
it support * or ? pattern.
you must include all your resources in apk here,
otherwise, they won’t repack in the new apk resources.
*/
pattern = [“res/", "assets/”, “resources.arsc”, “AndroidManifest.xml”]
/**
optional,default ‘[]’
the resource file exclude patterns, ignore add, delete or modify resource change
it support * or ? pattern.
Warning, we can only use for files no relative with resources.arsc
*/
ignoreChange = [“assets/sample_meta.txt”]
/**
default 100kb
for modify resource, if it is larger than ‘largeModSize’
we would like to use bsdiff algorithm to reduce patch file size
*/
largeModSize = 100
}
packageConfig {
/**
optional,default ‘TINKER_ID, TINKER_ID_VALUE’ ‘NEW_TINKER_ID, NEW_TINKER_ID_VALUE’
package meta file gen. path is assets/package_meta.txt in patch file
you can use securityCheck.getPackageProperties() in your ownPackageCheck method
or TinkerLoadResult.getPackageConfigByName
we will get the TINKER_ID from the old apk manifest for you automatic,
other config files (such as patchMessage below)is not necessary
*/
configField(“patchMessage”, “tinker is sample to use”)
/**
just a sample case, you can use such as sdkVersion, brand, channel…
you can parse it in the SamplePatchListener.
Then you can use patch conditional!
*/
configField(“platform”, “all”)
/**
- patch version via packageConfig
*/
configField(“patchVersion”, “1.0”)
}
//or you can add config filed outside, or get meta value from old apk
//project.tinkerPatch.packageConfig.configField(“test1”, project.tinkerPatch.packageConfig.getMetaDataFromOldApk(“Test”))
//project.tinkerPatch.packageConfig.configField(“test2”, “sample”)
/**
- if you don’t use zipArtifact or path, we just use 7za to try
*/
sevenZip {
/**
optional,default ‘7za’
the 7zip artifact path, it will use the right 7za with your platform
*/
zipArtifact = “com.tencent.mm:SevenZip:1.1.10”
/**
optiona
tinker热修复gradle接入,app软件开发课程相关推荐
- tinker热修复gradle接入,androidstudio开发app实例
tinkerPatch { /** necessary,default 'null' the old apk path, use to diff with the new apk to build a ...
- tinker热修复gradle接入
本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布 2021-04-29更新,最近在复习热修复,发现我的老代码不行了,所以把这篇文章更新一下 本篇是gradle接入 tinker的gi ...
- 【错误记录】集成 Tinker 热修复报错 ( No such property: variantConfiguration for class: .ApplicationVariantData )
文章目录 一.报错信息 二.解决方案 一.报错信息 接入 Tinker 热修复 , 使用如下 Gradle 插件 , // Tinker 的 tinker-patch-gradle-plugin 插件 ...
- android Tinker 热修复 乐固加固后友盟打多渠道包之后的补丁失效
继上一篇 android tinker 热修复使用及注意事项 生成了热修复的补丁; 现在的需求是这样的,我想把这个包用腾讯乐固加固,然后生成多渠道包,希望这个补丁能修复所有这些渠道的包,经过测试,直 ...
- 腾讯Tinker 热修复 Andriod studio 3.0 配置和集成(二)多渠道打包和补丁发布
腾讯Tinker 热修复 Andriod studio 3.0 多渠道打包和发布补丁方式推荐 本文说明 在之前我已经分享了Tinker 热修复的 Andriod studio3.0 初次配置和集成,时 ...
- 微信tinker 热修复
Tinker 是微信官方的Android热补丁解决方案,它支持动态下发代码.So库以及资源,让应用能够在不需要重新安装的情况下实现更新.当然,你也可以使用Tinker来更新你的插件. github:h ...
- Tinker热修复初探
听说热修复已经很久了,但这是第一次尝试去应用它.所以我对其它各种热修复也没什么了解,这里仅仅记下如何使用Tinker热修复. 对于Tinker热修复的介绍和问题这里也不写了,因为官方文档已经有了,戳这 ...
- 商城APP软件开发要素有哪些
商城APP软件体系是当今电商行业经常会运用的商城体系,既支撑企业对企业的运营形式,也支撑卖家对消费者的运营形式,便是现在常见的B2C,B2B的电商形式APP,跟着现在的互联网的遍及现在这些电商都是成为 ...
- APP定制开发:APP软件开发的语言和开发环境
APP软件开发是移动互联网开发公司常开发的一种手机应用系统,对于刚刚进入APP软件开发领域的新手来说,选择什么编程语言和需要什么开发环境来开发APP软件是常遇到的问题.下面亿合科技小编来为大家分享下: ...
最新文章
- JavaScript MVC框架和语言总结[infoq]
- php 验证url,php过滤器filter验证邮箱、url和ip地址等
- 微信群「斗图」总输,Python助我超神!
- js超出文字个数展示省略号
- 媒体格式分析之flv -- 基于FFMPEG
- quartus管脚分配后需要保存吗_嵌入式必须会的一些硬件面试题,要试一试吗?你过来呀!...
- (Origin教程)在图片和表格中插入Latex公式
- php fork demo,php多进程demo
- 哈工大在CoNLL上斩获全球第四,车万翔博士详解背后的技术细节
- 使用ARKit编码测量应用程序:对象和阴影
- Flixel Dame 坦克大战(三)完成基本逻辑
- MT7601U芯片怎么样?MT7601U处理器参数介绍
- word2vec-0.11.1安装包以及可能遇见的问题解决方法
- 戴尔电脑如何设置快速开机
- 【Ubuntu】安装 ibus 中文拼音输入法
- 遇到问题---pod使用pvc存储时报错---had volume affinity conflict
- “黄金州”不再宜居?这些城市被列入美国空气最差排行榜,近三分之一美国人受影响 | 美通社头条...
- MATLAB 点云粗糙度计算
- XCTF-攻防世界CTF平台-Reverse逆向类——56、tar-tar-binks(Mac平台下的64位动态链接共享库.dylib逆向)
- 引用Bootstrap无法显示样式,可能是安装的版本和参考的文档不相符
热门文章
- 毕业后第一份工作的工作总结_我希望我在第一份工作之前完成的事情
- 如何修改服务器远程端口
- 计算机缺失gfesdk.dll,xapofx1_5.dll 已加载但找不到入口点dellregisterserver
- 对最近用于细粒度车辆分类的深度学习架构的系统评估
- Linux 下时间同步
- 【NLP】自然语言处理的高级序列建模
- 小波变换原理_小波变换教程(一):为什么需要小波变换
- 创业路上,如何寻找合作伙伴?
- C语言伪随机序列生成函数Pseudo-random sequence generation functions
- 扩频通信——伪随机序列