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'   //密码
        }
    }
}
以上配置完后:

Tinker增量更新二Tinker增量更新二

添加以上的东西,


Tinker增量更新二

添加如上东西,

完之后,配置就完成了,

在文档二中新建的bakapk文件夹用来放生成的apk和R文件的

,生成老的akp和R和新的apk和R

 

操作在下边

Tinker增量更新二

以上操作生成老的apk和R文件,双击选中的地方,会自动生成,

可以在Terminal(命令行)输入 gradle assembleRelease    代替双击操作

生成老的apk后还有R文件,

Tinker增量更新二

把老的apk名字和R的名字放入到如上位置.

Tinker增量更新二

如上操作,在添加了某些类,或者新的功能后,双击选中的地方,生成新的apk和R文件,

完成之后会自动比较老apk和新的apk生成补丁,补丁会自动放在

Tinker增量更新二

如上选中项是补丁,放入规定的文件夹下,如果是项目中的话,这个补丁会自动下载到规定的手机文件夹中.最后修复.