一 属性了解
// 声明是Android程序,
//com.android.application 表示这是一个应用程序模块,可直接运行
//com.android.library 标识这是一个库模块,是依附别的应用程序运行
apply plugin: 'com.android.application'
android {
//编译sdk的版本,也就是API Level,例如API-19、API-20、API-21等等。
compileSdkVersion 26
//build tools的版本,其中包括了打包工具aapt、dx等等。
//这个工具的目录位于你的sdk目录/build-tools/下
buildToolsVersion '26.0.2'
//关闭Android Studio的PNG合法性检查
aaptOptions.cruncherEnabled = false
aaptOptions.useNewCruncher = false
defaultConfig { //默认配置
applicationId "com.hebbe.espressotest" //应用程序的包名
minSdkVersion 22 //最小sdk版本,如果设备小于这个版本或者大于maxSdkVersion将无法安装这个应用
targetSdkVersion 26 //目标sdk版本,充分测试过的版本(建议版本)
versionCode 1 //版本号,第一版是1,之后每更新一次加1
versionName "1.0" //版本名,显示给用户看到的版本号
//Instrumentation单元测试
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
// 开启multidex 是否可以分包
multiDexEnabled true
ndk {
//设置支持的SO库架构
abiFilters 'armeabi', 'x86', 'armeabi-v7a', 'x86_64', 'arm64-v8a'
}
}
//项目release和debug模式
buildTypes {
release {
//是否可以移出无用的java代码,默认为false
minifyEnabled false
//是否使用zipAlign优化apk,Android sdk包里面的工具,能够对打包的应用程序进行优化,让整个系统运行的更快
zipAlignEnabled false
//指定插件使用的混淆文件 //混淆的配置文件
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.releaseConfig
}
debug {
minifyEnabled false
zipAlignEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.releaseConfig
}
}
}
//指定当前项目的所有依赖关系:本地依赖、库依赖、远程依赖
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar']) //本地依赖
//远程依赖,com.android.support是域名部分,appcompat-v7是组名称,26.1.0是版本号
implementation 'com.android.support:appcompat-v7:26.1.0'
implementation 'com.android.support.constraint:constraint-layout:1.0.2'
testImplementation 'junit:junit:4.12' //声明测试用列库
androidTestImplementation 'com.android.support.test:runner:1.0.1'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'
}
二.签名配置 需要放在清单文件android {}里面
android{
//签名配置文件
signingConfigs {
releaseConfig {
storeFile file('liemi.jks')
storePassword '123456'
keyAlias 'liemi'
keyPassword '123456'
}
}
}
三.自定义打包配置主要对多个打包方式进行自定义,需要放在清单文件android {}里面和四配合使用,还需要将下面这句放在
defaultConfig里面开启
flavorDimensions "项目BASE" // 这里的名字好像随意,不是很清楚作用 -。-!
android{
//多维度打包
productFlavors{
app1{
//如果这里没有配置 appId、 versionCode等信息 则取“defaultConfig”里面的默认值
// applicationId "com.demo.one"
// versionCode 20190223
// versionName "1.1.4"
// 动态添加字符串资源到 strings.xml 跟直接在strings.xml 用法一致
resValue "string", "mapp_name", "App1"
// 定义常量 相当于 public static final String 可通过代码 “BuildConfig.APP_DIR” 调用
buildConfigField "String" , "APP_DIR" , '"app1"'
buildConfigField "int" , "APP_TYPE" , "1"
buildConfigField "Boolean", "ENVIRONMENT", "true"
// 清单文件 需要动态设置的内容 需在此配置
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "app1",
app_icon : "@mipmap/logo",
]
}
app2{
// applicationId "com.demo.two"
// versionCode 1
// versionName "1.2.1"
resValue "string", "mapp_name", "App2"
buildConfigField "String" , "APP_DIR" , '"app2"'
buildConfigField "int" , "APP_TYPE" , "2"
buildConfigField "Boolean", "ENVIRONMENT", "false"
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "app2",
app_icon : "@mipmap/logo",
]
}
}
}
四.自定义多个打包不同的图片logo 和第三步配合
如桌面图标 可以通过 android:icon="${app_icon}" 设置 主题、应用名等均可动态配置,但清单文件里更换资源 需在build.gradle配置,其它布局资源则只需要放置在不同的res对应文件内即可
如下图 ,不同的appid 可创建文件夹与mian文件夹同级,且里面的文件夹路径需与main文件夹里面的“完全一致”方可生效,在运行时相同名字的资源会自动覆盖,诺在对应的文件夹找不到相应名称的资源文件,则会自动匹配main文件夹下面的资源文件(例如: app1 的mipmap里面没有bg.jpg , 则会自动采用main里面的pg.jpg作为app1的资源),注意:java文件不会自动合并,且不能重复,如果java文件也需要动态配置,则main里面不能有动态的java文件,动态的java文件在main以外的文件夹都需要包含有。
配合打包后的apk的命名,那样我们就不需要打包完后再自己去命名啦~
android{
// 打包命名
applicationVariants.all { variant ->
variant.outputs.all { output ->
if (variant.buildType.name.equals('release')) {
//生成apk名字的格式:ChannelV1.0.0_2016-06-22_baidu.apk
//可自定义自己想要生成的格式
outputFileName = "${variant.productFlavors[0].resValues.get("mapp_name").value}_V${variant.productFlavors[0].versionName}_${releaseTime()}.apk"
}else if(variant.buildType.name.equals('debug')){
outputFileName = "${variant.productFlavors[0].resValues.get("mapp_name").value}_V${variant.productFlavors[0].versionName}_${debugTime()}_debug.apk"
}
}
}
}
def releaseTime() {
return new Date().format("yyyyMMdd", TimeZone.getTimeZone("UTC+8"))
}
def debugTime() {
return new Date().format("MMdd HH.mm", TimeZone.getTimeZone("UTC+8"))
}