Android build.gradle文件

news2024/12/27 13:44:18

一、ABI(Application Binary Interface)应用程序二进制接口

     其实ABI可以不设置,这样编译时,就会将项目里所有依赖资源包里的so库都打到最终的apk里。 但是,ABI支持多的话,apk也会大,所以一般只支持一种即可。 目前Android 版本,ABI一般配置armeabi-v7a.

注意:

新增so库

新增so库的话,需要在每个在用的文件夹内(armeabi、armeabi-v7a、arm64-v8a ==)放置,否则so库找不到。多个目录,目录下的so库文件数需要相同。

armeabi-v7a 和 armeabi

如果设置支持armeabi-v7a 和 armeabi:如若第三方提供的so只有armeabi,那么armeabi-v7a 内也需要拷贝一份,原因是armeabi-v7a 和 armeabi必须so数一致,且armeabi-v7a支持armeabi hardware does not support

ABI设置错误,可能出现硬件不支持的问题,提示:hardware does not support

二、splits 的属性

1、abi

  • 类型:AbiSplitOptions
  • 描述:对 abi 进行分包处理,具体我们看下面 AbiSplitOptions 讲解。

2、AbiSplitOptions 类型

2.1 enable

  • 描述:是否开启 abi 分包,默认不开启
  • 使用:

splits {
    abi {
        enable true
    }
}
效果图如下:

在这里插入图片描述

2.2 exclude
描述:排除不需要的架构。
使用:

abi {
    // 是否开启
    enable true

    // 排除不必要的架构
    exclude 'x86','arm64-v8a'
}

效果图:

在这里插入图片描述
2.3 reset
描述:清除默认架构列表。当我们开启abi 分包时,gradle会帮我们初始化一个架构列表,例如 enable 小节中,我们并没有设置任何架构,而gradle会帮我们分出 “arm64-v8a”、“armeabi-v7a”、“x86”、“x86_64”。
初始化列表会因为gradle的版本不同有所改变

使用:

abi {
    // 是否开启
    enable true

    // 重置包含的目录
    reset()
}
2.4 include
描述:设置我们需要的架构。注意的是,我们需要先使用reset方法将默认列表清空,然后再设置。

使用:

abi {
    // 是否开启
    enable true

    // 重置包含的目录,因为已经是包含全部
    reset()
    // 设置包含,调用前需要先用 reset 将默认清除
    include 'armeabi-v7a', 'x86'
}
效果图:

在这里插入图片描述
2.5 universalApk
描述:是否编译一个包含全部架构的apk。
使用:

abi {
    // 是否开启
    enable true

    // 是否打出包含全部的apk
    universalApk true
}
效果图:

在这里插入图片描述

三、sourceSets属性——文件路径配置

 sourceSets {
      main {
           manifest.srcFile 'AndroidManifest.xml' // 指定清单文件
           res.srcDirs = ['res'] // 指定res资源目录
           assets.srcDirs = ['assets']    // asset资源目录
           jni.srcDirs 'src/main/jni'     // jni代码目录
           jniLibs.srcDir 'src/main/jniLibs' // jni库目录
           java.srcDirs = ['src'] // 指定java源代码目录
           resources.srcDirs = ['src'] // 指定resource目录
           aidl.srcDirs = ['src'] // 指定aidl目录
           renderscript.srcDirs = ['src'] // 指定source目录
        }
     debug.setRoot('build-types/debug') // 指定debug模式的路径
     release.setRoot('build-types/release') // 指定release模式的路径

}

四、packagingOptions属性——打包配置

    打包配置:
    1、pickFirsts:当出现重复文件,会使用第一个匹配的文件打包进入apk
    2、merges:当出现重复文件,合并重复的文件打入apk
    3、excludes:打包的时候排除匹配的文件
    packagingOptions {
            pickFirsts = ['META-INF/LICENSE']
            //这里不要直接=赋值,避免覆盖掉默认值
            merge 'META-INF/LICENSE'
            //这里不要直接=赋值,避免覆盖掉默认值
            exclude 'META-INF/LICENSE'
        }

五、compileOptions属性——Java 的版本配置

compileOptions {

// 在这里你可以进行 Java 的版本配置,

// 以便使用对应版本的一些新特性

 }

六、flavorDimensions属性—— 多维度理解(版本差异化打包)

flavorDimensions 从单词字面理解知道是 “风味维度”

是需要结合 “产品风味(即productFlavors)” 来一起使用的。

android {
    // 省略其他参数
    flavorDimensions 'ENV', "DEVICE_TYPE"
}

定义出两个维度:env和 device_type。一个参数一个维度

多维度理解
其实这涉及到了版本差异化打包的内容,如果说3.0以前的版本差异化打包更多的是为了厂商定制的,那么3.0以后的版本差异化打包就是在厂商的基础之上加入了机型,渠道等一些参数,变成了多个维度的产品。

也就是说之前的一个产品只有一个参数进行描述的话,现在就可以为其增加多个参数进行配置,比如A厂商的A渠道的A机型、A厂商的B渠道的C机型等,维度越多,产品的样式越发丰富。

 

好了,理论说完,接下来就是进行通俗易懂的一些示例了,只有实践才能让自己检验到真理。

新建项目,然后在app/build.gradle文件里配置两个风味维度(“company”,“channel”),如下:

defaultConfig {
        applicationId "com.voctex.flavorsapp"
        minSdkVersion 18
        targetSdkVersion 27
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
 
        flavorDimensions "company","channel"
    }

然后进行产品的多维度配置:

productFlavors{
        //随便命名,建议根据该维度的具体信息进行命名
        companyA{
            dimension "company"
        }
        companyB{
            dimension "company"
        }
        channelA{
            dimension "channel"
        }
        channelB{
            dimension "channel"
        }
    }

配置完之后,sync构建一下项目。

打包构建之后就会出现多个维度的产品,对应如下,如图: 

可以理解为总共有两个维度,公司(company)和渠道(channel),这里公司的维度排前面(排序先后有要求,下面会讲到),所以所有的产品就是,A公司的A渠道产品,A公司的B渠道产品,B公司的A渠道产品,B公司的B渠道产品。
可见,增加维度之后,版本差异化的内容就更为丰富了。

上面说了,维度的定义先后是有要求的,不可随便,下面为了验证这个说法进行了一项测试,我们在productFlavors里给每一个特点产品定义一个常量,常量的值就是该特点产品的名字。如下:

 productFlavors{
        companyA{
            dimension "company"
            buildConfigField "String","FLAVOR_NAME","\"companyA\""
        }
        companyB{
            dimension "company"
            buildConfigField "String","FLAVOR_NAME","\"companyB\""
        }
        channelA{
            dimension "channel"
            buildConfigField "String","FLAVOR_NAME","\"channelA\""
        }
        channelB{
            dimension "channel"
            buildConfigField "String","FLAVOR_NAME","\"channelB\""
        }
    }

这里有个要注意的点就是在BuildConfig定义String的常量时,需要把双引号也加进去。

然后进行跟刚才一样的构建,对比几个风味维度的BuildConfig文件里的这个FLAVOR_NAME常量,会发现总是显示第一维度company的值,而第二维度channel的值并不存在,所以当产生多维度的产品时,定义的一些常量总是以第一维度的配置为准。结果如下:

BuildConfig.java 文件生成后会在app/build/generated/source/buildConfig/companyAChannelA/release/com/voctex/flavorsapp/BuildConfig.java

 

 

 实验证明,当你在各个维度各自定义了同一个常量的值,总是以第一维度的为准,只有第一维度的定义或者说是修改才是有效的。

 

七、productFlavors属性——不同渠道发布配置

productFlavors 从字面了解是“产品风味”。他需要和一个风味维度对接,否则会报错。

接着我们上面的例子,使用 productFlavors 定义维度上的风味,使用 dimension 关联。

productFlavors {
         // 在这里你可以设置你的产品发布的一些东西,
         // 比如你现在一共软件需要发布到不同渠道,
         // 且不同渠道中的包名不同,那么可以在此进行配置;
         // 甚至可以设置不同的 AndroidManifest.xml 文件。
         hebbe {
         }
         googlePlay {
         }
         solo {

            // applicationId 应用的包名,会覆盖 defaultConfig 中的 applicationId
            // applicationId 会替换 AndroidManifest.xml 中的 manifest 标签下 package 的 value
            applicationId "com.zinc.power"
            // 会追加在 applicationId 字符串的后面,形成最终的包名。
            applicationIdSuffix '.debug'
            // 风味的维度,指定我们当前风味所所属的维度
            dimension 'version'
            配置差异化的 logo 和 app名字
            manifestPlaceholders = [
                    logo    : "@drawable/logo_bear",
                    appName : "bear",
            ]
            // 配置签名
            signingConfig signingConfigs.xiaopenyou

         }
    }


七、dependencies属性——项目依赖关系配置


 // 指定当前项目的所有依赖关系:本地依赖、库依赖、远程依赖
 // 本地依赖:可以对本地 Jar 包或目录添加依赖关系
 // 库依赖:可以对项目中的库模块添加依赖关系
 // 远程依赖:可以对 jcenter 库上的开源项目添加依赖
 // 标准的远程依赖格式是 域名:组织名:版本号
 dependencies {
     implementation fileTree(dir: 'libs', include: ['*.jar']) // 本地依赖
     // 远程依赖,com.android.support是域名部分,appcompat-v7是组名称,26.1.0是版本号
     implementation 'com.android.support:appcompat-v7:26.1.0'
     implementation 'com.android.support.constraint:constraint-layout:1.0.2'
     implementation project(':hello') // 库依赖
     testImplementation 'junit:junit:4.12' // 声明测试用列库
     androidTestImplementation 'com.android.support.test:runner:1.0.1'
     androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'
 }
 

参考文章:Android ABI_android_abi_清风徐来辽的博客-CSDN博客

Android ABI_android_abi_清风徐来辽的博客-CSDN博客

Android 基础知识总结(一) build.gradle文件_build.gradle sourcesets_&岁月不待人&的博客-CSDN博客

Android 打包 flavorDimensions和productFlavors_flavordimensions打包_weixin_50386489的博客-CSDN博客

Android Studio3.0 flavorDimensions多维度理解(版本差异化打包)_安卓为什么要多维度打包_锐湃的博客-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/671425.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL数据库——存储引擎

MySQL数据库——存储引擎 一、MySQL存储引擎1.存储引擎的概念2.常用存储引擎3.存储引擎的分类4.企业选择存储引擎依据 二、MyISAM 存储引擎1 MyISAM的相关了解2 MyISAM的特点3 MyISAM表支持3种不同的存储格式4.MyISAM适用的生产场景 三、InnoDB 存储引擎1 InnoDB的相关了解2 In…

探索NDK和逆向工程在Android开发中的力量

NDK是什么? NDK(Native Development Kit)是一组工具集,用于在Android平台上开发和构建使用C或其他本地语言编写的应用程序。NDK提供了一些库和工具,使开发人员能够在应用中使用本地代码,并实现与Java代码的…

ant+svn项目打包部署错误记录

安装ant可以参考下这个 http://t.csdn.cn/kx1ZX 第一个错误,原因是缺少ant-contrib.jar导致,将对应jar包放入ant的lib下即可 [taskdef] Could not load definitions from resource net/sf/antcontrib/antcontrib.properties. It could not be found. B…

低/无代码平台:公民开发和公民自动化,让人人成为软件开发者

在企业数字化转型领域,公民自动化是一个备受关注的概念。虽然这个词汇可能有些“陌生又熟悉”,但在公民开发运动中已经引起了不小的轰动。那么,什么是公民自动化?它与公民开发之间又有哪些不同? 公民开发是什么&#x…

ATTCK 红日靶场(三)-简记

Step 1-》信息收集 端口 nmap -p -A -sV 192.168.1.110 目录 dirsearch -u 192.168.1.110 --exelude-status 400,401,403,404,501,503 访问 ip/1.php -->根目录、禁用函数 ip/robots.txt !!!------- IP/administrator-->>joomla-cms IP/configuration.php~--&…

利用uniapp创建移动端项目

目录 申请微信开发者账号 一、特殊声明 二、申请微信开发者账号 创建小程序项目 一、引言 二、创建小程序工程 三、uni-app框架简介 初识uniapp项目 一、uni-app工程目录结构 二、创建练习页面 创建登录页面 一、拷贝所有素材文件 二、创建登陆页面 创建注册页面 …

【机器学习与遥感】sklearn与rasterio实现遥感影像监督分类

在学习遥感的过程中,我们都了解到了监督分类与非监督分类,二者是遥感解译的基础。之前更多的是使用Erdas与ENVI来进行这两种分类。这里使用python语言,基于机器学习库sklearn与遥感影像处理库rasterio,使用kmeans动态聚类方法实现…

实施计划:项目成功执行的关键

为了增加成功的机会,特别是当涉及到大型或复杂的项目时,团队可能需要关于项目执行过程的额外指导。实施计划可以用于这一目的。 简而言之,项目实施计划是一份文件,作为项目如何执行的路线图。它规定了项目完成过程中的步骤&#…

<C++> C++11右值引用

C11右值引用 1.左值引用和右值引用 传统的C语法中就有引用的语法,而C11中新增了的右值引用语法特性,所以从现在开始我们之前学习的引用就叫做左值引用。无论左值引用还是右值引用,都是给对象取别名。 什么是左值?什么是左值引用…

sonar-scanner-Windows本地Python代码检查使用方法【免费下载sonar-scanner验证有效】

背景介绍: sonar作为开源的代码扫描工具,sonar-scanner是windows扫描器。SonarQube是一个开源的代码质量管理平台,可以将 sonar-scanner扫描的结果进行分析。 公司有搭建SonarQube质量管理平台,支持本地扫描和gitlab集成扫描。现…

locust学习教程(7) - docker运行单个locust脚本

目录 1、安装 docker 2、下载镜像 3、运行脚本 4、开始压测 🎁更多干货 1、安装 docker widnows安装docker客户端blog.csdn.net/weixin_4545… 实施步骤: 第一步、启动docker客户端 2、下载镜像 cmd窗口下载locust镜像文件:docker pul…

隐私链或成监管和虚拟货币犯罪打击新挑战?

匿名币、混币器等是大家在当前案件侦办中常遇到的资金追踪“拦路虎”,而在区块链中还有一些隐私保护方案(隐藏交易相关信息),可能大家较少涉猎,在当前的区块链相关案件中也还没有明显的表现,我们也希望通过…

深度解析:分布式事务解决方案大盘点,助你轻松应对复杂业务场景

随着互联网的发展,分布式系统已经成为了现代软件开发的主流。在分布式系统中,多个节点之间需要协同工作,以完成一些复杂的任务。然而,由于节点之间的网络延迟、故障等问题,这些节点之间可能会出现数据不一致的情况&…

华为OD机试真题 JavaScript 实现【最多获得的短信条数】【2023Q1 100分】,附详细解题思路

一、题目描述 某云短信厂商,为庆祝国庆,推出充值优惠活动。现在给出客户预算,和优惠售价序列,求最多可获得的短信总条数。 二、输入描述 第一行客户预算M,其中 0 ≤ M ≤ 10^6第二行给出售价表, P1, P2,…

一切美好如夏而至,中国人民大学与加拿大女王大学金融硕士项目陪你逐梦硕士

流光半夏,美好日长。愿所有春天里的酝酿,都在夏天热烈绽放。你春天酝酿的读研梦有实现吗?在这个最长的白昼,让我们与中国人民大学与加拿大女王大学金融硕士项目邂逅,一起在盛夏里追寻诗与远方。 都说有梦想&#xff0…

【07】STM32·HAL库开发-新建寄存器版本MDK工程 |下载STM32Cube固件包 | 新建MDK工程步骤

目录 1.新建工程前的准备工作(了解)1.1下载相关STM32Cube 官方固件包(F1/F4/F7/H7) 2.新建寄存器版本MDK工程步骤(熟悉)2.1新建工程文件夹2.1.1Drivers文件夹2.1.2Middlewares文件夹2.1.3Output文件夹2.1.4Projects文件…

零基础入门网络安全,收藏这篇不迷茫【2022 最新】

前言 最近收到不少关注朋友的私信和留言,大多数都是零基础小友入门网络安全,需要相关资源学习。其实看过的铁粉都知道,之前的文里是有过推荐过的。新来的小友可能不太清楚,这里就系统地叙述一遍。 01.简单了解一下网络安全 说白…

ASEMI代理光宝光耦LTV-61L的工作原理与应用探析

编辑-Z 本文将对光耦LTV-61L进行深入的探讨,主要从其工作原理、应用领域、使用注意事项以及市场前景四个方面进行详细的阐述。光耦LTV-61L是一种常用的光电器件,其工作原理简单,应用领域广泛,但在使用过程中也需要注意一些问题。…

1分钟!免费将AI图像创作能力接入办公系统

随着人工智能技术的日新月异,各行各业都在尝试将AI技术融入到自己的生产和服务中以提升效率和用户体验,绘画领域也在迎来一轮新的生产方式革新。在数字绘画领域,AI绘图软件的出现,为数字绘画领域注入了新的活力。 但我们在使用AI绘…

【正点原子STM32连载】第三十八章 CAN通讯实验 摘自【正点原子】STM32F103 战舰开发指南V1.2

1)实验平台:正点原子stm32f103战舰开发板V4 2)平台购买地址:https://detail.tmall.com/item.htm?id609294757420 3)全套实验源码手册视频下载地址: http://www.openedv.com/thread-340252-1-1.html# 第三…