Tinker增量更新二
Tinker用gradle配置热修复:
在上文中的配置一样,把那些配置完后,执行以下的操作,完成grdle配置热修复:
在工程的gradle中添加:
dependencies { classpath ('com.tencent.tinker:tinker-patch-gradle-plugin:1.9.2') }
在app的gradle中添加插件:
apply plugin: 'com.tencent.tinker.patch'
添加完后sync new一下,可能会出个错,别担心,下面还没做完,
在build文件夹下建个bakapk文件夹(这个在以后会有用)
在app的gradle中最下方添加各种属性配置:
def bakPath = file("${buildDir}/bakapk/") //用到了上面创建的文件夹 ext{ tinkerOldApkPath = "${bakPath}/" tinkerEnabled = true; //不开启混淆 //tinkerApplyMappingPath = "${bakPath}/" tinkerApplyResourcePath = "${bakPath}/" //多渠道打包 //tinkerBuildFlavorDirectory = "${bakPath}/app-1018-17-32-47" } def getOldApkPath() { return ext.tinkerOldApkPath } //是否使用Tinker def buildWithTinker() { return ext.tinkerEnabled } def getApplyMappingPath() { return ext.tinkerApplyMappingPath } def getApplyResourceMappingPath() { return ext.tinkerApplyResourcePath } def getTinkerIdValue() { return "tinker_id_b168b32" } //多渠道打包 /*def getTinkerBuildFlavorDirectory() { return ext.tinkerBuildFlavorDirectory }*/ tinkerPatch{ tinkerEnable = buildWithTinker() oldApk = getOldApkPath() ignoreWarning = false useSign = true buildConfig{ //不开启混淆不用他 //applyMapping = getApplyMappingPath() applyResourceMapping = getApplyResourceMappingPath() tinkerId = getTinkerIdValue() keepDexApply = false //分包 暂时不用 太小 isProtectedApp = false //加固 暂时不加 } dex{ dexMode = "jar" pattern = ["classes*.dex", "assets/secondary-dex-?.jar"] //全路径Application,写自己的 loader = ["com.bwie.dongchangqi.tinkertest.MyTinkerApplication"] } lib{ pattern = ["lib/*/*.so"] } res{ pattern = ["res/*", "assets/*", "resources.arsc", "AndroidManifest.xml"] ignoreChange = ["assets/sample_meta.txt"] largeModSize = 100 } packageConfig{ configField ("version_name","1") configField ("change_log","添加了一些新功能") } }
继续往下添加:
/*------------此脚本在最下面复制 比较固定 用于生产老的apk文件--------------------*/ List<String> flavors = new ArrayList<>(); project.android.productFlavors.each { flavor -> flavors.add(flavor.name) } boolean hasFlavors = flavors.size() > 0 def date = new Date().format("MMdd-HH-mm-ss") android.applicationVariants.all { variant -> def taskName = variant.name 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.first().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") } } } } } }
然后在android{}中添加:
android { /*------------配置一个正式的签名文件 (可以快捷生产)------------------------*/ signingConfigs { config { keyAlias 'key0' //钥匙编号 keyPassword '123456' //密码 storeFile file('E:/BigOne/TinkerTest/app/tinkerdcq.jks') //自己的jks文件地址 storePassword '123456' //密码 } } }以上配置完后:
添加以上的东西,
添加如上东西,
完之后,配置就完成了,
在文档二中新建的bakapk文件夹用来放生成的apk和R文件的
,生成老的akp和R和新的apk和R
操作在下边
以上操作生成老的apk和R文件,双击选中的地方,会自动生成,
可以在Terminal(命令行)输入 gradle assembleRelease 代替双击操作
生成老的apk后还有R文件,
把老的apk名字和R的名字放入到如上位置.
如上操作,在添加了某些类,或者新的功能后,双击选中的地方,生成新的apk和R文件,
完成之后会自动比较老apk和新的apk生成补丁,补丁会自动放在
如上选中项是补丁,放入规定的文件夹下,如果是项目中的话,这个补丁会自动下载到规定的手机文件夹中.最后修复.