gradle的学习与实践记录(一)
来源:互联网 发布:ubuntu mate 树莓派 编辑:程序博客网 时间:2024/06/05 05:39
已经很久都没有来写笔记了,最近看见6月25日的直播大会,同时看见以前写的笔记,还有人评论,也就动笔来写一写,其实将近半年了,这半年来,也有很多的东西需要记录,因为时间过了,一切也就很快忘记了。
这篇笔记,是我整理当中的其中一篇,也希望最近利用周末,好好做做梳理。
一、gradle的编译目录,与项目目录结构的更改。
gradle的资源路径默认一般都是固定的
/src/main/java/*
/src/test/java/*
上面的两个地址,就是gradle编译的默认路径,也就是说我们再不编辑sourceSets的情况下,只有这里面的代码才会被编辑, test中的是测试代码。
sourceSets{} 是gradle中的dsl区域语言,形同这样的dsl区域语言还有很多,如下图:
我们可以通过这个地址:android-gradle-dsl来进行学习
sourceSets{}是专用来修改gradle的默认编译目录的。
sourceSets { main { res.srcDirs = ['src/main/res', 'src/main/res/layout/activity/', 'src/main/res/layout/fragment/', 'src/main/res/layout/rvitem/', 'src/main/res/layout/lvitem/'] assets.srcDirs = ['src/main/assets'] java.srcDirs = ['/src/main/java'] resources.srcDirs = ['src/main/resources'] } }
main当中,res.srcDirs是用来指定要编译项目的资源文件,assets.srcDirs是用来指定要放的第三方库文件,java.srcDirs当然是我们写的代码,resources.srcDirs好像也是指定资源的,要和res.srcDirs配合。
其中我定义了四个扩展的专用放布局的文件夹,一看也就不用我说他们的用途了。
比较详细的文章:大头鬼Bruce的深入浅出Android Gradle构建系统(二:项目结构)
二.Gradle的全局配置(依赖统一管理)
在项目根目录,新建config.gradle文件,用它来进行全局配置。
也就是,我们可以把版本配置和,依赖,与key值,用到这里面进行配置。
使用时,导入,进行使用就行了
下面的使用方法,对Module也是一样的
比较详细的文章:QDJdeveloper写的 Android 使用 Gradle 统一配置依赖管理
三、签名配置
签名配置,就是对apk进行签名吗,就像我们打包,要输入的密码一样,只是我们配置在gradle的命令中,写死了签名,一般 在android 中写,他是我们用命令打包和多渠道打包,必须配置的。
使用signingConfigs {}dsl区域语言。
signingConfigs { release { // ../表示根目录 storeFile file("../gradleadb.jks")指定目录也可是('H:\\*\\*.keystore') storePassword "android" keyAlias "张荣" keyPassword "android" } } 在buildTypes中release内加入 signingConfig signingConfigs.release //使用签名 buildTypes { release { signingConfig signingConfigs.release //使用签名 } }
完整的:
android{***** signingConfigs { release { // ../表示根目录 storeFile file("../gradleadb.jks")指定目录也可是('H:\\*\\*.keystore') storePassword "android" keyAlias "张荣" keyPassword "android" } xiaozhang { //gradle.properties 动态设置签名参数 storeFile file(System.properties['keyStore']) storePassword System.properties['storePassword'] //取storePassword值 keyAlias System.properties['keyAlias'] keyPassword System.properties['keyPassword'] } } buildTypes { release { minifyEnabled true //开启混淆 proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' shrinkResources true//踢掉无用资源 zipAlignEnabled true //是否zip优化 manifestPlaceholders = [AMAP_KEY: parent.ext.key.AMAP_RELEASE_KEY] //Gradle key配置 signingConfig signingConfigs.release //使用签名 } debug { debuggable true // 是否保留调试信息 minifyEnabled false applicationIdSuffix '.debug'//包名加后缀 manifestPlaceholders = [AMAP_KEY: parent.ext.key.AMAP_DEBUG_KEY]//Gradle key配置 signingConfig signingConfigs.release //使用签名 } //自定义构造 app打包方式 会在 app\build\outputs\apk 下面生成app-xiaozhang-unsigned.apk// xiaozhang.initWith(buildTypes.debug) xiaozhang { manifestPlaceholders = [AMAP_KEY: parent.ext.key.AMAP_RELEASE_KEY] //Gradle key配置 applicationIdSuffix '.xiaozhang'// signingConfig signingConfigs.xiaozhang //使用签名 } }****}
四、多渠道打包配置
使用productFlavors{}dsl区域语言,进行渠道配置,然后用applicationVariants.all{}进行打包修改名字。名字一定不能重复,不然打包时就覆盖了
1.不要渠道号,直接配置的
productFlavors { productBaidu product360 productHuaWei productMeiZu } //渠道打包命名 applicationVariants.all { variant -> variant.outputs.each { output -> if (output.outputFile != null && output.outputFile.name.endsWith('.apk') && 'release'.equals(variant.buildType.name)) { def apkFile = new File(output.outputFile.getParent(), "cxb_${variant.flavorName}_ver${variant.versionName}.apk") output.outputFile = apkFile } } } 也可以这样: android.applicationVariants.all { variant -> variant.outputs.each { output -> def outputFile = output.outputFile if (outputFile != null && outputFile.name.endsWith('.apk')) { //这里修改apk文件名 def fileName = "网约车司机端" + "_" + variant.productFlavors[0].name + defaultConfig.versionName + "_" + variant.buildType.name + ".apk" output.outputFile = new File(outputFile.parent, fileName) } } } 反正这里,自行配置。
2.带渠道号的,有两种处理办法。一是用buildConfig变量来,一是用manifestPlaceholders属性来。
用buildConfig变量:
productFlavors { defult { buildConfigField "int", "APP_CHANNEL", "11" //配置一个APP_CHANNEL int变量 } qh360 { buildConfigField "int", "APP_CHANNEL", "12" } baidu { buildConfigField "int", "APP_CHANNEL", "13" } yingyongbao { buildConfigField "int", "APP_CHANNEL", "14" } } //打包命令是一样的 android.applicationVariants.all { variant -> variant.outputs.each { output -> def outputFile = output.outputFile if (outputFile != null && outputFile.name.endsWith('.apk')) { //这里修改apk文件名 def fileName = "网约车司机端" + "_" + variant.productFlavors[0].name + defaultConfig.versionName + "_" + variant.buildType.name + ".apk" output.outputFile = new File(outputFile.parent, fileName) } } }
在代码中,给接口传渠道号的话,就用这个方式获取。
用manifestPlaceholders属性来:
有些第三方要求必须处理渠道号,比如极光,友盟,需要统计。
1.配置Manifest 中meta-data属性
友盟的统计: <meta-data android:name="UMENG_CHANNEL" android:value="Channel_ID" /> 修改为: <meta-data android:name="UMENG_CHANNEL" android:value="${CHANNEL_VALUE}" />
2.app build.gradle中进行配置
##defaultConfig{}里加上CHANNEL_VALUE的默认值:defaultConfig { ... manifestPlaceholders = [ CHANNEL_VALUE:"default_channel" ] }##productFlavors{}里这样配置:productFlavors { defult{} baidu_dsp{} baidu{} Tencent{} _360{} anzhi{} taoyingyong{} kuchuan{} ***** } ##productFlavors.all 是一个遍历,每一个 productFlavors 中的值,其中productFlavors 的每一个值都有一个 name ,就是类似 baidu 这样的字符,每次循环的时候会替换掉 AndroidManifext.xml 中的${CHANNEL_VALUE} productFlavors.all { flavor -> flavor.manifestPlaceholders = [CHANNEL_VALUE: name] } //渠道打包命名 applicationVariants.all { variant -> variant.outputs.each { output -> if (output.outputFile != null && output.outputFile.name.endsWith('.apk') && 'release'.equals(variant.buildType.name)) { def apkFile = new File(output.outputFile.getParent(), "chexinbang_${variant.flavorName}_ver${variant.versionName}.apk") output.outputFile = apkFile } } }
在代码中,传给接口,用这样的方法去获取:
##定一个工具类,写一个方法。/** 获取渠道id */ public static String getDownSoure() { ApplicationInfo appInfo; String channelId = "30201"; String channel = "guanwang";// = mapplication.getResources().getString(R.string.channel); try { appInfo =mapplication.getPackageManager().getApplicationInfo(mapplication.getApplicationContext().getPackageName(), PackageManager.GET_META_DATA); channel = "" + appInfo.metaData.get("UMENG_CHANNEL"); } catch (PackageManager.NameNotFoundException e) { e.printStackTrace(); channelId="30201"; } switch (channel) { case "baidu_dsp" : channelId = "10102"; break; case "baidu" : channelId = "10101"; break; case "Tencent" : channelId = "10201"; break; case "_360" : channelId = "10301"; break; case "anzhi" : channelId = "10401"; break; case "taoyingyong" : channelId = "10501"; break; case "kuchuan" : channelId = "10601"; break; case "jifeng" : channelId = "10701"; break; case "wandoujia" : channelId = "10801"; break; case "momo" : channelId = "10901"; break; case "xiaomi" : channelId = "20101"; break; case "huawei" : channelId = "20201"; break; case "meizu" : channelId = "20301"; break; case "oppo" : channelId = "20401"; break; case "guanwang" : channelId = "30201"; break; } return channelId; }
关于构建,比较详细的文章:使用Gradle构建Android应用的渠道包
后面还有一些精华的笔记,用第二篇来记载,太长了。
gradle的学习与实践记录(一) 整理记录完毕。
阅读全文
0 0
- gradle的学习与实践记录(一)
- gradle的学习与实践记录(二)
- 关于gradle的学习记录
- gradle学习(一)
- gradle学习(一)
- .gradle的学习总结(一)
- Velocity学习与实践(一)
- appcan学习与开发实践(一)
- Redis学习与实践日记(一)
- BootStrap学习与实践(一)
- 【记录】leetcode实践(一)
- Gradle学习笔记(一)
- Gradle学习笔记(一)
- Gradle学习历程(一)
- hadoop与spark学习记录(一)
- qtp学习与实践一
- JavaScript学习与实践一
- Zookeeper学习与实践(一)
- iOS11开发新增功能大全
- 迭代器模式--更高、更快、更强(行为模式09)
- SLF4J简介与使用(整合log4j)
- 免费申请SSL证书及搭建HTTPS网站
- 自动部署Ambari到集群的自动化脚本
- gradle的学习与实践记录(一)
- ARKit从入门到精通(1)-ARKit初体验
- Android ConstraintLayout总结
- Jquery 对json的增删改: 查询(遍历)
- AngularJS进阶(五)Angular实现下拉菜单多选
- ARKit从入门到精通(2)-ARKit工作原理及流程介绍
- cnn文本分类 --deeplearning4j为例子
- ARKit从入门到精通(3)-ARKit自定义实现
- ARKit从入门到精通(4)-ARKit全框架API大全