Android Studio打包以及Gradle配置构建

本文转载 郭霖公众号

https://mp.weixin.qq.com/s?__biz=MzA5MzI3NjE2MA==&mid=2650241610&idx=1&sn=b8af73f6c288b6617d9fe0ab3618118d&pass_ticket=QK4j37kpmGNlsYcECWMb64HxKHEVJG5mSJubQEQguKI%3D

生成签名文件手动打包

首先生成签名文件,点击 Build -> Generate Signed APK:

如果还没有签名文件,点击构造一个:

图中圈住的三个地方是重要信息,其余随意填。生成以后,就可以用该签名文件继续签名打包:

填入刚才的信息,继续:

选好输出路径,选择打包类型,完成!

 

通过配置自动打包

 

如果你觉得上述打包步骤太麻烦,那么我们就开始在gradle里添加配置,自动打包。

快捷键 Ctrl+Alt+Shift+S 或者 File -> Project Structure:

选择 application,在 Signing 标签下添加签名配置,这里的 Store File 就是我们的签名文件。我们还可以继续添加构建类型,选择 Build Types 标签,添加 release,选择刚才的签名配置:

这样我们就有了 debug 和生产类型的两种打包方式,以后就可以根据需要自动打包。选中工程,点击 Build -> Select Build Variant,选择 release:

然后点击 Build -> Build APK,打包文件在 ..\app\build\outputs\apk,如此便使用我们自己的签名文件,打好了一个生产包。同样也可以打出 debug 包,如果在 Build Types 中我们没有设置 Signing Config,系统默认使用自带的 debug 签名文件打包。

 

 

隐藏签名文件敏感信息

 

我们设置过打包配置以后,Gradle 自动 Sync,会在 application的 build.gradle 文件中生成下面代码:

signingConfigs { config { keyAlias 'gaok_release' keyPassword '199110' storeFile file('E:/GK/gaok.jks')            storePassword '199110'        }    } 

这些都是签名文件的敏感信息,如果我们在协同开发的时候,最好把这些信息隐藏掉。

首先在工程根目录下新建一个 keystore.properties 文件:

 

storePassword=199110keyPassword=199110keyAlias=gaok_release 
storeFile=E:/GK/gaok.jks

这里要注意:所有属性都没有单引号.然后再在 build.gradle 文件的如下位置添加:

 

apply plugin: 'com.android.application' 
// Create a variable called keystorePropertiesFile, and initialize it to your
// keystore.properties file, in the rootProject folder.

def keystorePropertiesFile = rootProject.file("keystore.properties") // Initialize a new Properties() object called keystoreProperties.

def keystoreProperties = new Properties() // Load your keystore.properties file into the keystoreProperties object.

keystoreProperties.load(new FileInputStream(keystorePropertiesFile)) android {    …… }

 

读取到 keystore.properties 文件,然后更改配置:

android { signingConfigs { config { keyAlias keystoreProperties['keyAlias'] keyPassword keystoreProperties['keyPassword'] storeFile file(keystoreProperties['storeFile'])            storePassword keystoreProperties['storePassword']        }    } }

 

这样,所有的敏感信息都放在了文件里,只需要好好保存 keystore.properties 文件就行了,记得可别把文件也传到git里!

 

设置风味实现不同风味资源替换

 

什么是风味?看这个图:

我们在 Flavors 标签下可以添加多个“风味”,以满足个性化需要。

设置完风味以后,我们的 build.gradle 文件会生成如下:

 

productFlavors { huawei {}       // 华为商店 baidu {}        // 百度手机助手 yinyongbao {}   // 应用宝 }

 

比如这里我添加了多个应用市场的渠道,每个渠道可能要适配不同的 SDK 版本;也可能我想要实现不同风味包(例如:生产和 debug 模式)的 logo 不同、某些代码不同,那我们就可以设置源集目录,专门收录不同不同配置下的代码和资源文件。首先切换到 Project 视图,我们的工程默认是只有 main 源集,即 ../src/main 。

下面添加一个debug类型的源集:

这里的 Target Source Set 会包含 buildTypes、productFlavors 和二者的组合变体。我这里设置了debug 和 release 两种类型,huawei、yingyongbao、baidu三种风味,所以会出现上图中这么多选项。我们选择 debug,系统自动给我们的工程生成了对应目录。

同样的可以添加 XML 文件目录:

我这里添加了 values 文件,同理可以添加 colors、strings、styles文件。

继续添加图片资源:

这里只是示例,我选择了一个不同的图标:

这里提示:图标名字重复,因为 main 源集里已经有 ic_launcher 图标了,不过没关系,我们在下一步选择 debug 源集:

最终目录如下:

现在我们有了 debug 源集,源集里有一个不同的 app logo,这意味着,如果我们现在打了debug包,它的图标将会是 debug 源集下的图标,如下图,左侧是 debug 包,右侧是release 包。

至于我为什么可以同时装上 debug 包和 release 包,因为我添加了 applicationIdSuffix:

buildTypes { release { 
      minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
      signingConfig signingConfigs.config       applicationIdSuffix ".release"   }   debug {       signingConfig signingConfigs.config       applicationIdSuffix ".debug"
  }
}

applicationIdSuffix 字段表示:在不改变你默认的程序ID(包名)的情况下,为其添加后缀。比如你的包名是 com.gk.app,但你想区分测试包和正式包的情况,这个时候将applicationIdSuffix 设置为.debug,那么你的应用程序对应的包名就变成了com.gk.app.debug

 

多渠道打包

 

工作中,软件包的发布工作一般是由运营小伙伴完成,包名格式一般会是:app + 版本号 + 渠道 ,不同渠道可能要进行不同的配置,因此我们必须针对所有渠道添加对应的风味。

android{ productFlavors { //三个渠道 huawei {}       // 华为商店 baidu {}        // 百度手机助手 yinyongbao {}   // 应用宝 } // 批量渠道包值替换(有些第三方库中需要用到渠道名)    productFlavors.all { flavor ->        // 友盟、极光推送渠道包, UMENG_CHANNEL 是根据你AndroidManifest.xml来配置的,请看下面。        flavor.manifestPlaceholders = [UMENG_CHANNEL: name, JPUSH_CHANNEL: name]    } }

这里的 UMENG_CHANNEL 是在 AndroidManifest.xml 文件中配置的:

<!--变量采用${变量名}这样来替换,不局限于<meta-data/> 标签,任何你想替换的都行--> 
<meta-data android:name="UMENG_APPKEY" android:value="${UMENG_APPKEY}"/>

 

然后批量重命名:

android{ …… // 输出文件配置,格式如下:app-{版本号}-{渠道名称}.apk applicationVariants.all { variant -> variant.outputs.each { output -> def outputFile = output.outputFile if (outputFile != null && outputFile.name.endsWith('.apk')) {                def dirName = outputFile.parent // 输出文件夹所在的位置                // 文件名修改                def fileName = "app-${defaultConfig.versionName}-${variant.flavorName}.apk"                output.outputFile = new File(dirName, fileName)            }        }    }    …… }

如此再看 Select Build Variant:

我们打一个 baidu release 包:

同理,多渠道打包完成。

转载于:https://www.cnblogs.com/wlwqnj/p/7676214.html

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

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

相关文章

去除inline-block间隙的几种方法

为什么会产生间隙&#xff1f; 由于编写代码时的美观和可读性&#xff0c;在代码中添加回车或空格而产生的间隙。 html代码&#xff1a; <ul class"container"><li></li><li></li><li></li><li></li><li&…

java重载方法math_Java语言程序设计(十二)Math数学类,方法重载及变量作用域...

1.重载方法上一篇文章用到的max方法只能用于int型数据类型&#xff0c;但是如果需要决定两个浮点数中哪个较大&#xff0c;解决方法是创建另一个方法名相同但参数不同的方法&#xff0c;代码如下&#xff1a;public static double max(double num1, double num2){if(num1>nu…

编码(转)

https://www.zhihu.com/question/28164512 关于编码和乱码的问题&#xff0c;我简单讲一下。 通常问这类问题的人是混淆了若干个不同的概念&#xff0c;并且他们自己也没有意识到自己混淆了这些概念的。 终端显示字符的编码&#xff08;windows下终端是cmd&#xff0c;linux下是…

Spring MVC:测试简介

测试是软件开发中最重要的部分之一。 井井有条的测试有助于使应用程序代码保持良好状态&#xff0c;并且处于工作状态。 有很多不同类型的测试和方法。 在本文中&#xff0c;我想对基于Spring MVC的应用程序进行单元测试进行介绍。 不要希望在这里阅读有关Spring MVC测试的全部…

yaml,json,ini这三种格式用来做配置文件优缺点

适合人类编写&#xff1a;ini > toml > yaml > json > xml > plist可以存储的数据复杂度&#xff1a;xml > yaml > toml ~ json ~ plist > ini 作者&#xff1a;赵扶摇链接&#xff1a;https://www.zhihu.com/question/41253282/answer/119857880来源&…

试验ConcurrentHashmap

我正在研究我最近的一个项目中的内存问题&#xff0c;该项目将数据保留在内存中以进行快速访问&#xff0c;但是应用程序的内存占用量非常大。 该应用程序大量使用CHM&#xff08;即Concurrenthashmap&#xff09; &#xff0c;因此&#xff0c;无需再费脑筋地猜测CHM是问题所…

CSS的position属性:relative和absolute

relative&#xff1a;是相对于自己来定位的&#xff0c;例如&#xff1a;#demo{position:relative;top:-50px;},这时#demo会在相对于它原来的位置上移50px。如果它之前的元素也为relative并有偏移&#xff0c;则两个偏移不想加&#xff0c;relative只在它原本所在位置上进行偏移…

java线程池任务失败_ThreadPoolExecutor线程池任务执行失败的时候会怎样

1. 任务执行失败时的处理逻辑1.1. WorkerWorker相当于线程池中的线程可以看到&#xff0c;Worker有几个重要的属性&#xff1a;thread &#xff1a; 这是Worker运行的线程&#xff0c;可以理解为一个Worker就是一个线程firstTask &#xff1a; 初始任务&#xff0c;可能为为n…

转:HttpModule与HttpHandler详解

ASP.NET对请求处理的过程&#xff1a;当请求一个*.aspx文件的时候&#xff0c;这个请求会被inetinfo.exe进程截获&#xff0c;它判断文件的后缀&#xff08;aspx&#xff09;之后&#xff0c;将这个请求转交给 ASPNET_ISAPI.dll&#xff0c;ASPNET_ISAPI.dll会通过http管道&…

bzoj 5248: [2018多省省队联测]一双木棋

Description 菲菲和牛牛在一块n行m列的棋盘上下棋&#xff0c;菲菲执黑棋先手&#xff0c;牛牛执白棋后手。棋局开始时&#xff0c;棋盘上没有任何棋子&#xff0c; 两人轮流在格子上落子&#xff0c;直到填满棋盘时结束。落子的规则是&#xff1a;一个格子可以落子当且仅当这个…

java 数据返回类_java返回数据工具类

1 importcom.qbskj.project.util.SpringUtils;23 /**4 * 消息5 *6 */7 public classMessage {89 /**10 * 类型11 */12 public enumType {1314 /**成功*/15 success,1617 /**警告*/18 warn,1920 /**错误*/21 error22 }2324 /**类型*/25 privateType type;2627 /**内容*/28 priva…

MOXy的对象图和动态JAXB

JAXB&#xff08;JSR-222&#xff09;使您可以轻松地将域类的实例转换为XML。 EclipseLink MOXy实现提供了一个称为Dynamic JAXB的扩展&#xff0c;在其中&#xff0c;您没有像真实类那样的映射实例&#xff0c;例如名为DynamicEntity的类。 您可以使用采用属性名称的get和set方…

Processing-Shader-Examples

https://github.com/genekogan/Processing-Shader-Examples 转载于:https://www.cnblogs.com/guochen/p/7681278.html

随记

pip list 查看python所有的安装软件 pip uninstall 卸载 pip3 install 安装 pip install pip -V 查看pip版本 pip install --upgrade pip 对pip升级转载于:https://www.cnblogs.com/zqxqx/p/8906206.html

mysql时间函数总结_MySQL 日期时间函数常用总结

获得当前日期时间(date time)1.1 函数&#xff1a;now()相关函数&#xff1a;current_timestamp()&#xff0c;localtime()&#xff0c;localtimestamp()举例说明&#xff1a;2. 获得当前日期(date)函数&#xff1a;curdate()相关函数&#xff1a;current_date()&#xff0…

Apache CXF – JAX-WS –简单教程

许多Java开发人员认为Web Service实现的任务艰巨-没人能真正责怪他们&#xff0c;尤其是在企业应用程序开发的多年中&#xff0c;这给开发和设计带来了很多复杂性。 对于某些人来说&#xff0c;了解它是构建完整的企业应用程序的下一步-Web服务-是实现面向服务设计的关键方案之…

Linux学习(一)--基本概念

一、Linux概述 Linux是一款全球性的免费的开源的操作系统平台&#xff0c;其特点是实现了多任务多用户处理&#xff0c;主要是依赖内核kernel shell&#xff0c;且占用资源少 &#xff08;最小配置只要4Mb内存就能运行&#xff09;。百度百科概述 Linux是一套免费使用和自由传播…

Java StringBuilder神话被揭穿

神话 用加号运算符连接两个字符串是万恶之源 -匿名Java开发人员 注意 &#xff1a;此处讨论的测试的源代码可以在Github上找到 从大学时代起&#xff0c;我就学会了使用运算符将Java中的String连接视为致命的性能缺陷。 最近&#xff0c;在Backbase R&#xff06;D上进行了一…

UOJ #149. 【NOIP2015】子串

有两个仅包含小写英文字母的字符串 A 和 B。 现在要从字符串 A 中取出 k 个互不重叠的非空子串&#xff0c;然后把这 k 个子串按照其在字符串 A 中出现的顺序依次连接起来得到一个新的字符串。请问有多少种方案可以使得这个新串与字符串 B 相等&#xff1f; 注意&#xff1a;子…

一张正方形图片,伴随我一年半,敢问情绪的使用方法

【问题的由来】 图片适配正方形显示方法一 <style> .box{width:400px;height:400px;border:solid 5px red;margin:0 auto;background:#f4f4f4 url() no-repeat center;background-size:cover;} </style> <div class"box" style"background-imag…