Code Monkey home page Code Monkey logo

tinkerpatch-flavors-sample's Introduction

tinkerpatch-easy-sample

Build Status Download Join Slack

多Flavors的Sample

在TinkerPatchSupport中添加如下字段, 如果你只是多渠道的需求,建议不要使用Flavor。多flavor必须在后台建立相应的基线工程(如下例子的命名规则为:appVersion_flavorName),每次生成补丁时也必须对应的生成多个分别上传。

这里增加了tinkerPatchAllFlavorsDebugtinkerPatchAllFlavorsRelease 用于一次性生成所有flavors的Patch包。

如果只是多渠道的需求,建议不要使用flavor的方式。首先其打包很慢,其次需要维护多个基线包,后期维护成本也很大。Tinker官方推荐 packer-ng-plugin或者 walle 来进行多渠道打包,其中walle是支持最新的SchemaV2签名的。

在tinkerpatchSupport增加如下字段:

    productFlavors {
        flavor {
            flavorName = "flavor1"
            // 后台需要按照每个flavor的appVersion来建立独立的工程,并单独下发补丁
            appVersion = "${tinkerpatchSupport.appVersion}_${flavorName}"

            pathPrefix = "${bakPath}/${baseInfo}/${flavorName}${variantName}/"
            name = "${project.name}-${flavorName}${variantName}"

            baseApkFile = "${pathPrefix}/${name}.apk"
            baseProguardMappingFile = "${pathPrefix}/${name}-mapping.txt"
            baseResourceRFile = "${pathPrefix}/${name}-R.txt"
        }

        flavor {
            flavorName = "flavor2"
            // 后台需要按照每个flavor的appVersion来建立独立的工程,并单独下发补丁
            appVersion = "${tinkerpatchSupport.appVersion}_${flavorName}"

            pathPrefix = "${bakPath}/${baseInfo}/${flavorName}${variantName}/"
            name = "${project.name}-${flavorName}${variantName}"

            baseApkFile = "${pathPrefix}/${name}.apk"
            baseProguardMappingFile = "${pathPrefix}/${name}-mapping.txt"
            baseResourceRFile = "${pathPrefix}/${name}-R.txt"
        }
    }

增加加固flavor的sample

这里默认大家有同时生成加固渠道与非加固渠道的需求,如果只是单一需要加固,可以直接在配置中开启protectedApp = true即可。

可以参考tinkerpatch.gradle文件:

    productFlavors {
        flavor {
            flavorName = "protect"
            appVersion = "${tinkerpatchSupport.appVersion}_${flavorName}"

            pathPrefix = "${bakPath}/${baseInfo}/${flavorName}-${variantName}/"
            name = "${project.name}-${flavorName}-${variantName}"

            baseApkFile = "${pathPrefix}/${name}.apk"
            baseProguardMappingFile = "${pathPrefix}/${name}-mapping.txt"
            baseResourceRFile = "${pathPrefix}/${name}-R.txt"

            /** 开启加固开关,上传此flavor的apk到加固网站进行加固 **/
            protectedApp = true
        }

        flavor {
            flavorName = "flavor1"
            appVersion = "${tinkerpatchSupport.appVersion}_${flavorName}"

            pathPrefix = "${bakPath}/${baseInfo}/${flavorName}-${variantName}/"
            name = "${project.name}-${flavorName}-${variantName}"

            baseApkFile = "${pathPrefix}/${name}.apk"
            baseProguardMappingFile = "${pathPrefix}/${name}-mapping.txt"
            baseResourceRFile = "${pathPrefix}/${name}-R.txt"
        }
    }

加固步骤:

  1. 生成开启protectedApp = true的基础包(这里假设此APK名为:protected.apk
  2. 上传protected.apk到相应的加固网站进行加固,并发布应用市场(请遵循各个加固网站步骤,一般为下载加固包-》重新签名-》发布重签名加固包)
  3. 在tinkerPatch后台根据appVersion建立相应的App版本(比如这里2个flavor,就需要建立2个App版本。App版本即为各自flavor中配置的appVersion)
  4. 生成各个flavor的patch包,并上传至相应的App版本中。

protectedApp=true, 这种模式仅仅可以使用在加固应用中

支持列表:

加固厂商 测试
乐加固 Tested
爱加密 Tested
梆梆加固 Tested
360加固 Tested
其他 请自行测试,只要满足下面规则的都可以支持

这里是否支持加固,需要加固厂商明确以下两点:

  1. 不能提前导入类;
  2. 在art平台若要编译oat文件,需要将内联取消。

相关文档

tinkerpatch-flavors-sample's People

Contributors

simpleton avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar

tinkerpatch-flavors-sample's Issues

protectedApp = true开启加固时生成补丁文件出错(在Activity里面新添加成员变量时会出错)

org.jf.util.ExceptionWithContext: Class Lcom/tinkerpatch/flavors/MainActivity$4; has already been interned
at org.jf.dexlib2.writer.builder.BuilderClassPool.internClass(BuilderClassPool.java:74)
at org.jf.dexlib2.writer.builder.DexBuilder.internClassDef(DexBuilder.java:139)
at com.tencent.tinker.build.decoder.DexDiffDecoder.generateChangedClassesDexFile(DexDiffDecoder.java:276)
at com.tencent.tinker.build.decoder.DexDiffDecoder.onAllPatchesEnd(DexDiffDecoder.java:195)
at com.tencent.tinker.build.decoder.ApkDecoder.patch(ApkDecoder.java:123)
at com.tencent.tinker.build.patch.Runner.tinkerPatch(Runner.java:65)
at com.tencent.tinker.build.patch.Runner.run(Runner.java:48)
at com.tencent.tinker.build.patch.Runner.gradleRun(Runner.java:41)
at com.tencent.tinker.build.patch.Runner$gradleRun.call(Unknown Source)
at com.tencent.tinker.build.gradle.task.TinkerPatchSchemaTask.tinkerPatch(TinkerPatchSchemaTask.groovy:84)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:73)
at org.gradle.api.internal.project.taskfactory.DefaultTaskClassInfoStore$StandardTaskAction.doExecute(DefaultTaskClassInfoStore.java:141)
at org.gradle.api.internal.project.taskfactory.DefaultTaskClassInfoStore$StandardTaskAction.execute(DefaultTaskClassInfoStore.java:134)
at org.gradle.api.internal.project.taskfactory.DefaultTaskClassInfoStore$StandardTaskAction.execute(DefaultTaskClassInfoStore.java:123)
at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:632)
at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:615)

我为什么用这个sample没法完成更新呢?

我在使用TinkerPatch的时候,首先参考了tinkerpatch-sample fork之后,从打包到更新补丁 测试成功;
但是在应用于我自己的项目的时候始终不能实现更新(我的多个项目,都使用到了Flavors,他们有不同的资源文件),我参照本项目针对Flavors部分的配置配置了自己的项目,仍然不能实现更新。

在这之后,我fork了本仓库,运行了本项目,修改APPKEY 打了flavor1的包,修改了ActionBar的Title,增加了一个TextView(这些是我对thinkerpatch-sample做的相同的步骤),更新没有成功。没有应用,没有下载数。这是为什么?

在上述流程中:始终使用的相同的环境(包括AndroidStudio,Gradle,Huawei API19的手机,相同的数据线,还有写代码的我,等)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.