java调用android打包_Android Gradle打包基础
Android gradle打包基础
gradle目录
[代码]java代码:12345MyApp├── build.gradle ( 可以查看Gradle的版本 )├── settings.gradle( include不同的模块)└── app└── build.gradle( 配置App模块的参数 )
Gradle signingConfigs基本配置
archiveNameFormat - Groovy格式字符串, 指定渠道打包输出的APK文件名格式,默认文件名格式是: ${appPkg}-${flavorName}-${buildType}-v${versionName}-${versionCode},可使用以下变量:
projectName - 项目名字
appName - App模块名字
appPkg - applicationId (App包名packageName)
buildType - buildType (release/debug/beta等)
flavorName - flavorName (对应渠道打包中的渠道名字)
versionName - versionName (显示用的版本号)
versionCode - versionCode (内部版本号)
buildTime - buildTime (编译构建日期时间)语法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172android {
compileSdkVersion 22 //编译版本
buildToolsVersion "23.0.0" //buildtool版本
defaultConfig {
//默认配置,会同时应用到debug和release版本上
applicationId "io.yimsamtam.***" //包名
minSdkVersion 14
targetSdkVersion 22
versionCode 2
versionName "1.2.0"
}
signingConfigs {
release {//获取build.properties里的密码常量,需要在buildeTypes引用
storeFile file(STORE_FILE)
storePassword STORE_PASSWORD
keyAlias KEY_ALIAS
keyPassword KEY_PASSWORD
}
debug {
storeFile file(STORE_FILE)
storePassword STORE_PASSWORD
keyAlias KEY_ALIAS
keyPassword KEY_PASSWORD
}
}
buildTypes {
//这里面可以配置不同版本的一些参数,比如混淆、签名配置等
release { //正式服 正式签名
signingConfig signingConfigs.release //用keystore打包
minifyEnabled true //是否开启混淆
zipAlignEnabled true //压缩
shrinkResources true //去掉无用的resourse文件
debuggable true //使该版本可调试
buildConfigField "boolean", "LOG_DEBUG", "false"
//加载混淆文件,开启混淆没有这句会报错
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
develop {//开发服 正式签名
signingConfig signingConfigs.release
minifyEnabled true
zipAlignEnabled true
shrinkResources true
debuggable true //使该版本可调式
buildConfigField "boolean", "LOG_DEBUG", "true"
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
debug { //测试服 测试签名
signingConfig signingConfigs.debug
minifyEnabled false
zipAlignEnabled false
// 移除无用的resource文件
shrinkResources false
buildConfigField "boolean", "LOG_DEBUG", "true"
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
//修改生成的最终文件名
applicationVariants.all { variant ->
variant.outputs.each { output ->
def outputFile = output.outputFile
if (outputFile != null && outputFile.name.endsWith('.apk')) {
File outputDirectory = new File(outputFile.parent);
def fileName
String channelName = "homepage";
if (variant.buildType.name == "release") {
//输出:bnj_t_2015.12.12_4886faf_c360.apk
if (variant.productFlavors[0] != null) {
channelName = variant.productFlavors[0].name;
}
//版本+时间+git版本+渠道的格式
fileName = "Movie_${channelName}_${packageTime()}_${revision()}.apk"
} else if (variant.buildType.name == "develop") {
//输出:bnj_t_2015.12.12_4886faf.apk
fileName = "Movie_${packageTime()}_${revision()}.apk"
//${defaultConfig.versionname}
} else {
//输出:bnj_t_2015.12.12_4886faf_debug.apk
fileName = "Movie_debug.apk"
}
output.outputFile = new File(outputDirectory, fileName)
}
}
}
productFlavors {
offcial {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "offcial"]
}
wandoujia {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "wandoujia"]
}
baidu {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "baidu"]
}
}
//修改生成的最终文件名
applicationVariants.all { variant ->
variant.outputs.each { output ->
def outputFile = output.outputFile
if (outputFile != null && outputFile.name.endsWith('.apk')) {
File outputDirectory = new File(outputFile.parent);
def fileName
String channelName = "offcial";
if (variant.buildType.name == "release") {
//输出:Movie_2015.12.12_4886faf_c360.apk
if (variant.productFlavors[0] != null) {
channelName = variant.productFlavors[0].name;
}
//版本+时间+git版本+渠道的格式
fileName = "Movie_${channelName}_${packageTime()}_${revision()}.apk"
} else if (variant.buildType.name == "develop") {
//输出:bnj_t_2015.12.12_4886faf.apk
fileName = "Movie_Dev${packageTime()}_${revision()}.apk"
//${defaultConfig.versionname}
} else {
//输出:bnj_t_2015.12.12_4886faf_debug.apk
fileName = "Movie_debug.apk"
}
output.outputFile = new File(outputDirectory, fileName)
}
}
}
lintOptions {//移除lint检查的error
abortOnError false
}
}
//找到文件的签名
File propFile = file('signing.properties');
if (propFile.exists()) {
def Properties props = new Properties()
props.load(new FileInputStream(propFile))
if (props.containsKey('STORE_FILE') && props.containsKey('STORE_PASSWORD') &&
props.containsKey('KEY_ALIAS') && props.containsKey('KEY_PASSWORD')) {
android.signingConfigs.release.storeFile = file(props['STORE_FILE'])
android.signingConfigs.release.storePassword = props['STORE_PASSWORD']
android.signingConfigs.release.keyAlias = props['KEY_ALIAS']
android.signingConfigs.release.keyPassword = props['KEY_PASSWORD']
} else {
android.buildTypes.release.signingConfig = null
}
} else {
android.buildTypes.release.signingConfig = null
}
dependencies {
//模块依赖
compile group: '包名' , name: '模块名' , version: '版本号'
}
// 打包时间格式
def packageTime() {
return new Date().format("yyyy-MM-dd", TimeZone.getTimeZone("UTC"))
}Mapping(/project/app/build/outputs/mapping/)
dump.txt 描述apk文件中所有类文件间的内部结构。
mapping.txt 列出了原始的类,方法,和字段名与混淆后代码之间的映射。
seeds.txt 列出了未被混淆的类和成员
usage.txt 列出了从apk中删除的代码settings.gradle (声明加入工程的module)
include ‘:app’,’:module-b’ //示例gradle.properties (保存应用签名密码等常量)STORE_FILE = keystore(jks)的路径
STORE_PASSWORD = KEYSTORE密码
KEY_ALIAS = 别名
KEY_PASSWORD = KEYSTORE密码
会自动生成local.properties文件在build.gradle的android标签下引用
1
2
3
4
5
6
7
8signingConfigs { //获取应用签名的密码常量,需要在buildTypes里调用
releaseConfig {
storeFile file(STORE_FILE)
storePassword STORE_PASSWORD
keyAlias KEY_ALIAS
keyPassword KEY_PASSWORD
}
}
常见错误
1If you are using Gradle, make sure that your current variant is debuggable.
原因及解决:Build Variant里该版本未开启调试功能。在Gradle里添加debugable true代码即可。
1Error:Execution failed for task ':demo:packageRelease'.> Unable to compute hash of D:\testProject\demo\build\intermediates\classes-proguard\release\classes.jar原因及解决:混淆了第三方jar包。注释掉 -libraryjars相关代码即可。
1
2The APK file build\outputs\apk\******.apk does not exist on disk.
Error while Installing APK原因及解决: 刷新一下Gradle或者Clean Project即可。
BuildConfig详解当Android Studio编译的时候,会自动生成一个BuildConfig类。该类保存了一些Gradle里的常量。在Java代码中,可以通过该类来获取这些常量的值。
1
2
3
4
5
6
7
8
9
10public final class BuildConfig {
public static final boolean DEBUG = Boolean.parseBoolean("true");
public static final String APPLICATION_ID = "io.movies"; //包名
public static final String BUILD_TYPE = "develop";//发布类型
public static final String FLAVOR = "offcial"; //渠道版本
public static final int VERSION_CODE = 2;//版本号
public static final String VERSION_NAME = "1.2.0";//版本名
// Fields from build type: develop
public static final boolean LOG_DEBUG = true; //自定义的Log关闭
}当然我们还可以根据需要来自定义这些常量。例如根据发布类型来控制LOG是否输出。
首先,我们需要在BuildTypes不同发布类型里定义一个字段 ,从而控制其LOG输出。
1
2
3
4
5
6
7
8
9
10
11
12buildtypes{
release{
buildConfigField "boolean","LOG_DEBUG","false"//关闭LOG输出
}
develop{
buildConfigField "boolean","LOG_DEBUG","true" //打开LOG输出
}
}接着,在Log工具类里,通过BuildConfig类来获取LOG_DEBUG的值即可。
1
2
3
4
5public class LogUtil {
public static boolean ENABLE_LOG = BuildConfig.LOG_DEBUG;
}
Meta-data详解Androidmanifest文件里meta-data标签主要用于提供组件额外的数据,本身是一个键值对,可以自定义键和值。(在打包的时候,可根据需要设置不同的值)
在Java中使用首先判断Meta-data标签在哪个标签内,如果在application标签里,则需要用Applicationinfo来获取该值。同理,在Activity标签里,用ActivityInfo。
1
2
3
4
5
6
7
8
9
.
.
.
android:name="yimsamtam.github.io.test"
android:value="YimSamTam" />
在Java代码用ApplicationInfo获取。
1
2
3ApplicationInfo info = getPackageManager().getApplicationInfo(getPackageName(), PackageManager.GET_META_DATA);
String value = info.metaData.getString("yimsamtam.github.io.test");
Functions.toast(this, value); //此处打印YimSamTam字符串
在Gradle中使用Androidmanifest文件里,其值通过${KEY}的方式来引用。在Gradle里赋值。
1
2
3
4
5
6
7
8
9
.
.
.
android:name="yimsamtam.github.io.test"
android:value="${TEST_VALUE}" />
在Gradle里结合manifestPlaceholders赋值
1
2
3
4
5
6
7productFlavors {
offcial {
manifestPlaceholders = [TEST_VALUE: "YimSamTam"]
}
}
//当程序编译offcial版本时,便会赋值YimSamTam到Androidmanifest文件的meta-data标签里。
实际开发需求-不同发布版本使用不同的友盟UMENG_APPKEYManifest代码如下
1
2
3
4
5
6
android:name="UMENG_APPKEY"
android:value="${UMENG_APPKEY}" />
Gradle代码如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14buildTypes {
release { //正式服
manifestPlaceholders = [UMENG_APPKEY: "570104fde0f55aedba00200d-REL"]
}
develop {//开发服
manifestPlaceholders = [UMENG_APPKEY: "570104fde0f55aedba00200d-DEV"]
}
debug { //测试服
manifestPlaceholders = [UMENG_APPKEY: "570104fde0f55aedba00200d-DEB"]
}
}
推荐
java调用android打包_Android Gradle打包基础相关推荐
- 利用 Android Studio 和 Gradle 打包多版本APK
视频汇总首页:http://edu.51cto.com/lecturer/index/user_id-4626073.html ==================================== ...
- [原]Android打包之Gradle打包
最近尝试了一下Android的Gradle打包,发现确实比Ant打包会方便很多,特此记录下来. 注:android的gradle现在插件的版本已经是0.14.3了,对于一些老的方法和api,有一些已经 ...
- Android Ant 和 Gradle 打包流程和效率对照
一.Ant 打包:(下载ant.配置环境变量就不说了) 1.进入命令行模式,并切换到项目文件夹.运行例如以下命令为ADT创建的项目加入ant build支持: android update proje ...
- Java和Android构建工具Gradle深入了解
Gradle3.0编程与自动化构建 gradle是一款最新的,功能强大的构建工具,它使用程序代替传统的XML配置,构建项目更加灵活.gradle有丰富的第三方插件. Gradle相关介绍及开发环境搭建 ...
- android 使用jar里 aidl,Android Studio中用gradle打包带AIDL文件的jar文件
关键代码task class_jar(type: Jar) { from "build/intermediates/classes/release/" //核心,将.class 文 ...
- Android开发Android studio之gradle打包apk重命名的方法
老套路,先看效果图: 首先第一步在gradle里面(跟android同级)写个获取当前时间的方法如下: //获取时间的方法 GMT+8代表北京时间,下面两个方法都可以 static def getNo ...
- Android Studio 使用 Gradle 打包 Jar
Android Studio 打 Jar 包一直是一个麻烦的事,按照网上现有的教程,打包一个混淆的 jar 需要完成下列步骤: 1.将 plugin 修改为 library 后 build 出 aar ...
- python安卓打包_Android多渠道打包之Python打包
我们做Android用户级应用开发的时候都要考虑这样的问题,目前的应用市场有很多,我们的安装包是通过哪个渠道进入用户手机的,总得统计一下吧,这就要说到多渠道打包了.多年前刚入行的时候,打包就是在代码里 ...
- as将安卓应用打包_Android Studio打包生成apk的方法(超级简单哦)
释放双眼,带上耳机,听听看~! 打包文件是需要生成APK文件,其他人可以通过APK安装和使用,一般来说,包是指APK生成的发布版本,下文技术狗小编还介绍了Android Studio 超级简单的打包生 ...
最新文章
- API聚合网关技术选型参考-网友实战-使用协程
- App上架/更新怕被拒? iOS过审“避雷秘籍”请查收
- Spring AOP知识详解
- 多标签分类任务大赛50万奖金等你来
- 内存卡无法格式化 修复
- 【资料分享】干货解读人工智能新时代
- pe_xscan作了3点更新 1
- Adobe Acrobat Pro制作pdf模板
- 常见电子元器件的极性识别方法
- 元素周期表排列的规律_元素周期表的元素排列规律和元素的性质
- Winrm+python远程连接windows执行命令
- 如何避开微信小程序的审核机制(实测有效)
- matlab 切点投资组合 程序,MATLAB证券投资组合分析
- 粉丝经济大爆发居然真的来了
- Django项目:极致果蔬(一)
- 完成java课设的经验_课设后的感想
- 响应式web设计_将响应式Web设计超越视觉
- WinSetupFromUSB安装XP系统后删除U盘多余的隐藏分区
- 51单片机汇编学习例程(16)——AT24C02篇
- 《大数据时代》(维克托·迈尔舍恩伯格) 小记
热门文章
- windows 7 64bit python3.3安装pyqt
- Js将字符串转数字的方式
- raspberry 防火墙_用于数据科学,Linux防火墙,Raspberry Pi NAS,openmediavault,Syncthing,微服务等的Python库
- arcade 物理系统_如何使用Python和Arcade库创建2D游戏
- 让电脑说话代码_让您的代码为您说话
- 下载 Bootstrap3 的 Sass 版本
- 作为函数的mixin
- lynx命令调用php脚本,lynx
- java输入args不能为空_java程序入口为什么有的空括号在args前面有的?
- php中strtotime的意思,PHP中strtotime