Android客户端程序Gradle如何打包
作者:Freedoms1988 发布时间:2023-06-05 14:10:07
一、前言
android客户端开发进入尾声,负责SEO同事突然发给我一个涉及45个发布渠道的噩耗,之前只发布自有渠道的工作方式(手动修改参数打包)已经不满足需求,所以引入最近比较流行的gradle打包技术。
gradle基于groovy语言,引入的原因也方便了以后从现在使用的eclipse开发环境迁移到Android Studio,所以blablabla……,不多说了,先上干货。
二、准备工作
1、首先,如果使用eclipse作为开发环境,需右键点击项目,在菜单中选择“Export…”
2、然后,在弹出的列表中依次选择“Android->Generate Gradle build files”
3、选择"Next>"
4、再选择"Next>"
5、在列表中勾选需要创建gradle配置脚本的项目,继续"Next>"
6、选择"Finish"至此,eclipse中已生成gradle配置脚本,可能这是需要右键刷新一下项目
三、简单项目Gradle打包脚本配置
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:0.12.+'
}
}
//项目配置版本号,与apk输出目录
ext.appVersionCode = 2
ext.appVersionName = "2.0"
ext.appReleaseDir = "/Users/freedoms/Desktop/release"
apply plugin: 'com.android.application'
//获取时间戳
def getDate() {
def date = new Date()
def formattedDate = date.format('yyyyMMdd')
return formattedDate
}
//程序包配置
android {
compileSdkVersion 19
buildToolsVersion "21.1.2"
sourceSets {
main {
manifest.srcFile 'AndroidManifest.xml'
java.srcDirs = ['src']
resources.srcDirs = ['src']
aidl.srcDirs = ['src']
renderscript.srcDirs = ['src']
res.srcDirs = ['res']
assets.srcDirs = ['assets']
//项目中含有so包,需增加jni相关目录配置,否则程序运行到调用so时将发生错误
jniLibs.srcDir(['libs'])
}
instrumentTest.setRoot('tests')
debug.setRoot('build-types/debug')
release.setRoot('build-types/release')
}
//打包开始时,lint运行将有可能发生错误,当有异常发生时,此设置将忽略警告,继续运行脚本,若忽略,打包过程将被强行终止
lintOptions {
abortOnError false
}
//签名配置
signingConfigs {
myConfig {
storeFile file("/Users/freedoms/Desktop/产品需求文档/android.keystore")
storePassword "123123"
keyAlias "android.keystore"
keyPassword "123123"
}
}
//混淆配置
buildTypes{
release {
signingConfig signingConfigs.myConfig //不需混淆设置为false
runProguard true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-project.txt'
}
}
//自定义配置
productFlavors {
//百度
baidu{ //AndroidManifest.xml配置中定义的占位符补全配置,实例中在AndroidManifest.xml中配置"${UMENG_CHANNEL_VALUE}",脚本运行后,将baidu_android_channel自动替换到此位置,AndroidManifest.xml其他需要分渠道动态配置的参数可以参考此做法操作
manifestPlaceholders = [UMENG_CHANNEL_VALUE:"baidu_android_channel",BAIDU_CHANNEL_VALUE:"baidu_baidu_android_channel"]
}
//360
"360"{//若配置渠道名为数字开头,必须加引号
manifestPlaceholders = [UMENG_CHANNEL_VALUE:"360_android_channel",BAIDU_CHANNEL_VALUE:"baidu_360_android_channel"]
} //可参考以上两项进行扩展……
}
//打包重命名算法,输出XXX_Android_v2.0_20160127_baidu.apk到脚本前配置的输出目录当中
android.applicationVariants.all { variant ->
def file = variant.outputFile
if(variant.buildType.name.equals('release')){
variant.outputFile = new File(appReleaseDir + '/','XXX_Android_v' + appVersionName +getDate()+ '_' + variant.productFlavors[0].name + '.apk')
}
}
}
//编码配置
tasks.withType(Compile) {
options.encoding = "UTF-8"
}
四、带有项目依赖关系的gradle打包脚本配置
1、依赖项目
a)如果使用eclipse作为开发环境,首先需要生成gradle配置脚本(详见二、准备工作)
b)修改gradle脚本中apply plugin为以下配置
apply plugin: 'android-library'
c)其他配置同主项目,可参考简单项目gradle脚本配置
2、主项目
a)如果使用eclipse作为开发环境,首先需要生成gradle配置脚本(详见二、准备工作)
b)修改gradle脚本中apply plugin为以下配置
apply plugin: 'com.android.application'
c)在主项目根目录下创建setting.gradle文本文件,用作引用依赖项目配置
//引入依赖项目名include 'library'
include 'library_pullToRefresh'
//创建目录引用,最后引号中是依赖项目存放的绝对路径
project(':library').projectDir = new File('/Users/freedoms/git/library')
project(':library_pullToRefresh').projectDir = new File('/Users/freedoms/git/library_pullToRefresh')
d)在主项目的build.gradle中增加以下配置
//依赖配置
dependencies {
compile fileTree(dir: 'libs', include: '*.jar')
compile project(':library_pullToRefresh')
compile project(':library')
}
五、运行build脚本
1、在命令行中cd 到主项目根目录下
2、输入gradle clean执行(清理gradle生成的检查文件和打出的APK,可以不做,但是不保证中间是否会有什么奇怪问题,养成好习惯)
3、输入gradle check执行(检查项目,根据渠道数量不同需要时间不同)
4、输入gradle build执行(执行build脚本,开始打包,根据渠道数量不同需要时间不同,45个渠道大概需要1个多小时)
5、检查主项目build.gradle配置的输出目录中,打好的渠道包已经在里面了
六、注意事项(待续)
Q1:在执行check或者build时,可能会报如下错误
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':lint'.
> Lint found errors in the project; aborting build.
Fix the issues identified by lint, or add the following to your build script to proceed with errors:
...
android {
lintOptions {
abortOnError false
}
}
...
* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.
BUILD FAILED
A1:在build.gradle脚本中增加
lintOptions {
abortOnError false
}
Q2:根据渠道数量的多少,可能在打包时会报java虚拟机内存不足
The system is out of resources.
Consult the following stack trace for details.
java.lang.OutOfMemoryError: Java heap space
at com.sun.tools.javac.util.Position$LineMapImpl.build(Position.java:139)
at com.sun.tools.javac.util.Position.makeLineMap(Position.java:63)
at com.sun.tools.javadoc.DocCommentScanner.getLineMap(DocCommentScanner.java:438)
at com.sun.tools.javac.main.JavaCompiler.parse(JavaCompiler.java:512)
at com.sun.tools.javac.main.JavaCompiler.parse(JavaCompiler.java:550)
at com.sun.tools.javac.main.JavaCompiler.parseFiles(JavaCompiler.java:804)
at com.sun.tools.javac.main.JavaCompiler.compile(JavaCompiler.java:727)
at com.sun.tools.javac.main.Main.compile(Main.java:353)
at com.sun.tools.javac.api.JavacTaskImpl.call(JavacTaskImpl.java:115)
以上所述是小编给大家分享的Android客户端程序Gradle如何打包的相关知识,希望对大家有所帮助。
猜你喜欢
- 一、Mybatis一对多分解式查询分解式查询就是将一条Sql语句拆分成多条在MyBatis多表查询中,使用连接查询时一个Sql语句就可以查询
- 接着上一篇进行学习java文件上传下载1。五、断点续传 对于熟用QQ的程序员,QQ的断点续传功能应该是印象很深刻的。因为它很实用也
- 前言《布谷鸟闯关-简单版》是一个基于java的布谷鸟闯关游戏,摁上键控制鸟的位置穿过管道间的缝隙,需要做碰撞检测,监听键盘事件,背景图片的切
- java static块和构造函数的实例详解构造函数不写时,若该类继续了某个类则会默认集成父类的构造函数。 构造函数在实例化类时执行内部,O
- maven依赖及一些配置这里主要是搭建项目常用到的maven依赖以及搭建项目会需要用到的一些配置文件,可能下面这些依赖还不是很全,但是应该会
- 本文实例为大家分享了Java实现在线聊天室的具体代码,供大家参考,具体内容如下- 本文讲述了从实现单个多个客户的收发信息(基础简易版),到各
- 这篇文章主要介绍了简单了解Spring中BeanFactory与FactoryBean的区别,文中通过示例代码介绍的非常详细,对大家的学习或
- 一、业务需求实现省份与城市的二级联动二、实现效果三、代码实现1. province_city.jsp前端界面实现<%@ p
- 文件名:page.xml<RelativeLayout xmlns:android="http://schemas.andr
- 无意中在一个国外的站点下到了一个利用WCF实现聊天的程序,作者是:Nikola Paljetak。研究了一下,自己做了测试和部分修改,感觉还
- 1.利用参数出现的顺序利用mapper.xml<select id="MutiParameter" resultT
- Spring boot默认使用的是SimpleCacheConfiguration,即使用ConcurrentMapCacheManager
- 1.mkString()方法的使用:mkString(seq:String)方法是将原字符串使用特定的字符串seq分割。mkString(s
- 1、确定本地网络是通的:2、确定SpringBootq启动后是不报错的3、查看是不是自己在配置文件中加入了项目路径:如果加入了项目路径的话,
- 首先是.select在MP查询中,默认查询所有的字段,如果有需要也可以通过select方法进行指定字段。其中要注意的细节:wrapper.s
- 前言最近接手了一个老项目,“愉悦的心情”自然无以言表,做开发的朋友都懂,这里就不多说了,都是泪...
- 原因分析使用ajax从前台页面传输数据到后台controller控制器的时候,出现中文乱码其实乱码问题出现的原因,就是由于默认的tomcat
- 目录写在前面引入guava依赖包怎么做变量转换写在前面有时候需要处理对象属性的getter、setter方法,或者将属性与数据表字段进行相互
- 一、什么是ASMASM是一个java字节码操纵框架,它能被用来动态生成类或者增强既有类的功能。ASM 可以直接产生二进制 class 文件,
- 1、概念首先我们理解一下,什么叫做完美数?问题描述:若一个自然数,它所有的真因子(即除了自身以外的约数)的和恰好等于它本身,这种数叫做完全数