美文网首页Android开发经验谈Android技术知识Android开发
Android开发者必看:build.gradle 配置指南

Android开发者必看:build.gradle 配置指南

作者: Android架构师丨小熊 | 来源:发表于2019-10-07 20:47 被阅读0次

    前言

    作为Android开发,我们几乎每天都在和builg.gradle打交道,但是你真的知道build.gradle里的每一行代码有什么用吗?以及builg.gradle到底有哪些作用?本文旨在全面的向大家介绍builg.gradle的作用与使用方法。

    通用配置

    在我们新建项目时,Android Studio 会自动为我们生成两个build.gradle文件,一个位于根目录,一个位于app文件夹下,下面是gradle文件的构成图:

     MyApp
     ├── build.gradle
     └── app
           └── build.gradle
    

    根目录的build.gradle

    该gradle文件是定义在这个工程下的所有模块的公共属性,它默认包含两个个方法:

    buildscript {//这里是gradle脚本执行所需依赖,分别是对应的maven库和插件
    
        repositories {
            google()//可以引用google上的开源项目
            jcenter()//声明了jcenter()配置,可以引用 jcenter 上的开源项目
        }
        dependencies {
             //此处是 android 的插件 gradle 及其版本号
            classpath 'com.android.tools.build:gradle:3.5.0'
            
            // NOTE: Do not place your application dependencies here; they belong
            // in the individual module build.gradle files
        }
    }
    
    allprojects {
        //这里是项目本身需要的依赖,比如项目所需的 maven 库
        repositories {
            google()
            jcenter()
            
        }
    }
    
    // 这是一个 task 任务,执行 clean project 时执行此 task。可以理解为一个函数
    // 该任务继承自 Delete,删除根目录中的 build 目录。
    // 相当于执行 Delete.delete(rootProject.buildDir)。
    task clean(type: Delete) {
        delete rootProject.buildDir
    }
    

    buildscript 方法是定义了全局的相关属性,repositories 定义了 jcenter 作为仓库。一个仓库代表着你的依赖包的来源,例如 maven 仓库。dependencies 用来定义构建过程。实际开发时,缺少某些仓库来源是会出错的,我记得还有一次是google()、jcenter()两个顺序导致的问题,具体记不清了,以后再遇到再更新~
    allprojects 方法可以用来定义各个模块的默认属性,你可以不仅仅局限于默认的配置,未来你可以自己创造 tasks 在 allprojects 方法体内,这些 tasks 将会在所有模块中可见。

    app文件夹下的build.gradle文件

    // 声明是Android程序,
    //com.android.application 表示这是一个应用程序模块
    //com.android.library 标识这是一个库模块
    //而这区别:前者可以直接运行,后者只能被导入别的应用作为一个模块。
    apply plugin: 'com.android.application'
    
    android {//配置项目构建的各种属性
        compileSdkVersion 29 //编译时使用 Android版本
        buildToolsVersion "29.0.1" //编译时使用的构建工具的版本
        defaultConfig {
            applicationId "com.skyworth.myapplication" //项目包名
            minSdkVersion 23 //最低兼容Android版本
            targetSdkVersion 29 //目标版本
            versionCode 1 //版本号
            versionName "1.0" //版本名
            testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" //表明要使用AndroidJUnitRunner进行单元测试
        }
        buildTypes {// 自动化打包配置
            release {
                minifyEnabled false //是否混淆
                proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'  //混淆用的规则文件
            }
        }
    }
    
    dependencies {
        //各种依赖,包括本地的jar包
        implementation fileTree(dir: 'libs', include: ['*.jar'])
        implementation 'androidx.appcompat:appcompat:1.0.2'
        implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
        testImplementation 'junit:junit:4.12'
        androidTestImplementation 'androidx.test:runner:1.1.1'
        androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1'
    }
    

    以上就是我们最常见的常规配置,但是往往我们都有更复杂的需求,下面简单介绍几个常见的问题及其解决代码。

    如何修改编译生成的 apk 的名字?

    一般情况下,默认配置生成的 apk 文件名叫做app-debug.apk。但是我们在开发中为了方便最好是要对这些 apk 进行区分命名的,下面代码就是为我们生成 apk 进行了合理的命名。例如:HelloWorld_1.0_debug.apk,由 APP 名称 + 版本号 + 签名名称
    组成。

    // 设置apk的名称
    android.applicationVariants.all { variant ->
        variant.outputs.all { output ->
            outputFileName ="LocalMedia_${defaultConfig.versionName}_${variant.name}.apk"
        }
    }
    

    遇到依赖冲突怎么办?

    当项目中依赖的第三方库越来越多时,有可能会出现两个依赖库中存在同一个(名称)文件。如果这样,Gradle 在打包时就会提示错误(警告)。那么就可以根据提示,然后使用以下方法将重复的文件剔除,比较常用的是通过 exclude 去除重复的文件,例如:

    defaultConfig {
            //省略
            packagingOptions {
                exclude "lib/mips/libRSSupport.so"
                exclude 'lib/arm64-v8a/libRSSupport.so'
                exclude 'lib/armeabi-v7a/librsjni.so'
                exclude 'lib/x86/libRSSupport.so'
                exclude 'lib/x86_64/libRSSupport.so'
                exclude 'lib/armeabi-v7a/libRSSupport.so'
                exclude 'lib/arm64-v8a/librsjni.so'
                exclude 'lib/x86/librsjni.so'
                exclude 'lib/x86_64/librsjni.so'
            }
        }
    

    如何多渠道配置?

    这个配置是经常会使用到的,通常在适配多个渠道的时候,需要为特定的渠道做部分特殊的处理,比如设置不同的包名、应用名等。场景:当我们使用友盟统计时,通常需要设置一个渠道ID,那么我们就可以利用productFlavors来生成对应渠道信息的包,如:

    android { 
        productFlavors {
            xiaomi {
                manifestPlaceholders = [UMENG_CHANNEL_VALUE: "xiaomi"]
                applicationId "com.wiky.gradle.xiaomi" //配置包名
    
            }
            huawei {
                manifestPlaceholders =[UMENG_CHANNEL_VALUE:"huawei"]
            }
            //...
        } 
    }
    

    最后

    最后我准备了一些面试的知识汇总,数据结构,计算机网络等等都有。自己整理和分类的,还请尊重知识产出。

    分享给大家的资料包括高级架构技术进阶脑图Android开发面试专题资料,还有高级进阶架构资料包括但不限于【高级UI、性能优化、移动架构师、NDK、混合式开发(ReactNative+Weex)微信小程序、Flutter等全方面的Android进阶实践技术】希望能帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习,也是可以分享给身边好友一起学习的!资料免费领取方式:加群:797404811,我会把我收录整理的资料都送给大家,帮助大家更快的进阶。

    相关文章

      网友评论

        本文标题:Android开发者必看:build.gradle 配置指南

        本文链接:https://www.haomeiwen.com/subject/xjzmpctx.html