256 lines
		
	
	
		
			16 KiB
		
	
	
	
		
			Groovy
		
	
	
	
	
	
			
		
		
	
	
			256 lines
		
	
	
		
			16 KiB
		
	
	
	
		
			Groovy
		
	
	
	
	
	
| // WinBoLL 应用签名配置
 | ||
| //
 | ||
| 
 | ||
| android {
 | ||
|     // 读取秘钥配置文件
 | ||
|     //
 | ||
|     def keyProps = new Properties()
 | ||
|     def keyPropsFile = rootProject.file("${keyPropsFilePath}")
 | ||
|     //println 'Test keystore path'
 | ||
|     //println 'KeyProsFile :' + Boolean.toString(keyPropsFile.exists())
 | ||
|     //assert(false)
 | ||
|     assert(keyPropsFile.exists())
 | ||
|     keyProps.load(new FileInputStream(keyPropsFile))
 | ||
|     
 | ||
|     // 配置签名
 | ||
|     signingConfigs {
 | ||
|         winboll {
 | ||
|             assert(keyProps['keyAlias'] != null && keyProps['keyPassword'] != null && keyProps['storeFile'] != null && keyProps['storePassword'] != null)
 | ||
|             keyAlias keyProps['keyAlias']
 | ||
|             keyPassword keyProps['keyPassword']
 | ||
|             storeFile keyProps['storeFile'] ? file(keyProps['storeFile']) : null
 | ||
|             storePassword keyProps['storePassword']
 | ||
|         }
 | ||
|     }
 | ||
|     buildTypes {
 | ||
|         release {
 | ||
|             signingConfig signingConfigs.winboll
 | ||
|         }
 | ||
|         debug {
 | ||
|             signingConfig signingConfigs.winboll
 | ||
|         }
 | ||
|     }
 | ||
|     
 | ||
|     flavorDimensions "WinBoLLApp"
 | ||
|     productFlavors {
 | ||
|         beta {
 | ||
|             // 检查编译标志位配置
 | ||
|             assert (winbollBuildProps['buildCount'] != null)
 | ||
|             dimension "WinBoLLApp"
 | ||
|             applicationIdSuffix ".beta"
 | ||
|             LocalDateTime localDateTimeNow = LocalDateTime.now(ZoneId.of("Asia/Shanghai"));
 | ||
|             versionNameSuffix "-beta" + winbollBuildProps['buildCount'] + "_" + localDateTimeNow.format('mmss')
 | ||
|         }
 | ||
|         stage {
 | ||
|             dimension "WinBoLLApp"
 | ||
|         }
 | ||
|     }
 | ||
| 
 | ||
|     // 应用包输出配置
 | ||
|     //
 | ||
|     android.applicationVariants.all { variant ->
 | ||
|         //
 | ||
|         // GitHub 应用包输出配置
 | ||
|         // 1. 配置 Beta Release 版应用包输出
 | ||
|         // 注意 :GitHub 打包使用 android.yml 的 "bash ./gradlew assembleBetaRelease" 命令
 | ||
|         //
 | ||
|         if(variant.flavorName == "beta" && variant.buildType.name == "release") {
 | ||
|             /* 后期管理预留代码 */
 | ||
|             /* 暂时没有需要的 GitHub 应用包输出配置 */
 | ||
|             /* GitHub 部分代码忽略 */
 | ||
|         }
 | ||
|         
 | ||
|         //
 | ||
|         // WinBoLL 应用包输出配置
 | ||
|         // 1. 配置 Stage Release 版应用包输出
 | ||
|         // 2. 配置 Beta Debug 版应用包输出
 | ||
| 	    //
 | ||
|         if((variant.flavorName == "beta" && variant.buildType.name == "debug")
 | ||
|         || (variant.flavorName == "stage" && variant.buildType.name == "debug")
 | ||
|         || (variant.flavorName == "stage" && variant.buildType.name == "release")) {
 | ||
|             println "Project root directory: " + project.rootDir.toString()
 | ||
|             println "Project root directory name : " + project.rootDir.name
 | ||
|             def outputPath="${project.projectDir.absolutePath}/build/outputs/apk/${variant.buildType.name}"
 | ||
|             //def outputFileName="${rootProject.name}_${versionName}.apk"
 | ||
|             def outputFileName=project.rootDir.name + "_${versionName}.apk"
 | ||
|             
 | ||
|             // 创建 WinBoLL Studio 发布接口文件夹
 | ||
|             File fWinBoLLStudioDir = file("/sdcard/WinBoLLStudio/APKs");
 | ||
|             if(!fWinBoLLStudioDir.exists()) {
 | ||
|                 //fWinBoLLStudioDir.mkdirs();
 | ||
|                 // 如果没有发布接口文件就不用进行APK发布和源码管理操作
 | ||
|                 // 当前编译环境不是 WinBoLL 主机, 以下将忽略APK发布和源码管理操作。
 | ||
|                 println 'The current compilation environment is not in WinBoLL host, and the following APK publishing and source management operations will be ignore.'
 | ||
|             } else {
 | ||
|                 /// WINBOLL 主机的 APK 发布和源码管理操作 ///
 | ||
|                 variant.getAssembleProvider().get().doFirst {
 | ||
|                     /* 后期管理预留代码 */
 | ||
|                 } //doFirst {
 | ||
|                 
 | ||
|                 // 编译输出后处理文件部分
 | ||
|                 //
 | ||
|                 variant.getAssembleProvider().get().doLast {
 | ||
|                         variant.outputs.forEach{ file->
 | ||
|                             // 如果正在调试,就拷贝到 WinBoLL 备份管理文件夹
 | ||
|                             // 
 | ||
|                             if(variant.flavorName == "beta"&&variant.buildType.name == "debug"){
 | ||
|                                 //File outBuildBckDir = new File(fWinBoLLStudioDir, "/${rootProject.name}/${variant.buildType.name}")
 | ||
|                                 File outBuildBckDir = new File(fWinBoLLStudioDir, "/" + project.rootDir.name + "/${variant.buildType.name}")
 | ||
|                                 // 创建目标路径目录
 | ||
|                                 if(!outBuildBckDir.exists()) {
 | ||
|                                     outBuildBckDir.mkdirs();
 | ||
|                                     println "Output Folder Created.(WinBoLLStudio) : " + outBuildBckDir.getAbsolutePath()
 | ||
|                                 }
 | ||
|                                 if(outBuildBckDir.exists()) {
 | ||
|                                     copy{
 | ||
|                                         from file.outputFile
 | ||
|                                         into outBuildBckDir
 | ||
|                                         rename {
 | ||
|                                             String fileName -> "${outputFileName}"
 | ||
|                                         }
 | ||
|                                         println "Output APK (WinBoLLStudio): " + outBuildBckDir.getAbsolutePath() + "/${outputFileName}"
 | ||
|                                     }
 | ||
|                                     // 检查编译标志位配置
 | ||
|                                     assert (winbollBuildProps['buildCount'] != null)
 | ||
|                                     assert (winbollBuildProps['libraryProject'] != null)
 | ||
|                                     //构建计数增加
 | ||
|                                     int buildCount = Integer.parseInt(winbollBuildProps['buildCount']) + 1;
 | ||
|                                     // 设置编译计数
 | ||
|                                     winbollBuildProps.setProperty("buildCount", Integer.toString(buildCount));
 | ||
|                                     
 | ||
|                                     //保存编译标志配置
 | ||
|                                     FileOutputStream fos = new FileOutputStream(winbollBuildPropsFile)
 | ||
|                                     winbollBuildProps.store(fos, "${winbollBuildPropsDesc}");
 | ||
|                                     fos.close();
 | ||
|                                     
 | ||
|                                     if(winbollBuildProps['libraryProject'] != "") {
 | ||
|                                         // 如果应用 build.properties 文件设置了类库模块项目文件名
 | ||
|                                         // 就拷贝一份新的编译标志配置到类库项目文件夹
 | ||
|                                         File libraryProjectBuildPropsFile = new File("$RootProjectDir/" + winbollBuildProps['libraryProject'] + "/build.properties")
 | ||
|                                         assert(winbollBuildPropsFile.exists())
 | ||
|                                         assert(libraryProjectBuildPropsFile.exists())
 | ||
|                                         java.nio.file.Path sourceFilePath = winbollBuildPropsFile.toPath();
 | ||
|                                         java.nio.file.Path targetFilePath = libraryProjectBuildPropsFile.toPath();
 | ||
|                                         // 使用copyTo()方法复制文件,如果目标文件存在会被覆盖,可选参数可以选择不覆盖
 | ||
| 	                                    java.nio.file.Files.copy(sourceFilePath, targetFilePath, java.nio.file.StandardCopyOption.REPLACE_EXISTING);
 | ||
|                                     }
 | ||
|                                 }
 | ||
|                             }
 | ||
|                             
 | ||
|                             // 如果正在发布,就拷贝到 WinBoLL 标签管理文件夹
 | ||
|                             //
 | ||
|                             if((variant.flavorName == "stage"&&variant.buildType.name == "debug")
 | ||
|                                 || (variant.flavorName == "stage"&&variant.buildType.name == "release")){
 | ||
|                                 // 发布 APK 文件
 | ||
|                                 //
 | ||
|                                 // 截取版本号的版本字段为短版本名
 | ||
|                                 String szVersionName = "${versionName}"
 | ||
|                                 String[] szlistTemp = szVersionName.split("-")
 | ||
|                                 String szShortVersionName = szlistTemp[0]
 | ||
|                                 //String szCommonTagAPKName = "${rootProject.name}_" + szShortVersionName + ".apk"
 | ||
|                                 String szCommonTagAPKName = project.rootDir.name + "_" + szShortVersionName + ".apk"
 | ||
|                                 println "CommonTagAPKName is : " + szCommonTagAPKName
 | ||
|                                 
 | ||
|                                 //File outTagDir = new File(fWinBoLLStudioDir, "/${rootProject.name}/tag/")
 | ||
|                                 File outTagDir = new File(fWinBoLLStudioDir, "/" + project.rootDir.name + "/tag/")
 | ||
|                                 // 创建目标路径目录
 | ||
|                                 if(!outTagDir.exists()) {
 | ||
|                                     outTagDir.mkdirs();
 | ||
|                                     println "Output Folder Created.(Tags) : " + outTagDir.getAbsolutePath()
 | ||
|                                 }
 | ||
|                                 
 | ||
|                                 if(outTagDir.exists()) {
 | ||
|                                     File targetAPK = new File(outTagDir, "${szCommonTagAPKName}")
 | ||
|                                     if(targetAPK.exists()) {
 | ||
|                                         // 标签版本APK文件已经存在,构建拷贝任务停止
 | ||
|                                         assert (!targetAPK.exists())
 | ||
|                                         // 可选择删除并继续输出APK文件
 | ||
|                                         //delete targetAPK
 | ||
|                                     }
 | ||
|                                     // 复制一个备份
 | ||
|                                     copy{
 | ||
|                                         from file.outputFile
 | ||
|                                         into outTagDir
 | ||
|                                         rename {
 | ||
|                                             String fileName -> "${outputFileName}"
 | ||
|                                         }
 | ||
|                                         println "Output APK (Tags): "+ outTagDir.getAbsolutePath() + "/${outputFileName}"
 | ||
|                                     }
 | ||
|                                     // 复制一个并重命名为短版本名
 | ||
|                                     copy{
 | ||
|                                         from file.outputFile
 | ||
|                                         into outTagDir
 | ||
|                                         rename {
 | ||
|                                             String fileName -> "${szCommonTagAPKName}"
 | ||
|                                         }
 | ||
|                                         println "Output APK (Tags): "+ outTagDir.getAbsolutePath() + "/${szCommonTagAPKName}"
 | ||
|                                     }
 | ||
|                                     // 检查编译标志位配置
 | ||
|                                     assert (winbollBuildProps['stageCount'] != null)
 | ||
|                                     assert (winbollBuildProps['publishVersion'] != null)
 | ||
|                                     assert (winbollBuildProps['buildCount'] != null)
 | ||
|                                     assert (winbollBuildProps['baseVersion'] != null)
 | ||
|                                     assert (winbollBuildProps['baseBetaVersion'] != null)
 | ||
|                                     assert (winbollBuildProps['libraryProject'] != null)
 | ||
|                                     
 | ||
|                                     // 设置类库的默认版本名
 | ||
|                                     winbollBuildProps.setProperty("publishVersion", "${versionName}");
 | ||
|                                     // Stage 发布计数增加
 | ||
|                                     int stageCount = Integer.parseInt(winbollBuildProps['stageCount']) + 1;
 | ||
|                                     winbollBuildProps.setProperty("stageCount", Integer.toString(stageCount));
 | ||
|                                     // 设置类库的默认Beta版本名
 | ||
|                                     winbollBuildProps.setProperty("baseBetaVersion", winbollBuildProps['baseVersion'] + "." + Integer.toString(stageCount));
 | ||
|                                     // 构建计数重置
 | ||
|                                     winbollBuildProps.setProperty("buildCount", "0");
 | ||
|                                     
 | ||
|                                     //保存编译标志配置
 | ||
|                                     FileOutputStream fos = new FileOutputStream(winbollBuildPropsFile)
 | ||
|                                     winbollBuildProps.store(fos, "${winbollBuildPropsDesc}");
 | ||
|                                     fos.close();
 | ||
|                                     
 | ||
|                                     if(winbollBuildProps['libraryProject'] != "") {
 | ||
|                                         // 如果应用 build.properties 文件设置了类库模块项目文件名
 | ||
|                                         // 就拷贝一份新的编译标志配置到类库项目文件夹
 | ||
|                                         File libraryProjectBuildPropsFile = new File("$RootProjectDir/" + winbollBuildProps['libraryProject'] + "/build.properties")
 | ||
|                                         assert(winbollBuildPropsFile.exists())
 | ||
|                                         assert(libraryProjectBuildPropsFile.exists())
 | ||
|                                         java.nio.file.Path sourceFilePath = winbollBuildPropsFile.toPath();
 | ||
|                                         java.nio.file.Path targetFilePath = libraryProjectBuildPropsFile.toPath();
 | ||
|                                         // 使用copyTo()方法复制文件,如果目标文件存在会被覆盖,可选参数可以选择不覆盖
 | ||
|                                         java.nio.file.Files.copy(sourceFilePath, targetFilePath, java.nio.file.StandardCopyOption.REPLACE_EXISTING);
 | ||
|                                     }
 | ||
|                                     
 | ||
|                                     // 提交新的编译标志配置
 | ||
|                                     def resultCommitBuildFlag = exec {
 | ||
|                                         commandLine 'bash', '--', "${RootProjectDir}/${bashCommitAppPublishBuildFlagInfoFilePath}", "${RootProjectDir}", "${versionName}", variant.buildType.name , rootProject.name
 | ||
|                                     }
 | ||
|                                     // 检查bash命令的返回值(假设非零表示失败)
 | ||
|                                     assert(resultCommitBuildFlag.getExitValue() == 0)
 | ||
|                                 }
 | ||
|                             } //  if(variant.buildType.name == "release"){
 | ||
|                             
 | ||
|                             // 如果公共目录存在就拷贝到公共目录并重命名为app.apk
 | ||
|                             //
 | ||
|                             File outCommonDir = new File("/sdcard/AppProjects")
 | ||
|                             String commandAPKName = "app.apk"
 | ||
|                             if(outCommonDir.exists()) {
 | ||
|                                 copy{
 | ||
|                                     from file.outputFile
 | ||
|                                     into outCommonDir
 | ||
|                                     rename {
 | ||
|                                         String fileName -> "${commandAPKName}"
 | ||
|                                     }
 | ||
|                                     println "Output APK (Common): " + outCommonDir.getAbsolutePath() + "/${commandAPKName}"
 | ||
|                                 }
 | ||
|                             }
 | ||
|                             
 | ||
|                         
 | ||
|                     }
 | ||
| 	            }// End of (variant.getAssembleProvider().get().doLast {)
 | ||
|             }/// WINBOLL 主机的 APK 发布和源码管理操作结束 ///
 | ||
|         }
 | ||
|         
 | ||
|     } // End of (android.applicationVariants.all { variant ->)
 | ||
| }
 | ||
| 
 | 
