Androidはgroovyでgradleでフィールドをカスタマイズする方法でversionNameバージョンをワンタッチで切り替える


一、問題:普段開発中によくある項目の状態を変更し、debug状態によって環境を区別し、コードにはBuildConfigを通しているが、gradleには似たような方法がない.以下にgradleファイルでフィールドをカスタマイズして状態切り替えを実現する方法を説明する(主にgroovyが熟知していない)
  • 例えばAndroidファイルで環境を判断:
  • if (BuildConfig.DEBUG) {
    	// TODO: xxx
    }else{
    	// TODO: xxx
    }
    

    以上の場合、コードでの使用は確かに便利ですが、build.gradleに移行し、例えば出力バージョンタイプに移行すると、buildTypesでbuildConfigFieldをカスタマイズして異なるバージョンタイプのversionNameを構成するしかありません.
  • gradleで環境を判別する
  • android.applicationVariants.all { variant ->
       println("${variant.name}-${variant.versionName}-${variant.versionCode}}.apk")
    }
    

    二、解決:gradleでフィールドをカスタマイズしてワンクリック切り替えを実現する
    面倒なことに、パッケージごとに複数のバージョン番号を変更し、別のconfig.gradleに統合して管理することで、パッケージ前の変更が容易になります.例えば、boolean値でdev情報を入力するかどうかを制御したい場合は、次のようにします.
    
    /**
     *     APP     
     * debug   dev  
     * @return   debug release     versionName
     */
    def getVersionName(){
        for (def property : getProperties()){
            System.out.println("  ------>>> ${property.key} : ${property.value}")
        }
    
        def versionType = hasProperty("isReleaseVersion") ? isReleaseVersion : ext.isReleaseVersion as boolean
        return versionType ? "1.0.0" : "1.0.0dev"
    }
    
    ext {
        // 1.appConfig
        complileSdkVersion = 29
        minSdkVersion = 21
        targetSdkVersion = 29
    
        // FIXME: 2020/8/19   apk     [isReleaseVersion]     
        isReleaseVersion = Boolean.TRUE //         , debug:false  release:true
        versionCode = 1 
    
        //   :            ,             
        versionName = getVersionName()
    
    	// 2.dependencies
    	 dependencies = 
    	 [
    	 	"key" : "value"
    	 ]
    }
    
    build.gradleで使用され、2つのgradleファイルが同じレベルのディレクトリの場合、パケットを導く必要はなく、rootProjectを直接使用することができます.
    android {
        compileSdkVersion rootProject.ext.complileSdkVersion
        defaultConfig {
            applicationId "com.xxx.xxx"
            minSdkVersion rootProject.ext.minSdkVersion
            targetSdkVersion rootProject.ext.targetSdkVersion
            versionCode rootProject.ext.versionCode
            versionName rootProject.ext.versionName //      versionName            
        }
    }
    

    三、結びの言葉:groovyは非常に強力な言語であり、自動化で開発中の多くの些細なことを軽減することができ、研究の過程で一つの問題に直面した: