自从Google放弃对Eclipse的维护,并力推Android studio时,其版本的更新迭代速度也是非常快的,而且开发的工程中经常需要用到gradle的相关操作
Gradle:
Gradle是Android studio默认的build工具,是基于一种JVM语言——Groovy,再加上DSL组成的
说白了就是一种依赖管理工具,它抛弃了基于XML的各种繁琐配置,使用起来也简单,语法也相对简洁很多
每当项目开发完成准备发布到各大安卓应用市时,此时作为项目开发人员来说简直头大,如果发布的应用市场数量小的话,可能多操作几次就完事了,倘如是几十个应用市场的话,事实上apk的打包速度本身就慢,这样既浪费人力物力,又没有效率
自从有了友盟统计SDK的发布,给大家带来不少便捷,除了平时对用户统计,错误分析等功能之外,友盟SDK同时还提供了多渠道快速打包的功能
功能:
项目创建完成之后,默认生成两个build.gradle文件,一个位于工程根目录下,另一个位于app目录下
工程根目录下的build.gradle文件是针对全局的配置,里面包括仓库地址和gradle的版本,这个我不多做解释,我主要说一下app目录下的build.gradle文件
app目录下的build.gradle文件功能
- 声明构造的项目类型
apply plugin:'android'
- 设置编译Android项目的参数
android {
//编译SDK的版本
compileSdkVersion 23
//编译的tools版本
buildToolsVersion "23.0.3"
defaultConfig {
//当前应用包名
applicationId "com.chenyk.androidkits"
//支持的最低版本
minSdkVersion 9
//支持的目标版本
targetSdkVersion 22
//版本号
versionCode 1
//版本名
versionName "1.0"
// dex突破65535的限制
multiDexEnabled true
}
}
- 签名配置
signingConfigs {
debug {
keyAlias 'kits'
keyPassword '888888'
storeFile file("kitskeystore.jks")
storePassword '888888'
}
release {
//key别名
keyAlias 'kits'
//key密码
keyPassword '888888'
//密钥文件路径
storeFile file("kitskeystore.jks")
//密钥文件密码
storePassword '888888'
}
}
- 混淆配置
buildTypes {
release {
minifyEnabled true
//前一部分代表系统默认的android程序的混淆文件,该文件已经包含了基本的混淆声明,指定混淆规则文件
proguardFiles getDefaultProguardFile('proguard-android.txt'),'proguard-rules.pro'
signingConfig signingConfigs.release
}
}
- 多渠道打包
productFlavors {
googleplay {}
huawei {}
xiaomi {}
wandoujia {}
baidu {}
yingyongbao {}
android360 {}
uc {}
umeng {}
meizu{}
//批量配置
productFlavors.all { flavor ->
flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
}
}
- .so文件的导入
task copyNativeLibs(type: Copy) {
from fileTree(dir: 'libs', include: 'armeabi/*.so') into 'build/lib'
}
tasks.withType(Compile) {
options.encoding = "UTF-8"
}
tasks.withType(Compile) {
compileTask -> compileTask.dependsOn copyNativeLibs
}
clean.dependsOn 'cleanCopyNativeLibs'
tasks.withType(com.android.build.gradle.tasks.PackageApplication) {
pkgTask ->pkgTask.jniFolders = [new File(buildDir, 'lib')]
}
- 依赖库
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
}
- 依赖包的定义
dependencies {
classpath 'com.android.tools.build:gradle:0.4'
}
多渠道打包
1. 友盟账号注册登录
友盟账号注册地址,按照步骤完成注册流程,方法简单,自行完成
2. SDK的下载
jar包下载地址,下载完成后解压缩,并将jar包添加到libs目录下
gradle依赖配置:在build.gradle文件中添加以下配置
dependencies {
compile 'com.umeng.analytics:analytics:latest.integration'
}
3. 获取友盟appKey
(1)进入友盟首页,选择应用统计,点击立即使用,进入到我的产品页面
(2)添加新应用,按照提示信息填写相关资料后,提交并获取appKey
4. 在AndroidMainfest.xml中配置AppKey
添加以下相关权限,以及友盟相关参数
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<application ……>
……
<activity ……/>
<meta-data
android:name="UMENG_APPKEY"
android:value="YOUR_APP_KEY" />
<meta-data
android:name="UMENG_CHANNEL"
android:value="Channel ID" />
</application>
关于友盟SDK的集成步骤到此就OK了,如果还有不明白的地方可以参考友盟官方提供的集成文档
接下来开始讲诉多渠道打包的配置步骤
5. 添加渠道包名,配置不同风格的APP
productFlavors {
googleplay {}
huawei {}
xiaomi {}
wandoujia {}
baidu {}
yingyongbao {}
android360 {}
uc {}
umeng {}
meizu{}
//批量配置
productFlavors.all { flavor ->
flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
}
}
最后在Terminal命令提示符中,输入命令gradlew assembleRelease,等待打包工作的完成
打包完成之后可以在当前项目名称\app\build\outputs\apk\目录下查看已打包完成的apk列表,会不会觉得比以前打包的方式简单多了,效率也提升了不少
我这里列几个其他的命令提供使用,如下:
gradlew assembleRelease //创建新任务打包所有渠道包的release版本apk
gradlew assembleDebug //创建新任务打包所有渠道包的debug版本apk
gradlew assemblebaiduRelease //创建新任务打包指定渠道包(百度)的release版本apk
打包的工作虽然已经完成,但大家都知道,此时打包的apk并没有进行签名,没有签名当然也就无法发布到应用市场
apk签名发布
(1)在Android Studio的菜单栏上依次选择Build------>Generate Signed APK...
(2)创建密钥库及密钥,点击"Greate new..."按钮创建密钥库
(3)创建密钥库注意事项
这里注意一下信息项需填写哪些信息:
Key store path:密钥库文件的地址
Password/Confirm:密钥库的密码
Alias:密钥名称
Password/Confirm:密钥密码
Validity(years):密钥有效时间,一般默认25年
First and Last Name:密钥颁发者姓名
Organizational Unit:密钥颁发组织
City or Locality:城市
Country Code(XX):国家代码
(4)点击Finish完成之后,到密码输入页面
(5)点击Next按钮,并选择所有渠道或指定渠道,点击Finish按钮,进行签名打包工作任务
(6)选择build type和flavors
(7)等待所有渠道包签名打包完成后就可以发布到各大应用市场了
对了,签名还有另外一种方式哦,给大家普及一下吧
在buidle.gradle文件中添加签名配置信息以及buildTypes配置信息如下:
//签名配置
signingConfigs {
debug {
keyAlias 'kits'
keyPassword '888888'
storeFile file("kitskeystore.jks")
storePassword '888888'
}
release {
//key别名
keyAlias 'kits'
//key密码
keyPassword '888888'
//密钥文件路径
storeFile file("kitskeystore.jks")
//密钥文件密码
storePassword '888888'
}
}
buildTypes {
debug {
// 显示Log
buildConfigField "boolean", "LOG_DEBUG", "true"
// apk包名称后缀,用来区分release和debug
versionNameSuffix "-debug"
signingConfig signingConfigs.debug
}
release {
// 不显示Log
buildConfigField "boolean", "LOG_DEBUG", "false"
//开启混淆
minifyEnabled true
// 移除无用的resource文件
shrinkResources true
//前一部分代表系统默认的android程序的混淆文件,该文件已经包含了基本的混淆声明,指定混淆规则文件
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.release
}
}
注意一下,我这里是把debug版本和release都设置同样的配置信息,在平常的开发过程中debug配置可以使用Android Studio默认的配置信息即可
配置完成后,在Terminal命令提示符中,输入命令gradlew assembleRelease就可以了
打包结果
在打包apk文件时,还可以对文件的名称进行修改,比如加入时间信息或者svn版本到apk文件名称中,方便查找apk等
把打包的时间添加到apk名称中,具体代码操作如下:
applicationVariants.all { variant ->
variant.outputs.each { output ->
def outputFile = output.outputFile
if (outputFile != null && outputFile.name.endsWith('.apk')) {
// 输出apk名称为dt_android360_v1.0_0705114322.apk
def fileName = "dt_${variant.productFlavors[0].name}_v${defaultConfig.versionName}_${new Date().format("MMddhhmmss")}.apk"
output.outputFile = new File(outputFile.parent, fileName)
}
}
}
最后给大家送上完整版的build.gradle文件的全部内容,同时文件也加入了注释,方便大家阅读和理解
apply plugin: 'com.android.application'
android {
//编译SDK的版本
compileSdkVersion 23
//编译的tools版本
buildToolsVersion "23.0.3"
defaultConfig {
//当前应用包名
applicationId "com.chenyk.androidkits"
//支持的最低版本
minSdkVersion 9
//支持的目标版本
targetSdkVersion 22
//版本号
versionCode 1
//版本名
versionName "1.0"
// dex突破65535的限制
multiDexEnabled true
}
//执行lint检查,有任何的错误或者警告提示,都会终止构建,现将其关掉。
lintOptions {
abortOnError false
}
//签名配置
signingConfigs {
debug {
keyAlias 'kits'
keyPassword '888888'
storeFile file("kitskeystore.jks")
storePassword '888888'
}
release {
//key别名
keyAlias 'kits'
//key密码
keyPassword '888888'
//密钥文件路径
storeFile file("kitskeystore.jks")
//密钥文件密码
storePassword '888888'
}
}
buildTypes {
debug {
// 显示Log
buildConfigField "boolean", "LOG_DEBUG", "true"
// apk包名称后缀,用来区分release和debug
versionNameSuffix "-debug"
minifyEnabled false
zipAlignEnabled false
shrinkResources false
signingConfig signingConfigs.debug
}
release {
// 不显示Log
buildConfigField "boolean", "LOG_DEBUG", "false"
//开启混淆
minifyEnabled true
//Zipalign优化
zipAlignEnabled true
// 移除无用的resource文件
shrinkResources true
//前一部分代表系统默认的android程序的混淆文件,该文件已经包含了基本的混淆声明,指定混淆规则文件
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.release
//修改输出文件的名称
applicationVariants.all { variant ->
variant.outputs.each { output ->
def outputFile = output.outputFile
if (outputFile != null && outputFile.name.endsWith('.apk')) {
// 输出apk名称为dt_android360_v1.0_0705114322.apk
def fileName = "dt_${variant.productFlavors[0].name}_v${defaultConfig.versionName}_${new Date().format("MMddhhmmss")}.apk"
output.outputFile = new File(outputFile.parent, fileName)
}
}
}
}
}
//渠道Flavors,配置不同风格的app
productFlavors {
googleplay {}
huawei {}
xiaomi {}
wandoujia {}
baidu {}
yingyongbao {}
android360 {}
uc {}
umeng {}
meizu{}
//批量配置
productFlavors.all { flavor ->
flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
}
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
implementation 'com.android.support:appcompat-v7:23.4.0'
implementation 'com.android.support:design:23.2.0'
implementation project(':jpushkit')
implementation project(':commkit')
implementation project(':asynchttpkit')
implementation project(':jskit')
implementation project(':appkit')
implementation project(':photokit')
implementation project(':retrofitkit')
implementation project(':zxingkit')
}
要是有疑问大家可以加我微信详聊 yf1553653788