Tencent / tinker

Tinker is a hot-fix solution library for Android, it supports dex, library and resources update without reinstall apk.
Other
17.15k stars 3.34k forks source link

参考Sample设置build.gradle后,Gradle同步会提示Could not find method buildConfig() #68

Closed c1024 closed 7 years ago

c1024 commented 8 years ago

参考Sample设置build.gralde后,Gradle同步会提示如下错误: Error:(470, 0) Could not find method buildConfig() for arguments [build_2nvfz79wfrqw4ca1gbowd7zbm$_run_closure6$_closure44@32764fff] on project ':demo' of type org.gradle.api.Project.

把 buildConfig配置注释掉就正常,去掉注释就出错。 对比了sample和我自己的工程,基本一致。

dodola commented 8 years ago

@c1024 发一下配置上来呗。

c1024 commented 8 years ago

@dodola 后面尝试rm -rf ~/.gradle/caches/ 删除gradle缓存,重新下载依赖就正常了。应该是之前下载的有问题

dodola commented 8 years ago

@c1024 哦哦,还有这问题

c1024 commented 8 years ago

@dodola 很奇怪,同样问题又出现了

c1024 commented 8 years ago

@dodola 尝试不同工程还是失败 提示: Error:(116, 0) Could not find method buildConfig() for arguments [build_aevuhzrs8kp39vpwkkatpeb9s$_run_closure4$_closure10@5500bdf8] on project ':app' of type org.gradle.api.Project.

失败配置如下

def gitTag = 'git describe --tags'.execute([], project.rootDir).text.trim() def gitCommitCount = 100 + Integer.parseInt('git rev-list --count HEAD'.execute([], project.rootDir).text.trim())

android { compileSdkVersion gradle.compileSdkVersion buildToolsVersion gradle.buildToolsVersion

lintOptions {
    // included for travis-ci integration
    abortOnError false
}
defaultConfig {
    applicationId "com.aitorvs.android.fingerlock"
    minSdkVersion gradle.minSdkVersion
    targetSdkVersion gradle.targetSdkVersion
    versionCode gitCommitCount
    versionName gitTag
}
buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
}

}

dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) // testCompile 'junit:junit:4.12' compile "com.android.support:appcompat-v7:$gradle.supportLibraryVersion" compile "com.android.support:percent:$gradle.supportLibraryVersion" compile project(':core') compile project(':dialog') }

def bakPath = file("${buildDir}/bakApk/")

/**

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 }

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 = false
    /**
     * 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

    /**
     * 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 = getTinkerIdValue()
    }

    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 = ["com.tencent.tinker.loader.*",
                  "tinker.sample.android.SampleApplication",
                  //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/armeabi/*.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")

    }
    //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"
        /**
         * optional,default '7za'
         * you can specify the 7za path yourself, it will overwrite the zipArtifact value
         */

// path = "/usr/local/bin/7za" } }

/**
 * task type, you want to bak
 */
def taskName = "debug"

/**
 * bak apk and mapping
 */
tasks.all {
    if ("assemble${taskName.capitalize()}".equalsIgnoreCase(it.name)) {
        it.doLast {
            copy {
                def date = new Date().format("MMdd-HH-mm-ss")
                from "${buildDir}/outputs/apk/${project.getName()}-${taskName}.apk"
                into bakPath
                rename { String fileName ->
                    fileName.replace("${project.getName()}-${taskName}.apk", "${project.getName()}-${taskName}-${date}.apk")
                }

                from "${buildDir}/outputs/mapping/${taskName}/mapping.txt"
                into bakPath
                rename { String fileName ->
                    fileName.replace("mapping.txt", "${project.getName()}-${taskName}-${date}-mapping.txt")
                }

                from "${buildDir}/intermediates/symbols/${taskName}/R.txt"
                into bakPath
                rename { String fileName ->
                    fileName.replace("R.txt", "${project.getName()}-${taskName}-${date}-R.txt")
                }
            }
        }
    }
}

}

ghost commented 8 years ago

把bak apk and mapping这段代码注释掉试试,这段代码在不同的项目中需要重新整理

JasonCheng213 commented 7 years ago

先把 buildConfig 这段代码注释了,同步完再改回来就不报错了