Gradle构建前瞻

Android项目构建架构图

image.png
  • 顶层build.gradle文件位于项目根目录下,用于定义适用于项目中所有模块的构建配置,buildscript代码块用来定义项目中所有模块共用的gradle代码库和依赖项
buildscript {
    repositories {
        google()
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.6.0'
    }
}
allprojects {
    repositories {
        google()
        center()
    }
}
// 定义所有模块之间的共享属性.
ext {
    compileSdkVersion = 28
    supportLibVersion = "28.0.0"
    ...
}
  • 可以在同一个项目中的某个模块的build.gradle文件中访问共享属性
  android {
      // Use the following syntax to access properties you defined at the project level:
      // rootProject.ext.property_name
      compileSdkVersion rootProject.ext.compileSdkVersion
      ...
    }
    ...
    dependencies {
        implementation "com.android.support:appcompat-v7:${rootProject.ext.supportLibVersion}"
        ...
    }
  • compileSdkVersion

这个主要是编译app的时候使用的sdk版本,就我们在AndroidStudio上面点击运行时候的编译时候的环境。记住这个只是在编译时候选择的版本,不涉及到运行时候的行为。由于androidStudio有预编译的功能所以会提示一些警告,提前了解新的sdk api。修改compileSdkVersion并不会影响我们的我们生成的app在手机上运行的行为。

  • minSdkVersion

这个就是程序运行的最低的要求的Sdk,就是给说如果我设置的minSdkVersion是15的话那么如果你系统低于这个SdkVersion是安装不上的。还有一个好处就是

  • targetSdkVersion

targetSdkVersion是android向前兼容的主要方式,加入你的targetSdkVersion设置为16,在Android4.4之后的设备上,系统会判断你的targetSdkVersion是否小于19,如果小于的话,那就按照19之前的api方法,如果大于等于19,那么就按照之后的api方法来走,保证了程序运行的一致性。也就是向前兼容性

minSdkVersion<=targetSdkVersion<=compileSdkVersion
minSDKVersion查看创建项目的时候的版本分部图表确定,然后targetSdkVersion最好和compileSdkVersion一样。CompileSdk选最新的,因为你更新了 compileSdkVersion 打出来的包就是在compileSdkVersion上打出来的。可以使用最新的api

  • buildToolsVersion

构建工作的版本

  • minifyEnable

是否对项目的代码进行混淆

proguardFiles getDefaultProguardFile('proguard-android.txt'),'proguard-rules.pro'

proguard-android.txt是在AndroidSdk目录下,里面是所有项目通用的混淆规则
proguard-rules.pro是在当前项目的根目录下,里面可以编写当前项目特有的混淆规则

  • shrinkResources

是否要开启资源压缩

  • flavorDimensions
android {
    compileSdkVersion 27
    defaultConfig {
        applicationId "com.voctex.flavorsapp"
        minSdkVersion 18
        targetSdkVersion 27
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        //定义不同的维度
        flavorDimensions "company","channel"
    }

    productFlavors{
        companyA{
            dimension "company"
            applicationId 'com.example.myapp.paid'
            buildConfigField "String","FLAVOR_NAME","\"companyA\""
        }
        companyB{
            dimension "company"
            applicationId 'com.example.myapp.free'
            buildConfigField "String","FLAVOR_NAME","\"companyB\""
        }
        channelA{
            dimension "channel"
            buildConfigField "String","FLAVOR_NAME","\"channelA\""
        }
        channelB{
            dimension "channel"
            buildConfigField "String","FLAVOR_NAME","\"channelB\""
        }
    }
}

如上如果我们使用gradle assembleRelease打包的话就会打出不同渠道的不同维度的包


image.png
  • splits
    splits {
        //按屏幕密度打包
        density {
            enable true //enable: 启用屏幕密度拆分机制
            exclude "ldpi", "tvdpi", "xxxhdpi" //exclude: 默认情况下所有屏幕密度都包括在内,你可以移除一些密度
            include "hdpi", "xhdpi", "mdpi"//表示要包括哪些屏幕密度
            //reset() // 重置屏幕密度列表为只包含一个空字符串 (这能够实现,在与include一起使用时可以表示使用哪一个屏幕密度,而不是要忽略哪一些屏幕密度)
            compatibleScreens 'small', 'normal', 'large', 'xlarge'
            //表示兼容屏幕的列表。这将会注入到manifest中匹配的   节点。这个设置是可选的
        }
        //按abi打包
        abi {
            enable true //启用ABI拆分机制
            exclude 'x86' //默认情况下所有ABI都包括在内,你可以移除一些ABI
            reset() //重置ABI列表为只包含一个空字符串(这可以实现,在与include一起使用来可以表示要使用哪一个ABI,而不是要忽略哪一些ABI)
            include 'armeabi-v7a', 'mips' //指明要包含哪些ABI
            universalApk true //指示是否打包一个通用版本(包含所有的ABI)。默认值为 false
        }
    }
  • gradle.properties

可以配置项目全局Gradle设置,如守护进程的最大堆大小

  • local.properties

为构建系统配置本地环境属性,包括
1.ndk.dir NDK的路径
2.sdk.dir SDK的路径
3.cmake.dir CMake的路径
4.ndk.symlinkdir 在AndroidStudio3.5以及更高版本中,创建指向NDK的符号链接,该链接可比NDK安装路径短

你可能感兴趣的:(Gradle构建前瞻)