仅仅是为了 提取 一些 gradle语法
compileSdkVersion: "23" as int,
compileSdkVersion Integer.parseInt(ANDROID_BUILD_COMPILE_SDK_VERSION)
minSdkVersion Integer.parseInt(MIN_SDK_VERSION)
targetSdkVersion Integer.parseInt(ANDROID_BUILD_TARGET_SDK_VERSION)
versionCode Integer.parseInt(VERSION_CODE)
versionName VERSION_NAME
dexOptions {
javaMaxHeapSize '2g'
}
android.applicationVariants.all { variant ->
// 开始构建当前变体的即时时间
def currentTime = buildTime()
variant.outputs.each { output ->
println "**************************************"
println "currentTime: ${currentTime}"
println "variant: ${output.name}"
println "buildType: ${variant.buildType.name}"
println "flavor: ${variant.flavorName}"
println "manifest: ${output.processResources.manifestFile}"
println "**************************************"
//将生成的apk文件保存至根目录的_apk文件下
def outputFile = output.outputFile
if (outputFile != null && outputFile.name.endsWith('.apk')) {
File outputDirectory = new File("${projectDir}/../_apk");
def apkName = "${variant.buildType.name}/app-${output.name}-V${frameworkVersion}-#${buildNumber}-${currentTime}.apk"
output.outputFile = new File(outputDirectory, apkName)
}
// 如果开启混淆,则保留混淆的映射关系文件,方便release进行调试
if (variant.getBuildType().isMinifyEnabled()) {
variant.assemble.doLast {
copy {
from variant.mappingFile
into "${projectDir}/../_mappings"
rename { String fileName ->
"mapping-${output.name}-V${frameworkVersion}-#${buildNumber}-${currentTime}.txt"
}
}
}
}
}
}
def buildTime() {
return new Date().format("yyyy.MM.dd_HH.mm.ss", TimeZone.getTimeZone("UTC"))
}
import org.tmatesoft.svn.core.wc.*
import org.tmatesoft.svn.core.wc2.*
import org.tmatesoft.svn.core.*
apply plugin: 'com.android.application'
android {
compileSdkVersion 22
buildToolsVersion "22.0.1"
defaultConfig {
// 包名
applicationId "com.zhb.studiotest"
minSdkVersion 19
targetSdkVersion 22
versionCode 1
versionName "1.0.0.1"
manifestPlaceholders = [ CHANNEL_NAME:"Unspecified",APPLICATION_LABLE:"StudioTest"]
}
sourceSets.main.jni.srcDirs = []
sourceSets.main.jniLibs.srcDir 'src/main/libs'
def versionPropsFile = file('version.properties')
if (versionPropsFile.canRead()) {
def Properties versionProps = new Properties()
versionProps.load(new FileInputStream(versionPropsFile))
def prename = versionProps['VERSION_NAME_MAJOR']
def name = versionProps['VERSION_NAME_BUILD'].toInteger()
def runTasks = gradle.startParameter.taskNames
if ('buildAll' in runTasks) {
name++
}
versionProps['VERSION_NAME_BUILD']=name.toString()
versionProps.store(versionPropsFile.newWriter(), null)
defaultConfig {
versionName prename + name
}
}
signingConfigs {
releaseConfig {
// 写死签名密码
keyAlias 'xxx'
keyPassword 'xxxx'
storeFile file("keystore.jks")
storePassword 'xxxx'
// 要求输入签名密码
// storeFile file("keystore.jks")
// keyAlias System.console().readLine("\nkeyAlias: ")
// storePassword System.console().readLine("\nKeystore password: ")
// keyPassword System.console().readLine("\nKey password: ")
}
}
/*productFlavors {
xiaomi {
applicationId = "com.zhb.xiaomi"
manifestPlaceholders = [UMENG_CHANNEL_VALUE: name,APPLICATION_LABLE:name]
}
baidu {
applicationId = "com.zhb.baidu"
manifestPlaceholders = [UMENG_CHANNEL_VALUE: name,APPLICATION_LABLE:name]
}
wandoujia {
applicationId = "com.zhb.wandoujia"
manifestPlaceholders = [UMENG_CHANNEL_VALUE: name,APPLICATION_LABLE:name]
}
}*/
productFlavors {
wandoujia {}
baidu {}
//c360 {}
//uc {}
productFlavors.all { flavor ->
applicationId = "com.zhb."+name
flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name,APPLICATION_LABLE:name]
}
}
buildTypes {
debug {
buildConfigField "boolean", "LOG_DEBUG", "true"
versionNameSuffix "-debug"
// 混淆开关
minifyEnabled false
// 在Android中,每个应用程序中储存的数据文件都会被多个进程访问:
// 安装程序会读取应用程序的manifest文件来处理与之相关的权限问题;
// Home应用程序会读取资源文件来获取应用程序的名和图标;
// 系统服务会因为很多种原因读取资源(例如,显示应用程序的Notification);
// 此外,就是应用程序自身用到资源文件。
// 当资源文件通过内存映射对齐到4字节边界时,访问资源文件的代码才是有效率的。
zipAlignEnabled false
// 删除没用的资源文件
shrinkResources false
}
release {
buildConfigField "boolean", "LOG_DEBUG", "false"
minifyEnabled true
zipAlignEnabled true
shrinkResources true
// 混淆文件
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
// 签名
signingConfig signingConfigs.releaseConfig
applicationVariants.all { variant ->
// 修改APK名称
variant.outputs.each { output ->
def file = output.outputFile
def fileName = file.name
fileName = fileName.replace(".apk", "-V${defaultConfig.versionName}.apk")
fileName = fileName.replace("app", "StudioTest")
fileName = fileName.replace("debug-unaligned", "debug")
output.outputFile = new File(file.parent, fileName)
}
// 修改values.xml
variant.mergeResources.doLast(){
File valuesFile = file("${buildDir}/intermediates/res/merged/${variant.dirName}/values/values.xml")
String content = valuesFile.getText('UTF-8')
content = content.replaceAll("CHANNEL_NAME","${variant.productFlavors[0].name}")
valuesFile.write(content,'UTF-8')
}
}
}
}
}
def getSvnRevision(){
ISVNOptions options = SVNWCUtil.createDefaultOptions(true);
SVNClientManager clientManager = SVNClientManager.newInstance(options);
SVNStatusClient statusClient = clientManager.getStatusClient();
SVNStatus status = statusClient.doStatus(project.rootDir, false);
SVNRevision revision = status.getRevision();
return revision.getNumber();
}
task svnCommitVersionFile(){
description = "Commits a single file to an SVN repository"
doLast{
if (!project.hasProperty("commitMsg")){
ext.commitMsg = "//change version"
}
SvnOperationFactory svnOperationFactory = new SvnOperationFactory()
def authentication = SVNWCUtil.createDefaultAuthenticationManager("haibo.zhou", "hbzhou0622")
svnOperationFactory.setAuthenticationManager(authentication)
try {
SvnCommit commit = svnOperationFactory.createCommit()
commit.setSingleTarget(SvnTarget.fromFile(new File('app/version.properties')))
commit.setCommitMessage(commitMsg)
SVNCommitInfo commitInfo = commit.run()
println "Commit info: " + commitInfo
println "Commit message: " + commitMsg
} finally{
svnOperationFactory.dispose()
}
}
}
task generateZip(type: Zip){
def versionPropsFile = file('version.properties')
def Properties versionProps = new Properties()
versionProps.load(new FileInputStream(versionPropsFile))
def prename = versionProps['VERSION_NAME_MAJOR']
def name = versionProps['VERSION_NAME_BUILD'].toInteger()
def version = "V" + prename + name + "_(" + getSvnRevision() + ")"
from 'build/outputs'
archiveName "StudioTest_" + version + ".zip"
destinationDir file("build/release")
doLast(){
copy{
from ("build/release/"+archiveName)
into ("release")
}
if (!project.hasProperty("commitMsg")){
ext.commitMsg = "//upload compile result"
}
SvnOperationFactory svnOperationFactory = new SvnOperationFactory()
def authentication = SVNWCUtil.createDefaultAuthenticationManager("haibo.zhou", "hbzhou0622")
svnOperationFactory.setAuthenticationManager(authentication)
try {
SvnScheduleForAddition add = svnOperationFactory.createScheduleForAddition();
SvnTarget target = SvnTarget.fromFile(new File("app/release/"+archiveName));
add.addTarget(target);
add.setAddParents(true);
add.setForce(true);
add.run();
SvnCommit commit = svnOperationFactory.createCommit()
commit.setSingleTarget(SvnTarget.fromFile(new File("app/release/"+archiveName)))
commit.setCommitMessage(commitMsg)
SVNCommitInfo commitInfo = commit.run()
println "Commit info: " + commitInfo
println "Commit message: " + commitMsg
} finally{
svnOperationFactory.dispose()
}
}
}
// build script for jenkins only
task buildAll(){
println 'start build'
}
svnCommitVersionFile.dependsOn build
generateZip.dependsOn svnCommitVersionFile
buildAll.dependsOn generateZip
tasks.withType(JavaCompile) {
compileTask -> compileTask.dependsOn ndkBuild
}
task ndkBuild(type: Exec) {
workingDir file('src/main/jni')
commandLine getNdkBuildCmd()
}
task cleanNative(type: Exec){
workingDir file('src/main/jni')
commandLine getNdkBuildCmd(), 'clean'
}
clean.dependsOn cleanNative
def getNdkDir() {
if (System.env.ANDROID_NDK_ROOT != null)
return System.env.ANDROID_NDK_ROOT
Properties properties = new Properties()
properties.load(project.rootProject.file('local.properties').newDataInputStream())
def ndkdir = properties.getProperty('ndk.dir', null)
if (ndkdir == null)
throw new GradleException("NDK location not found. Define location with ndk.dir in the local.properties file or with an ANDROID_NDK_ROOT environment variable.")
return ndkdir
}
def getNdkBuildCmd() {
def ndkbuild = getNdkDir() + "/ndk-build"
ndkbuild += ".cmd"
return ndkbuild
}
dependencies {
// 工程目录里面的libs文件夹下所有的jar包
compile fileTree(dir: 'libs', include: ['*.jar'])
// 网络仓库里面的工程
//compile 'com.github.chrisbanes.photoview:library:1.2.4'
// 本地的工程
compile project(':PhotoView-master')
}