【Gradle】build.gradle多渠道生成apk到指定目录,带时间,带zipAlign优化

这篇博客介绍了如何在Android Studio中使用Gradle配置build.gradle文件,以实现多渠道打包APK并将其保存到指定目录,同时确保每个APK都经过zipAlign优化。内容主要针对AS1.0-gradle2.1之后的版本问题进行了修正。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

build.gradle:

import java.text.DateFormat
import java.text.SimpleDateFormat
import java.util.regex.Pattern

configurations {
    deployerJars
}

buildscript {
    repositories {
        mavenCentral()
    }

    dependencies {
        classpath 'com.android.tools.build:gradle:0.4+'
    }
}

apply plugin: 'android'

dependencies {
	compile 'com.android.support:support-v4:18.0.0'
    compile project(':libraries:google-play-services_lib')
    compile project(':libraries:gradle-android-lib-sample')
	compile files('libs/zip4j_1.3.1.jar')
}

def buildTime() {
   	def df = new SimpleDateFormat("yyyyMMdd'-'HHmm")
   	df.setTimeZone(TimeZone.getDefault())
   	return df.format(new Date())
}

def apkName = "AndroidGradle"

android {
    compileSdkVersion 19

    buildToolsVersion "19.0.1"
    
    sourceSets {
        main {
            manifest.srcFile 'AndroidManifest.xml'
            java.srcDirs = ['src']
            resources.srcDirs = ['src']
            renderscript.srcDirs = ['src']
            assets.srcDirs = ['assets']
        }
    }
    
    signingConfigs {
        debug {
            storeFile file("debug.keystore")
        }

        release {
            storeFile file("release.keystore")
            storePassword "gradleandroid"
            keyAlias "commercial"
            keyPassword "gradleandroid"
        }
    }
    
    productFlavors {
		free {
		    packageName 'tutorial.jim.gradleandroid.free'
		}
		premium {
		    packageName 'tutorial.jim.gradleandroid.premium'
		}
	}
    
    buildTypes {
        release {
            runProguard true
            debuggable false
            jniDebugBuild false
            proguardFile getDefaultProguardFile('proguard-android.txt')
            signingConfig signingConfigs.release
        }
        
        android.applicationVariants.all { variant ->
    		def manifestFile = file("AndroidManifest.xml")
		    def pattern = Pattern.compile("versionName=\"(.+)\"")
		    def manifestText = manifestFile.getText()
		    def matcher = pattern.matcher(manifestText)
		    matcher.find()
		    def versionName = matcher.group(1)		    
		    pattern = Pattern.compile("versionCode=\"(.+)\"")
		    matcher = pattern.matcher(manifestText)
		    matcher.find()
		    def versionCode = matcher.group(1)		    
		    
		    if (variant.zipAlign) {
		    	variant.outputFile = new File("apk/"+apkName+"-V"+versionName+"-"+versionCode+"-"+variant.name+"-"+buildTime()+"-unaligned.apk");
            	variant.zipAlign.inputFile = variant.outputFile
                variant.zipAlign.outputFile = new File("apk/"+apkName+"-V"+versionName+"-"+versionCode+"-"+variant.name+"-"+buildTime()+".apk");
            } else {
            	variant.outputFile = new File("apk/"+apkName+"-V"+versionName+"-"+versionCode+"-"+variant.name+"-"+buildTime()+".apk");
            }

		}
    }
    
    android.sourceSets.free {
        res {
            srcDir 'res'
            srcDir 'res-free'
        }
    }
    android.sourceSets.premium {
        res {
            srcDir 'res'
            srcDir 'res-premium'
        }
    }
    
}



完整项目参考


注意:针对AS1.0-gradle2.1以后上面的代码可能会有问题,下面是我项目中修改过的

import java.text.DateFormat
import java.text.SimpleDateFormat
import java.util.regex.Pattern
apply plugin: 'com.android.application'
def buildTime() {
    def df = new SimpleDateFormat("yyyyMMdd'-'HHmm")
    df.setTimeZone(TimeZone.getDefault())
    return df.format(new Date())
}


android {
    compileSdkVersion 21
    buildToolsVersion "21.1.2"


    defaultConfig {
        applicationId "com.snscity.builddemo"
        minSdkVersion 15
        targetSdkVersion 21
        versionCode 1
        versionName "1.0"
    }


    signingConfigs {
        release {
            storeFile file('snscity.jks')
            storePassword '1q2w5t4r3e'
            keyAlias 'snscitytest'
            keyPassword '1q2w5t4r3e'
        }
    }


    buildTypes {
        release {
            minifyEnabled true
            zipAlignEnabled true
            signingConfig signingConfigs.release
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            buildConfigField "boolean", "SHOW_GREETINGS", "Boolean.parseBoolean(\"true\")"// java代码中可以通过如下方式获取 boolean isShowGreetings = BuildConfig.SHOW_GREETINGS;
        }
        debug {
            applicationIdSuffix ".debug"
            buildConfigField "boolean", "SHOW_GREETINGS", "Boolean.parseBoolean(\"false\")"
        }


        android.applicationVariants.all { variant ->
            def manifestFile = file("src/main/AndroidManifest.xml")
            def pattern = Pattern.compile("versionName=\"(.+)\"")
            def manifestText = manifestFile.getText()
            def matcher = pattern.matcher(manifestText)
            matcher.find()
            def versionName = matcher.group(1)
            pattern = Pattern.compile("versionCode=\"(.+)\"")
            matcher = pattern.matcher(manifestText)
            matcher.find()
            def versionCode = matcher.group(1)


            if (variant.buildType.zipAlignEnabled) {
                variant.outputs.each { output ->
                    def outputFile = output.outputFile
                    if (outputFile != null && outputFile.name.endsWith('.apk')) {
                        def fileName = "apk/" + applicationId + "-V" + versionName + "-" + versionCode + "-" + variant.name + "-" + buildTime() + ".apk"
                        output.outputFile = new File(outputFile.parent, fileName)
                    }
                }
            } else {
                variant.outputs.each { output ->
                    def outputFile = output.outputFile
                    if (outputFile != null && outputFile.name.endsWith('.apk')) {
                        def fileName = "apk/" + applicationId + "-V" + versionName + "-" + versionCode + "-" + variant.name + "-" + buildTime() + "-unaligned.apk"
                        output.outputFile = new File(outputFile.parent, fileName)
                    }
                }
            }
        }
    }
    productFlavors {
        internal {
            applicationId='com.snscity.builddemo.internal'
        }
        product {
            applicationId='com.snscity.builddemo.product'
        }
    }
}


dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:21.0.3'
}







评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值