赞
踩
今天给大家示范一下基本设置和说明
ps:博主的这套配置让你的项目可以在任意电脑使用as打开无需额外文件、无需额外配置哦,当然as的版本是不能差距太大
复制项目减少体积见:android 快速方便的将项目复制到其他电脑上
- // Top-level build file where you can add configuration options common to all sub-projects/modules.
- buildscript {
- repositories {
- maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' }
- maven { url 'https://jitpack.io' }
- google()
- jcenter()
- }
- dependencies {
- classpath 'com.android.tools.build:gradle:3.1.3'//gradle版本,大版本一般和as版本号对应,尽量匹配
- //3.0废弃并且作者不再维护
- // classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
-
- // NOTE: Do not place your application dependencies here; they belong
- // in the individual module build.gradle files
- }
- }
- allprojects {
- repositories {
- maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' }
- maven { url 'https://jitpack.io' }
- google()
- jcenter()
- }
- }
- task clean(type: Delete) {
- delete rootProject.buildDir
- }
- ext {//为整个gradle添加,方便统一管理
- //用于编译的SDK版本
- COMPILE_SDK_VERSION = 27
-
- //最低支持Android版本
- MIN_SDK_VERSION = 16
-
- //目标版本
- TARGET_SDK_VERSION = 27
-
- //implementation "com.android.support:appcompat-v7:${APPCOMPAT_VERSION}"
- //或者implementation 'com.android.support:appcompat-v7:'+APPCOMPAT_VERSION
- //等等,反正就是字符串拼接
- APPCOMPAT_VERSION = "27.0.2"
- }
- apply plugin: 'com.android.application'
-
- android {
- buildToolsVersion '27.0.3'//建议下载最新的
- compileSdkVersion COMPILE_SDK_VERSION//建议和targetSdkVersion一样
- defaultConfig {
- applicationId "等于packageName必填目前是你的包路径"
- minSdkVersion MIN_SDK_VERSION//适配的最低版本,建议4.0以上
- targetSdkVersion TARGET_SDK_VERSION//目标版本(可以暂时理解为最高版本),建议最新(6.0和7.0的api改动较大,需要全面测试)
- versionCode 25152//版本int值,一般是日期或者和version对应
- versionName "2.5152"//版本号
- multiDexEnabled true//true表示分包,基本是必须的了,app很容易就会出现65536的问题,了解更多见分包的博客
- flavorDimensions "default"//多渠道的维度,不会就填default,了解更多见①
- //增加静态值BUILD_TIME,代码中Build.BUILD_TIME即可获取
- buildConfigField("long", "BUILD_TIME", System.currentTimeMillis() + "L")
- ndk {//支持架构,v8a运行会有问题,建议不写
- //abiFilters "armeabi", "armeabi-v7a", "arm64-v8a", "mips", "mips64", "x86", "x86_64"
- abiFilters "armeabi", "armeabi-v7a", "x86"
- }
-
- //在AndroidManifest.xml增加一些值(xml没有代码,但此处可以动态修改),了解更多见②
- manifestPlaceholders = [
- GAODE_KEY : "000000"//比如增加一个高德的key的string值
- ]
- }
- signingConfigs {//debug时签名位置,请保存好自己的签名,不然以后有的你麻烦
- release {
- keyAlias '123456'
- keyPassword '123456'
- storeFile file('../123456.jks')//签名位置,..表示上一级目录,这里写的是相对位置:项目跟目录的123456.jks签名文件(这样的话别人也可以直接使用)
- storePassword '123456'
- }
- }
- buildTypes {//Build apk(打包)或build variants(debug)时选择的apk类型
- release {//正式,静态常量BuildConfig(这个类太多,注意不要导错!不要导错!不要导错!).DEBUG=false,线上包用这个
- minifyEnabled false//是否开启混淆,不会的暂时不开启,了解更多见混淆相关的博客
- proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
- signingConfig signingConfigs.release//告诉编译器debug时用哪个签名,不然会出现debug包和线上包替换安装都必须先卸载的情况
- //AndroidManifest增加值,了解更多见②
- manifestPlaceholders = [
- JPUSH_APPKEY : "111111"
- ]
- }
- debug {//测试,静态常量BuildConfig.DEBUG=true,测试包
- minifyEnabled false
- proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
- //AndroidManifest增加值,了解更多见②
- manifestPlaceholders = [
- JPUSH_APPKEY : "123456"
- ]
- signingConfig signingConfigs.release
- }
- //不混淆,便于debug
- NoProguard {//此处表示可以自定义
- initWith debug//来源于debug的自定义
- minifyEnabled false
- }
- }
- dexOptions {//此处不需要改:项目大了有时java会内存溢出,这里表示扩大java运行内存
- javaMaxHeapSize "4g"
- }
- productFlavors {
- //一般多渠道用的,和上面的多渠道对应,了解更多见①
- yingyongbao {
- manifestPlaceholders = [UMENG_CHANNEL_VALUE: "yingyongbao"]
- flavorDimensions "default"
- }
- ali {
- manifestPlaceholders = [UMENG_CHANNEL_VALUE: "ali"]
- flavorDimensions "default"
- }
- }
- lintOptions {//抑制某些错误继续打包:此处不需要改,有问题解决问题,不要在这加
- //禁用掉丢失多国语言的错误提示
- disable 'MissingTranslation'
- //下面两个是忽略lint的报错信息继续打包,不建议使用.孩子哭就捂住嘴是解决不了问题的
- // checkReleaseBuilds false
- // abortOnError false
- }
-
- //这个方法是将打包生成的apk修改到项目根目录.apk目录下,生成的apk都需要在此目录中查找,不会用的可以删除这段
- applicationVariants.all { applicationVariantImpl ->
- //输出目录修改
- if (!applicationVariantImpl.getPackageApplication().outputDirectory.toString().contains("/build/")) {
- //不是build就输出到根目录下/.apk
- applicationVariantImpl.getPackageApplication().outputDirectory = new File(".apk", getRootDir())
- }
- applicationVariantImpl.outputs.all {apkVariantOutputImpl ->
- //获取app名称
- InputStreamReader xmlIsr = new InputStreamReader(new FileInputStream(getProjectDir().getAbsolutePath() + "/src/main/res/values/strings.xml"))
- String readSt, appName = ""
- while ((readSt = xmlIsr.readLine()) != null) {
- if (readSt.contains("app_name")) {
- appName = readSt.split(">")[1].split("<")[0]
- break
- }
- }
- xmlIsr.close()
-
- //修改apk的文件名
- if (applicationVariantImpl.buildType.debuggable) {
- apkVariantOutputImpl.apkData.outputFileName = appName + "测试V${defaultConfig.versionName}.apk"
- } else {
- apkVariantOutputImpl.apkData.outputFileName = appName + "V${defaultConfig.versionName}.apk"
- }
- }
- }
- }
-
- repositories {//此处不需要改
- flatDir {//aar的配置
- dirs 'libs'
- }
- }
-
- dependencies {
- //新版的导入为api,旧版的导入为compile
- api fileTree(include: ['*.jar'], dir: 'libs')//一次性导入所有libs目录下的jar
- //基础包
- api project(':mylibrary')
- api 'com.android.support:gridlayout-v7:' + APPCOMPAT_VERSION//support包需要统一,不然某些方法可能会崩溃
- }
①多渠道设置
举例(这只是个例子,实际运用请不要模仿,主意原因applicationId和包路径不一样会导致一些第三方识别错误的问题(貌似只有微信),比如wx的分享支付(直接调的intent跳转,两个不一样的话根本跳不回来)。谷歌设想是好的,但人(微)各(信)有(坑)志(爹)):
项目需求,要10个完全一样的app,第一时间大家都想到的是复制10个,然后改包名吧。但是当项目需求修改时每次都要复制n遍,这岂不是要上天...
这时applicationId应运而生,你只需要将applicationId改10次就会发现你安装了10个app,如下。但是作为程序猿,每次改applicationId、app名等也是也是一个体力活啊。
- 代码的包路径com.a.0,固定不改
- applicationId "com.a.0"//这是原来默认的进程名com.a.0,getPackageName为com.a.0
- //增加str资源
- resValue "string", "app_name", "app0“
- //修改applicationId
- applicationId "com.a.a"//进程名com.a.a,getPackageName为com.a.a(此时已经不是包路径了)
- //增加str资源
- resValue "string", "app_name", "appa“
-
- applicationId "com.a.b"//进程名com.a.b,同理
- //增加str资源
- resValue "string", "app_name", "appb“
于是多渠道应运而生,当你使用多渠道时,问题又来了,类似友盟这种多渠道配置早已占坑,根本没法动态修改applicationId(不然怎么叫多渠道呢...)
- //理想情况是这样的
- productFlavors {
- app0 {
- applicationId "com.a.0"
- //增加str资源
- resValue "string", "app_name", "app0“
- }
- appa {
- applicationId "com.a.a"
- //增加str资源
- resValue "string", "app_name", "appa“
- }
- ...
- }
- //但是类似友盟这种多渠道早已占坑
- yingyongbao {
- manifestPlaceholders = [UMENG_CHANNEL_VALUE: "yingyongbao"]
- }
- ali {
- manifestPlaceholders = [UMENG_CHANNEL_VALUE: "ali"]
- }
- //这两个完全冲突,想合并得需要渠道数*项目数的代码倍数,每增加一个项目都麻烦死
而此时二维的多渠道再次打破这一僵局,这就是flavorDimensions这个主角
- defaultConfig {
- // applicationId 不需要了,多渠道中配置
- flavorDimensions "chanel","appType"
- ...
- }
-
- productFlavors {
- Yyb_ {
- dimension "channel"
- manifestPlaceholders = [UMENG_CHANNEL_VALUE: "yingyongbao"]
- }
- Ali_ {
- dimension "channel"
- manifestPlaceholders = [UMENG_CHANNEL_VALUE: "ali"]
- }
- ...
- // 不同的APP
- app0_ {
- dimension "appType"
- //主意细节,初始化applicationId比较晚,gradle的其他地方可能引用不了
- applicationId "com.a.0"
- //增加str资源
- resValue "string", "app_name", "app0“
- }
- appa_ {
- dimension "appType"
- applicationId "com.a.a"
- //增加str资源
- resValue "string", "app_name", "appa“
- }
- //每增加一个项目只需要再加个就行了
- ...
- }
②AndroidManifest.xml动态修改,比如原配置里build.gradle极光的key正式和测试的区分,AndroidManifest直接使用即可。
不同级别的manifestPlaceholders最后会合并在一起,你不用担心GAODE_KEY和JPUSH_APPKEY会冲突
applicationId也可以使用(虽然会报错):${applicationId}
- <meta-data
- android:name="com.amap.api.v2.apikey"
- android:value="${GAODE_KEY}"/>
转载请注明出处:王能的博客Android studio build.gradle 基本设置配置_王能的博客-CSDN博客
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。