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打包基础相关推荐

  1. 利用 Android Studio 和 Gradle 打包多版本APK

    视频汇总首页:http://edu.51cto.com/lecturer/index/user_id-4626073.html ==================================== ...

  2. [原]Android打包之Gradle打包

    最近尝试了一下Android的Gradle打包,发现确实比Ant打包会方便很多,特此记录下来. 注:android的gradle现在插件的版本已经是0.14.3了,对于一些老的方法和api,有一些已经 ...

  3. Android Ant 和 Gradle 打包流程和效率对照

    一.Ant 打包:(下载ant.配置环境变量就不说了) 1.进入命令行模式,并切换到项目文件夹.运行例如以下命令为ADT创建的项目加入ant build支持: android update proje ...

  4. Java和Android构建工具Gradle深入了解

    Gradle3.0编程与自动化构建 gradle是一款最新的,功能强大的构建工具,它使用程序代替传统的XML配置,构建项目更加灵活.gradle有丰富的第三方插件. Gradle相关介绍及开发环境搭建 ...

  5. android 使用jar里 aidl,Android Studio中用gradle打包带AIDL文件的jar文件

    关键代码task class_jar(type: Jar) { from "build/intermediates/classes/release/" //核心,将.class 文 ...

  6. Android开发Android studio之gradle打包apk重命名的方法

    老套路,先看效果图: 首先第一步在gradle里面(跟android同级)写个获取当前时间的方法如下: //获取时间的方法 GMT+8代表北京时间,下面两个方法都可以 static def getNo ...

  7. Android Studio 使用 Gradle 打包 Jar

    Android Studio 打 Jar 包一直是一个麻烦的事,按照网上现有的教程,打包一个混淆的 jar 需要完成下列步骤: 1.将 plugin 修改为 library 后 build 出 aar ...

  8. python安卓打包_Android多渠道打包之Python打包

    我们做Android用户级应用开发的时候都要考虑这样的问题,目前的应用市场有很多,我们的安装包是通过哪个渠道进入用户手机的,总得统计一下吧,这就要说到多渠道打包了.多年前刚入行的时候,打包就是在代码里 ...

  9. as将安卓应用打包_Android Studio打包生成apk的方法(超级简单哦)

    释放双眼,带上耳机,听听看~! 打包文件是需要生成APK文件,其他人可以通过APK安装和使用,一般来说,包是指APK生成的发布版本,下文技术狗小编还介绍了Android Studio 超级简单的打包生 ...

最新文章

  1. API聚合网关技术选型参考-网友实战-使用协程
  2. App上架/更新怕被拒? iOS过审“避雷秘籍”请查收
  3. Spring AOP知识详解
  4. 多标签分类任务大赛50万奖金等你来
  5. 内存卡无法格式化 修复
  6. 【资料分享】干货解读人工智能新时代
  7. pe_xscan作了3点更新 1
  8. Adobe Acrobat Pro制作pdf模板
  9. 常见电子元器件的极性识别方法
  10. 元素周期表排列的规律_元素周期表的元素排列规律和元素的性质
  11. Winrm+python远程连接windows执行命令
  12. 如何避开微信小程序的审核机制(实测有效)
  13. matlab 切点投资组合 程序,MATLAB证券投资组合分析
  14. 粉丝经济大爆发居然真的来了
  15. Django项目:极致果蔬(一)
  16. 完成java课设的经验_课设后的感想
  17. 响应式web设计_将响应式Web设计超越视觉
  18. WinSetupFromUSB安装XP系统后删除U盘多余的隐藏分区
  19. 51单片机汇编学习例程(16)——AT24C02篇
  20. 《大数据时代》(维克托·迈尔舍恩伯格) 小记

热门文章

  1. windows 7 64bit python3.3安装pyqt
  2. Js将字符串转数字的方式
  3. raspberry 防火墙_用于数据科学,Linux防火墙,Raspberry Pi NAS,openmediavault,Syncthing,微服务等的Python库
  4. arcade 物理系统_如何使用Python和Arcade库创建2D游戏
  5. 让电脑说话代码_让您的代码为您说话
  6. 下载 Bootstrap3 的 Sass 版本
  7. 作为函数的mixin
  8. lynx命令调用php脚本,lynx
  9. java输入args不能为空_java程序入口为什么有的空括号在args前面有的?
  10. php中strtotime的意思,PHP中strtotime