app/build.gradle
apply plugin: 'com.android.application'
def baseVername = '1.0.'
def baseVercode = 1 //单款盒子去所属App properties中配置其相应版本号
def baseBuildCnt = 1001
def appSource
def properties = new Properties()
def outputMapFile = ''
def outputApkFile = ''
def appLable = ''
def falsePkgName = ''
def defaultChannelName = "hole"
def defaultChannels = [0] //缺省只出BOX1渠道包即可
def getVersionName = { ->
//根据gitlab中的提交纪录次数,作为编译版本名字
try {
def stdout = new ByteArrayOutputStream()
exec {
commandLine 'git', 'rev-list', 'HEAD', '--count'
standardOutput = stdout
}
def new_baseVername = properties.getProperty("baseVername")
if (new_baseVername != null) {
baseVername = new_baseVername
}
def new_baseBuildCnt = properties.getProperty("baseBuildCnt")
if (new_baseBuildCnt != null) {
baseBuildCnt = Integer.parseInt(new_baseBuildCnt)
}
println('盒子模板App加载配置:baseVername -- ' + baseVername)
return baseVername + (Integer.parseInt(stdout.toString().trim()) + baseBuildCnt)
} catch (ignored) {
def versionName = properties.getProperty("appVerName")
println('盒子模板App加载配置:versionName -- ' + versionName)
return versionName
}
}
def getVersionCode = { ->
//根据gitlab中tag标签数,作为版本代码
try {
if (defaultVersionCode > 0) {
return defaultVersionCode
}
def code = new ByteArrayOutputStream()
exec {
commandLine 'git', 'tag', '--list'
standardOutput = code
}
return code.toString().trim().split("\n").size() + baseVercode
} catch (ignored) {
def versionCode = properties.getProperty("appVerCode")
println('盒子模板App加载配置:baseVercode -- ' + versionCode)
return versionCode
}
}
def loadLocalProperties = { ->
println(' ****************** AppTemplateBox脚本执行 ******************')
if (project.properties.containsKey("game") && null != project.properties.get("game")) {
File configFile = new File(projectDir, 'properties/app-' + project.properties.get("game") + '.properties');
if (configFile.exists()) {
properties.load(configFile.newDataInputStream())
println('盒子模板App加载配置:命令行指定配置文件,' + configFile.getName())
} else {
println('盒子模板App加载配置:未定义')
}
} else {
//加载配置文件
File appSetting = new File(projectDir, 'local.properties');
if (appSetting.exists()) {
println(appSetting.absolutePath)
properties.load(appSetting.newDataInputStream())
if (properties.getProperty('config') == null)
appSetting = null
else {
properties.load(new File(projectDir, properties.getProperty('config')).newDataInputStream())
println('盒子模板App加载配置:使用本地定义(local.properties),' + properties.get("config"))
}
}
if (appSetting == null || !appSetting.exists()) {
properties.load(new File(projectDir, 'app-hole.properties').newDataInputStream())
println('盒子模板App加载配置:未定义,使用缺省配置, ')
}
}
appLable = new String(properties.getProperty("appLable").getBytes("iso-8859-1"), "utf-8");
def channel = new String(properties.getProperty("defaultChannelName").getBytes("iso-8859-1"), "utf-8");
if (channel != null) {
defaultChannelName = channel
}
outputApkFile = properties.getProperty("applicationId") + "-v" + getVersionCode() + "-" + getVersionName() + "_"
// def temp = properties.getProperty("applicationId") + "-v" + getVersionCode()+"-"+getVersionName()+".apk"
outputMapFile = outputApkFile.replace(".apk", "-map.txt")
println('盒子模板App加载配置: --- outputApkFile --- ' + outputApkFile + "\t; outputMapFile:" + outputMapFile)
}
android {
compileSdkVersion rootProject.ext.android.compileSdkVersion
buildToolsVersion rootProject.ext.android.buildToolsVersion
loadLocalProperties()
lintOptions {
abortOnError = false
}
/* signingConfigs {
sign {
keyAlias 'iplay'
keyPassword 'passwd11'
storeFile file('../keystore_box_pay.jks')
storePassword 'passwd11'
}
}*/
applicationVariants.all {
def buildType = it.buildType.name
it.outputs.all {
if (buildType == "release") {
if (it.outputFile.name.endsWith("-release.apk")) {
it.getPackageApplication().outputDirectory = new File(project.rootDir.absolutePath + "/release")
}
}
def apkName = "${applicationId}-${getVersionName}-${buildType}" + defaultChannels[0] + ".apk"
it.outputFileName = apkName
}
}
signingConfigs {
sign {
keyAlias = 'Redbull'
keyPassword = 'Redbull123$%^'
storeFile = file('../keystore.jks')
storePassword = 'Redbull123$%^'
}
}
defaultConfig {
// println(" --> 当前编译应用输出版本名称为:" + getVersionName())
minSdkVersion rootProject.ext.android.minSdkVersion
targetSdkVersion rootProject.ext.android.targetSdkVersion
applicationId properties.getProperty("applicationId")
versionCode 100102
versionName getVersionName()
println(" --> 当前编译应用输出包名为:" + applicationId)
println(" --> 当前编译应用输出版本号为:" + getVersionCode())
println(" --> 当前编译应用输出版本名称为:" + getVersionName())
def auth = properties.getProperty("ProviderPrefix")
appSource = properties.getProperty("appSource")
buildConfigField("String", "HostAppPkgName", ('"' + properties.getProperty("HostAppPkgName") + '"'))
buildConfigField("String", "PluginCenterName", ('"' + properties.getProperty("PluginCenterName") + '"'))
buildConfigField("String", "PluginName", ('"' + properties.getProperty("PluginName") + '"'))
buildConfigField("String", "AdPluginName", ('"' + properties.getProperty("AdPluginName") + '"'))
buildConfigField("String", "gameObbMd5", ('"' + properties.getProperty("gameObbMd5") + '"'))
buildConfigField("boolean", "gameIsNeedObb", properties.getProperty("gameIsNeedObb"))
buildConfigField("String", "PayPluginName", ('"' + properties.getProperty("PayPluginName") + '"'))
def modesc = new String(properties.getProperty("modDesc").getBytes("iso-8859-1"), "utf-8");
buildConfigField("String", "modDesc", ('"' + modesc + '"'))
buildConfigField("String", "AdPkgName", ('"' + properties.getProperty("AdPkgName") + '"'))
buildConfigField("String", "AdgdtAid", ('"' + properties.getProperty("AdgdtAid") + '"'))
buildConfigField("String", "AdgdtPid", ('"' + properties.getProperty("AdgdtPid") + '"'))
buildConfigField("String", "appLable", ('"' + appLable + '"'))
buildConfigField("String", "applicationId", ('"' + properties.getProperty("applicationId") + '"'))
//打点
buildConfigField("String", "talkingDataId", ('"' + properties.getProperty("talkingDataId") + '"'))
buildConfigField("String", "tracker_id", ('"' + properties.getProperty("tracker_id") + '"'))
if (properties.getProperty("falsePkgName")) {
falsePkgName = properties.getProperty("falsePkgName")
} else {
falsePkgName = properties.getProperty("applicationId")
}
//真实包名
buildConfigField("String", "falsePkgName", ('"' + falsePkgName + '"'))
//沙盒认证
buildConfigField("String", "ProviderPrefix", ('"' + auth + '"'))
buildConfigField("String", "channel", ('"' + defaultChannelName + defaultChannels[0] + '"'))
manifestPlaceholders = [
appLable : appLable,
ApplicationId : properties.getProperty("applicationId"),
SANDBOX_AUTHORITIES : auth,
SANDBOX_AUTHORITIES_0: auth + "0",
SANDBOX_AUTHORITIES_1: auth + "1",
SANDBOX_AUTHORITIES_2: auth + "2",
SANDBOX_AUTHORITIES_3: auth + "3",
SANDBOX_AUTHORITIES_4: auth + "4",
SANDBOX_AUTHORITIES_5: auth + "5",
SANDBOX_AUTHORITIES_6: auth + "6",
SANDBOX_AUTHORITIES_7: auth + "7",
SANDBOX_AUTHORITIES_8: auth + "8",
SANDBOX_AUTHORITIES_9: auth + "9",
]
ndk {
abiFilter "armeabi"
}
}
sourceSets {
def appSourcePath = appSource.toString().split(",")
appSourcePath.each { sourceItem ->
main.assets.srcDirs += ['src/' + sourceItem + '/assets']
main.res.srcDirs += ['src/' + sourceItem + '/res']
main.java.srcDirs += ['src/' + sourceItem + '/java']
}
}
buildTypes {
release {
multiDexEnabled false
minifyEnabled true
proguardFiles 'proguard-rules.pro'
rootProject.ext.allProguards.each { name ->
proguardFiles.add(name)
println(' --> 编译使用混淆文件:' + name)
}
// 移除无用的resource文件
shrinkResources true
signingConfig = signingConfigs.sign
}
debug {
signingConfig = signingConfigs.sign
multiDexEnabled false
}
}
flavorDimensions "default"
productFlavors {
def flavers = [:]
def channelTimes = defaultChannels.size()
channelTimes.times { n ->
def thisChannelNum = defaultChannels[n]
def thisChannelName = defaultChannelName + thisChannelNum
// println('thisChannelName 多渠道: '+thisChannelName)
flavers[n] = "$thisChannelName" {
buildConfigField "String", "CHANNEL", ('"' + thisChannelName + '"')
}
}
}
}
task buildMyListFile {
// group 'build'
dependsOn 'assembleRelease'
doLast {
println("=====================buildMyListFile.doLast begin .=========================")
def intoFile = project.rootDir.getAbsolutePath() + "/release/"
def fromFile = project.buildDir.getAbsolutePath() + "/outputs/apk/"
def files = file(fromFile).listFiles().sort()
files.each { File file ->
if (file.isDirectory()) {
println " *** $file.name ***"
def temDir = fromFile + file.name + "/release"
// println("============"+temDir)
def tem_file = new File(temDir)
if (tem_file.exists()) {
def files_1 = tem_file.listFiles().sort()
files_1.each { File files_2 ->
if (files_2.getName().startsWith("apk-")) {
// println " *** $files_2.name ***"
copy {
from files_2
into intoFile
}
}
}
}
}
}
println("=====================buildMyListFile.doLast success.=========================")
}
}
task buildCompressed {
dependsOn 'buildMyListFile'
doLast {
println("=====================buildCompressed.doLast begin .=========================")
println(' ********************************** ' + System.getProperties().get("os.name") + '*********************')
println(' --> 打包已完成,开始后续工作 ...')
def fromFile = project.rootDir.getAbsolutePath() + "/release/"
def files = file(fromFile).listFiles().sort()
files.each { File file ->
println " *** $file.name ***"
if (file.getName().endsWith(".apk")) {
def newOutputApkFile = file.getName()
println("=====================build.buildCompressed " + newOutputApkFile + "=========================")
task(newOutputApkFile) {
def guardJarFile = new File(project.rootDir, 'AndResGuard/AndResGuard-cli-1.2.0.jar')
//AndResGuard jar包
def guardConfigFile = new File(project.rootDir, 'AndResGuard/config.xml')
//config.xml配置文件
def originApkFile = new File(project.rootDir, "release/" + newOutputApkFile)
//需要压缩的apk
def outputDir = new File(project.rootDir, "release/compressed/") //输出的位置
def zipalign = new File(project.rootDir, 'AndResGuard/zipalign')
//AndResGuard jar包
if (System.getProperties().get("os.name").startsWith('Mac')) {
zipalign = new File(project.rootDir, 'AndResGuard/zipalign.cmd')
//AndResGuard jar包
println " --> 资源压缩:使用mac版本zipalign," + zipalign
}
def chmod = """chmod 755 ${zipalign}""".execute()
chmod.waitFor()
println(" --> java -jar ${guardJarFile} ${originApkFile} -config ${guardConfigFile} -out ${outputDir} -zipalign ${zipalign}")
if (originApkFile.exists()) {
def proc = """java -jar ${guardJarFile} ${originApkFile} -config ${
guardConfigFile
} -out ${outputDir} -zipalign ${zipalign}""".execute()
proc.waitFor();
if (outputDir.exists()) {
outputDir.eachFile {
if (it.getName().endsWith("_signed_aligned.apk")) {
println " --> 资源压缩:保留结果文件 " + it.getName() + " :" + it.length()
it.renameTo(new File(project.rootDir, "release/" + newOutputApkFile.replace(".apk", "-compressed.apk")))
} else if (it.getName().startsWith("resource_mapping") && it.getName().endsWith(".txt")) {
println " --> 资源压缩:保留混淆映射文件 " + it.getName() + " :" + it.length()
it.renameTo(new File(project.rootDir, "release/" + outputMapFile.replace(".txt", ".rsc.txt")))
} else if (it.isDirectory()) {
println " --> 资源压缩:删除多余目录 " + it.getName()
it.deleteDir()
} else {
println " --> 资源压缩:删除多余文件 " + it.getName() + " :" + it.length()
it.delete()
}
}
}
if (proc.exitValue() != 0) {
println " --> 资源压缩:失败,错误日志:\n${proc.err.text}"
}
} else {
println " --> 资源压缩:失败,缺少原始APK文件"
}
File originalInput = new File(project.rootDir, "release/" + newOutputApkFile.replace(".apk", "-compressed.apk"))
File workDir = originalInput.getParentFile()
File releaseDir = new File(workDir, "release")
if (releaseDir.exists()) {
releaseDir.deleteDir()
}
/* project.exec {
executable = 'java'
args += '-jar'
args += new File(project.projectDir, '../channelrepacker.jar').getAbsolutePath()
args += "-source=" + originalInput.getAbsolutePath()
args += '-key=' + new File(project.projectDir, '../keystore_box_pay.jks').getAbsolutePath()
args += '-keyPasswd=passwd11'
args += '-keyAlias=passwd11'
println("::" + args)
}
*/
project.exec {
executable = 'java'
args += '-jar'
args += new File(project.projectDir, '../channelrepacker.jar').getAbsolutePath()
args += "-source=" + originalInput.getAbsolutePath()
args += '-key=' + new File(project.projectDir, '../keystore.jks').getAbsolutePath()
args += '-keyPasswd=Redbull123$%^'
args += '-channel=' + thisChannelName
args += '-keyAlias=Redbull'
println("::" + args)
}
}
}
}
println("=====================buildCompressed.doLast success.=========================")
}
}
repositories {
flatDir {
dirs 'libs'
}
mavenCentral()
google()
}
dependencies {
// compile files('libs/UM_SDK-1.1.2.0.jar')
api files('libs/javabase64-1.3.1.jar')
api files('libs/pluginInterface.jar') //不能删除这个jar,否则起不来
api files('libs/TalkingData_Analytics_Android_SDK_V2.2.48.jar') //打点的jar包
api 'b.c.a:YYhhSafconn:1.0.4'
api(name: 'open_ad_sdk', ext: 'aar')
api files('libs/android-query-full.0.26.7.jar')
//定义在config.gradle数组中,基于项目名称配置的所有dependencies,方便导入
if (rootProject.ext.deps.containsKey(project.name)) {
rootProject.ext.deps[project.name].split(',').each { dep ->
println(' --> ' + project.name + '定义的依赖库:' + rootProject.ext.dependencies[dep])
api(rootProject.ext.dependencies[dep]) {
/* if (rootProject.ext.excludeModule[dep] != null) {
exclude module: rootProject.ext.excludeModule[dep]
println(' --> ' + project.name + '<移除>特定依赖库:' + rootProject.ext.excludeModule[dep])
}
if (rootProject.ext.excludeGroup[dep] != null) {
exclude group: rootProject.ext.excludeGroup[dep]
println(' --> ' + project.name + '<移除>特定依赖组:' + rootProject.ext.excludeGroup[dep])
}*/
}
}
}
}
build.gradle 依赖库配置
allprojects {
repositories {
jcenter()
mavenCentral()
maven {
url "http://10.0.0.242:8081/artifactory/libs-release-local"
credentials {
username = "yyhd-repo"
password = "JkJheIGh28Kha0jqwUYT"
}
}
}
}
网友评论