2016-07-04 67 views
1

我已成功增加版本代码。但我只想增加它,而我从菜单Build - > Generate signed APK生成已签名的apk。以下是我的gradle代码。仅在生成签名APK时自动增加版本代码

android { 
compileSdkVersion 23 
buildToolsVersion "23.0.3" 
def versionPropsFile = file('version.properties') 

if (versionPropsFile.canRead()) { 
    def Properties versionProps = new Properties() 

    versionProps.load(new FileInputStream(versionPropsFile)) 

    def code = versionProps['build.version'].toInteger() + 1 

    versionProps['build.version']=code.toString() 
    versionProps.store(versionPropsFile.newWriter(), null) 

    defaultConfig { 
     applicationId "com.test" 
     multiDexEnabled true 
     versionCode code 
     versionName "1.1" 
     minSdkVersion 18 
     targetSdkVersion 23 
    } 
} 
else { 
    throw new GradleException("Could not read version.properties!") 
} 

buildTypes { 
    release { 
     //minifyEnabled false 
     //proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt' 
    } 
    debug { 
     debuggable true 
    } 
} 
dexOptions { 
    incremental true 
    javaMaxHeapSize "4g" 
    preDexLibraries = false 
}} 

而且我version.properties文件包含以下信息: 小= 7 科= 4 主要= 10 build.version = 73

回答

1

我能够通过挂接我的代码做在assembleRelease gradle任务上。从Tim的blog获得帮助。以下是代码 -

apply plugin: 'com.android.application' 
android { 
     compileSdkVersion 23 
     buildToolsVersion "23.0.3" 

     def Properties versionProps = loadVersionFile() 
     defaultConfig { 
         applicationId "com.test" 
         multiDexEnabled true 
         versionCode getCode(versionProps) 
         versionName getName(versionProps) 
         minSdkVersion 18 
         targetSdkVersion 23 
     } 
     signingConfigs { 
         release { 
           storeFile file(".../keys.jks") 
           storePassword "..." 
           keyAlias "..." 
           keyPassword "..." 
         } 
     } 


     buildTypes { 
        release { 
          signingConfig signingConfigs.release 

          //minifyEnabled false 
          //proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt' 
        } 
        debug { 
          debuggable true 
        } 
     } 
     dexOptions { 
      ... 
     } 
    } 

def loadVersionFile() { 
        def versionPropsFile = file('version.properties') 
        def Properties versionProps 
        if (versionPropsFile.canRead()) { 

        versionProps = new Properties() 
        versionProps.load(new FileInputStream(versionPropsFile)) 

        } else { 
          throw new GradleException("Could not read             version.properties!") 
        } 
        return versionProps} 

def getCode(Properties versionProps) { 
     return versionProps['build.version'].toInteger()} 

def getName(Properties versionProps) { 
     return versionProps['product.version']} 


assembleRelease << { 
     def versionPropsFile = file('version.properties') 
     def code 
     def Properties versionProps 
     if (versionPropsFile.canRead()) { 
       versionProps = new Properties() 
       versionProps.load(new FileInputStream(versionPropsFile)) 
       code = versionProps['build.version'].toInteger() + 1 
     } else { 
      throw new GradleException("Could not read version.properties!") 
     } 

     versionProps['build.version'] = code.toString() 
     versionProps.store(versionPropsFile.newWriter(), null) 
     project.android.defaultConfig.versionCode code} 

allprojects { 
repositories { 
    jcenter() 
    mavenCentral() 
    flatDir { 
     dirs 'libs' 
    } 

    maven { 
     ... 
    } 
}} 

dependencies {...} 

apply plugin: 'com.google.gms.google-services' 
+0

你在哪里创建了version.properties文件?谢谢。 – Canato

+1

在项目的根。 – Dhrupal

+0

伟大的解决方案。让我只做一个小小的说明:当有多个具有独立构建文件的项目时,不能直接解决'assemleRelease',因为任务是动态创建的。 相反,你必须使用'afterEvaluate'! afterEvaluate {项目 - > project.tasks.assembleRelease << { ... }} 即使 – Balage1551

1

要找出你必须把gradle.properties

提取出完整的签约配置 第一种选择是,以提取出完整的签约配置到一个单独的用户文件。在gradle.properties创建一个新的属性:

MyProject.signing = /家庭/用户名/ .signing/myproject的

MyProject的不需要匹配任何应用程序名左右,你就可以在事实上无论你喜欢什么名称的财产。另外,如果你在Windows上使用\而不是/。

将您的密钥库放在/home/username/.signing/myproject.keystore。

现在在/home/username/.signing中创建一个文件名myproject.gradle(如果需要,创建该文件夹)。该文件将包含您的签名配置,该配置应该用于对软件包进行签名。这可能看起来如下:

android { 
    signingConfigs { 
    release { 
     storeFile file(project.property("MyProject.signing") + ".keystore") 
     storePassword "mypassword" 
     keyAlias "KeyAlias" 
     keyPassword "mypassword" 
    } 
    } 

    buildTypes { 
    release { 
     signingConfig signingConfigs.release 
    } 
    } 
} 

现在就配置实际的build.gradle文件中要使用这个签名配置项目。只需以下行添加到它:

if(project.hasProperty("MyProject.signing") 
    && new File(project.property("MyProject.signing") + ".gradle").exists()) { 
    apply from: project.property("MyProject.signing") + ".gradle"; 
} 

只有从文件中提取一些变量

project.ext { 
    uploadRepo = 'http://....' 
    uploadUser = 'myusername' 
    uploadPass = 'mypass' 
} 

现在确保你只用把配置的,如果加载后您使用的变量(如果有)文件。所以,你的build.gradle可能看起来像:

if(project.hasProperty("MyProject.signing") 
    && new File(project.property("MyProject.signing") + ".gradle").exists()) { 
    apply from: project.property("MyProject.signing") + ".gradle"; 

    // Configure stuff that relies on these variables 
    uploadArchives { 
    repositories.mavenDeployer { 
     repository(url: uploadRepo) { 
     authentication(userName: uploadUser, password: uploadPass) 
     } 
    } 
    // .. whatever else you need ... 
    } 

} 

只提取文件 一些字符串同样的路径添加到您的gradle.properties(让我们做一个完整路径这段时间):

MyProject的的.properties = /家庭/用户名/ .signing/myproject.properties

if(project.hasProperty("MyProject.properties") 
    && new File(project.property("MyProject.properties")).exists()) { 

    Properties props = new Properties() 
    props.load(new FileInputStream(file(project.property("MyProject.properties")))) 

    android { 
    signingConfigs { 
     release { 
     storeFile file(props['keystore']) 
     storePassword props['keystore.password'] 
     // ... 
     } 
    } 
    } 
} 

就产生一个普通的特性在/home/username/.signing/myproject.properties文件:

keystore =/path/to/my/keystore keystore。password = mypassword