Android studio build.gradle 基本设置配置

今天给大家示范一下基本设置和说明

ps:博主的这套配置让你的项目可以在任意电脑使用as打开无需额外文件、无需额外配置哦,当然as的版本是不能差距太大

复制项目减少体积见:android 快速方便的将项目复制到其他电脑上


首先根目录project的build.gradle

// 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"
}

app里的build.gradle配置

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 基本设置配置_王能的博客-优快云博客

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值