美文网首页
Gradle构建前瞻

Gradle构建前瞻

作者: 程序设计法师 | 来源:发表于2020-06-09 09:22 被阅读0次

    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中匹配的 <compatible-screens> <screen> 节点。这个设置是可选的
            }
            //按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构建前瞻

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