Android项目构建之build.gradle配置与打包

2023-10-27

一、build.gradle配置

Google推荐使用的Android Studio是采用Gradle来构建项目的。Gradle是用了一种基于Groovy的领域特定语言(DSL,Domain Specific Language)来声明项目设置。因此有必要稍微了解一些使用Gradle编译Android App的常见配置方式。

1、统一配置工程中的compileSdkVersion、buildToolVersion等

由于Android studio创建的项目中可以包含多个module,像compileSdkVersion就需要为每一个module中设置,实在是麻烦了,使用统一配置,就如同一个全局变量,修改定义的地方,所有使用的地方都生效了。

<1> 在项目的根目录下创建一个config.gradle(名字随意)文件

config.gradle里的数据根据项目需要进行设置。如:

ext {
  android = [
        compileSdkVersion: 26,
        buildToolsVersion: '26.0.2',
        minSdkVersion    : 14,
        targetSdkVersion : 26
  ]
  dependencies = [
         appcompatV7 : 'com.android.support:appcompat-v7:26.1.0',
         design      : 'com.android.support:design:26.1.0',
	     junit       : 'junit:junit:4.12',
		 constraint  : 'com.android.support.constraint:constraint-layout:1.0.2'
   ]
}

<2> 在工程的根目录下的build.gradle的顶部声明config.gradle文件,如:

apply from: "config.gradle"

<3> 在app或者其它module中使用全局参数,修改后的app的build.gradle 如下:

//定义两个变量
def configInfo = rootProject.ext.android
def libraryInfo = rootProject.ext.dependencies
				
android {
   compileSdkVersion configInfo.compileSdkVersion
   buildToolsVersion configInfo.buildToolsVersion
   defaultConfig {
         applicationId "com.test.demo.test"
         minSdkVersion configInfo.minSdkVersion
         targetSdkVersion configInfo.targetSdkVersion
         versionCode 1
         versionName "1.0"
         testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
         flavorDimensions "versionCode"
   }
   buildTypes {
         release {
              minifyEnabled false
              proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
         }
    }
}

dependencies {
      implementation fileTree(include: ['*.jar'], dir: 'libs')
      implementation libraryInfo.appcompatV7
      implementation libraryInfo.constraint
      implementation libraryInfo.design
      implementation libraryInfo.junit
}
2、gradle.properties配置数据,如签名

<1> 在gradle.properties配置:

signing_keyAlias=androidreleasekey
signing_keyPassWord=android
signging_storeFile=../release.keystore  //签名文件的路径
signging_storePassword=123

<2> 在app或者其它module中使用签名

android {
    compileSdkVersion configInfo.compileSdkVersion
	buildToolsVersion configInfo.buildToolsVersion
    defaultConfig {
         applicationId "com.test.demo.test"
         minSdkVersion configInfo.minSdkVersion
         targetSdkVersion configInfo.targetSdkVersion
         versionCode 1
         versionName "1.0"
         testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
         flavorDimensions "versionCode"
    }
	//签名配置		
	signingConfigs {
           releaseConfig {
                keyAlias "${signing_keyAlias}"
                keyPassword "${signing_keyPassWord}"
                storeFile file(signging_storeFile)  
                storePassword "${signging_storePassword}"
           }
    }
				
    buildTypes {
           release {
               minifyEnabled false
			  signingConfig signingConfigs.releaseConfig
               proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
          }
    }

}
3、使用自定义BuildConfig

举个列子:在调试代码的时候希望显示Log日志信息,但是当发布时不希望显示Log信息。可以通过配置buildTypes来达到在release版本中自动关闭Log的效果

<1> 首先在buildTypes中添加buildConfigField:

buildTypes {
       release {
            minifyEnabled false
            buildConfigField "boolean", "IS_SHOW_LOG", NOT_SHOW_LOG
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
       }
       debug {
            minifyEnabled false
            buildConfigField "boolean", "IS_SHOW_LOG", SHOW_LOG
       }
}

buildConfigField 各参数含义:

String type 要创建的字段类型,如上面的boolean
String name 要创建的字段名,如上面的IS_SHOW_LOG
String value 创建此字段的值,如上面的NOT_SHOW_LOG(false)

配置的buildConfigField参数,编译后会在\app\build\generated\source\buildConfig文件夹下会自动生成对应版本对应module的BuildConfig.java文件,该文件可以在代码中直接使用。

<2> 在项目中打印log的类中使用,比如编写一个MyLogUtils.java类

public class MyLog {
     public static int v(String tag, String msg) {
             if (BuildConfig.IS_SHOW_LOG) {
                return Log.v(tag, msg);
            } else {
                 return -1;
            }
      }
}
4、使用productFlavors实现Android项目多渠道打包

productFlavors顾名思义,就是用来分别定义产品不同的特性,使用它可以用一套代码创建不同的产品。

设置productFlavors的方法就是在app中的build.gradle中加入productFlavors结构:

android{
   ......
   productFlavors{
        productA{
              //这里定义产品A的特性
        }
       productB{
             //这里定义产品B的特性
        }
          //更多产品 ...
    }
	......
}

productFlavors的应用场景

<1> 不同包名的apk

通过设置不同的applicationId就可以编译出不同包名的APK

productFlavors{
    demo1{
        applicationId "com.gavinandre.product.a"
        versionName "version-a-1.0"
   }
   demo2{
        applicationId "com.gavinandre.product.b"
        versionName "version-b-1.0"
  }
  //更多产品 ...
}

<2> 不同渠道包的产品
由于国内引用市场较多,因此需要为不同市场打包相应的包,以友盟为例:

productFlavors{
        wandoujia {
            manifestPlaceholders = [UMENG_CHANNEL_VALUE: "wandoujia"]
         }
         baidu {
            manifestPlaceholders = [UMENG_CHANNEL_VALUE: "baidu"]       
		 }
         360 {
             manifestPlaceholders = [UMENG_CHANNEL_VALUE: "c360"]
         }
         uc {
             manifestPlaceholders = [UMENG_CHANNEL_VALUE: "uc"]
         }
}

或者

productFlavors {
   wandoujia {}
   baidu {}
   360 {}
   uc {}
   productFlavors.all { flavor ->
          flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
    }
}

<3> 不同依赖库的产品

productFlavors还支持自定义依赖,不同的apk只编译自己需要的依赖库,不需要编译对自己无用的依赖库

dependencies {
        ....
       demo1Compile "com.android.support:appcompat-v7:25.1.1"
       demo2Compile "com.android.support:support-v4:25.1.1"
}

使用productFlavors里定义的产品名+Compile关键字来替代compile关键字

<4> 不同代码和资源的产品

gradle中有一个sourceSet概念,不同APK可以设置不同的sourceSet,通常src/main目录是ide自动帮我们创建的文件夹,因此我们可以在src目录下创建demo1/demo2这样的目录,目录名需要和productFlavors中定义的产品名对应。这样src/demo1/java文件内可以放不同的代码,src/demo2/res文件夹内可以放不同的资源文件,同时也可以定义不同的AndroidManifest文件,比如申请不同的权限之类。

注意:默认的main文件夹里存在的文件在其他适配目录中不允许出现相同文件名的文件,如果差异化特别大可以将文件抽取出来单独放到各个差异包下,main文件下不创建差异文件。

二、assemble打包命令

./gradlew assembleDebug
编译并生成Debug包,包含productFlavors下所有定义的产品或渠道包

./gradlew assembleRelease
编译并生成Release包,包含productFlavors下所有定义的产品或渠道包

./gradlew assembleWandoujia
编译并生成Release和Debug包,仅生成productFlavors下定义的wandoujia渠道

./gradlew assembleWandoujiaRelease
编译并生成Release包,仅生成productFlavors下定义的wandoujia渠道

apk生成目录在rootProject/app/build/outputs/apk目录下

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android项目构建之build.gradle配置与打包 的相关文章

随机推荐

  • 【Flutter 3-1】Flutter手把手教程UI布局和Widget——底部导航栏BottomNavigationBar使用

    作者 弗拉德 来源 弗拉德 公众号 fulade me BottomNavigationBar BottomNavigationBar 和 BottomNavigationBarItem 配合来共同展示Flutter里面的底部状态栏 底部状
  • 敏捷开发之Scrum扫盲篇

    转载至 http www cnblogs com taven archive 2010 10 17 1853386 html 现在敏捷开发是越来越火了 人人都在谈敏捷 人人都在学习Scrum和XP 为了不落后他人 于是我也开始学习Scrum
  • kerberos 术语和认证流程介绍

    重要术语 1 KDC 全称 key distributed center 作用 整个安全认证过程的票据生成管理服务 其中包含两个服务 AS和TGS 2 AS 全称 authentication service 作用 为client生成TGT
  • 操作系统的文件结构

    文件的 逻辑结构 主要有 1 连续结构 2 多重结构 3 转置结构 4 顺序结构 文件的 物理存储 主要有 1 顺序结构 2 链接结构 3 索引结构 文件的 目录结构 主要有 1 一级目录结构 2 二级目录结构 3 树形结构 4 无环图
  • Springboot定时任务

    下文为 Scheduled的使用方法 1 简介 Scheduled支持三种部署方式 fixedRate fixedRateString 上一次执行开始后 n秒后再次执 fixedDelay fixedDelayString 上一次执行完毕后
  • 舵机的三条线分别代表什么

    橙色信号线 红色正极 棕褐色负极
  • @RequestParam和@PathVariable的用法与区别

    SpringBoot PathVariable URL变量 Web应用中的URL通常不是一成不变的 例如微博两个不同用户的个人主页对应两个不同的URL http weibo com user1和http weibo com user2 我们
  • 工厂(factory)模式

    转自 http www cnblogs com hegezhou hot archive 2010 11 30 1892227 html 一 开篇 一个多月没有写文章了 一方面是由于家庭的原因 还有一方面是因为工作上的原因 所以在这里给大家
  • 使用hutool库,对excel进行一些导出、导入操作

    所用到的各种类 依赖的话百度一下吧 最后再给上全部代码 import cn hutool core collection CollUtil import cn hutool core io IoUtil import cn hutool p
  • Struts 2 标签

    原文 https www mkyong com struts2 struts 2 shidden hidden value example 在struts2中可以使用
  • 调gensim库,word2vec模型的保存和加载

    一 模型的保存 模型保存可以有很多种格式 根据格式的不同可以分为2种 一种是保存为 model的文件 一种是非 model文件的保存 我常用的保存格式是 model和 vector直接上代码和结果 1 保存为model文件 数据的读入 fi
  • PCIe中断之MSI和MSI-X的区别(详细)总结附图文快速掌握

    目录 一 整体介绍 二 MSI和MSI X对比 2 1 中断向量连续 2 2 映射区域区别 2 3 MSI X配置空间 2 3 1 MSI X Capbility介绍 2 3 2 Capbility ID介绍 2 3 3 Message C
  • tree树做过滤

    代码如下 递归tree关键词搜索 param key 需要递归的key名 param keyword 需要搜索查询的关键字 param treeList 遍历tree列表 param first 是否是首次传入 默认true functio
  • Thymeleaf (select、checkbox)数据绑定和数据回回显

    第一种情况 select 数据绑定 前端页面 div class col sm 10 div
  • 放大电路中的自激震荡及相位补偿方法

    自激震荡 产生原因 1 电容对信号的超前和滞后作用 要分析自激震荡 首先得了解电路中的相移 放大电路中使信号发生相移的罪魁祸首主要在于电容 如果电容串接在电路中 则构成高通滤波电路 在截止频率之前相位超前90 2 之后相移为0 如图1所示
  • 2023年数学建模:种群竞争模型及其MATLAB实现

    订阅专栏后9月比赛期间会分享思路及Matlab代码 目录 种群竞争模型 MATLAB实现 实战案例 两种昆虫的竞争
  • Typora常用快捷键(详细)

    1 typora常用快捷键 ctrl 切换编辑语法模式 预览模式 ctrl 1 6 标题1 6 等同于 一级标题 空格 标题内容 二级标题 空格 标题内容 三级标题 空格 标题内容 最多六级标题 ctrl B 粗体 ctrl I 斜体 ct
  • Unity编译Android的原理解析和apk打包分析

    作者 张坤 最近由于想在Scene的脚本组件中 调用Android的Activity的相关接口 就需要弄明白Scene和Activity的实际对应关系 并对Unity调用Android的部分原理进行了研究 本文主要探讨Scene和Activ
  • [机器学习] 代价函数(cost function)

    前言 代价函数也叫做损失函数 loss function 机器学习中训练模型的过程就是优化代价函数的过程 代价函数对每个参数的偏导数就是梯度下降中的梯度 1 代价函数的定义 假设有训练样本 x y 模型为f 参数为w f w wTx w T
  • Android项目构建之build.gradle配置与打包

    一 build gradle配置 Google推荐使用的Android Studio是采用Gradle来构建项目的 Gradle是用了一种基于Groovy的领域特定语言 DSL Domain Specific Language 来声明项目设