Android Gradle

作者: 一s独秀 | 来源:发表于2017-12-26 18:09 被阅读0次

    Android 中build.gradle文件是两个

    • app/build.gradle
    • project/build.gradle

    app/build.gradle

    app/build.gradle
    * 上图① ② ③ ④ ⑤分别为:项目类型(应用或者是一个libary)、Android编译版本、manifest上的基本配置、创建类型、外部依赖
    详细介绍:
    apply plugin: 'com.android.application'// 声明是Android程序
    
    android {
        //版本配置
        compileSdkVersion 26//是你SDK的版本号。
        buildToolsVersion "26.0.2"//是你构建工具的版本,其中包括了打包工具aapt、dx等等
        defaultConfig {
            //应用的包名在安卓设备和商店中是作为应用的唯一标识,所以,一旦发布了应用程序,就不应该再修改,否则将被视为完全不同的应用
            applicationId "com.suchengkeji.andeoid.gradlerdemo"
            //SDK配置
            minSdkVersion 21//app运行所需的最低sdk版本.低于minSdkVersion的手机将无法安装
            targetSdkVersion 26 //应用的兼容模式
            versionCode 1//整数值,代表应用程序代码的相对版本,也就是版本更新过多少次。
            versionName "1.0"//字符串值,代表应用程序的版本信息,需要显示给用户。
            // dex突破65535的限制
            <strong><font color=#0099ff>multiDexEnabled true</font></strong>//下面有介绍
        }
        buildTypes {
            release {
                // 是否进行混淆(设置是否使用优化打包)
                minifyEnabled false
                //设置为true后,生成的APK会去掉未使用的资源,减少APK的体积
                 shrinkResources true
                 //是否启动zipAlign优化
                 zipAlignEnabled false
                // 混淆文件的位置(设置proguard文件(用于混淆代码))
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            }
        }
    }
    dependencies {
        // 编译libs目录下的所有jar包
        compile fileTree(dir: 'libs', include: ['*.jar'])
        //编译所添加的外部依赖库
        compile 'com.android.support:appcompat-v7:26.0.0-alpha1'
        compile 'com.android.support.constraint:constraint-layout:1.0.2'
        // 编译libray模块
        compile project(':libray')
        // 编译extras目录下的librayTwo模块(如果模块在某(extras)目录下)
        compile project(':extras:librayTwo')
    }
    

    要点:

    • Android程序声明处:apply plugin: 'com.android.application'是最新的写法,以前的写法是apply plugin: 'android'
    • compileSdkVersion:是你SDK的版本号。告诉Gradle用哪个AndroidSDK版本编译你的应用。使用任何新添加的 API 就需要使用对应版本的 Android SDK。
      • 修改 compileSdkVersio不会改变运行时的行为。当你修改了compileSdkVersion的时候,可能会出现新的编译警告、编译错误,但新的compileSdkVersion不会被包含到APK 中:它纯粹只是在编译的时候使用。
    • buildToolsVersion:是你构建工具的版本,其中包括了打包工具aapt、dx等等。这个需要你本地安装该版本才行,很多人导入新的第三方库,失败的原因之一是buildversion的版本不对,这个可以手动更改成你本地已有的版本或者打开SDKManager去下载对应版本
    • minSdkVersion:应用可以运行的最低要求,低于minSdkVersion的手机将无法安装。在开发时minSdkVersion也起到一个重要角色:lint 默认会在项目中运行,它在你使用了高于 minSdkVersion的API 时会警告你,帮你避免调用不存在的 API 的运行时问题(比如 minSdkVersion9但你使用了 sdkVersion 10 才有的API就会警告 )。
      • 如果只在较高版本的系统上才使用某些API,通常使用运行时检查系统版本的方式解决。 比如这样
      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
          //......
      }
      if (Build.VERSION.SDK_INT>=Build.VERSION_CODES.KITKAT&&Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
          //.......
      }
      
    • applicationId:应用的包名在安卓设备和商店中是作为应用的唯一标识,所以,一旦发布了应用程序,就不应该再修改applicationId,否则将被视为完全不同的应用
      • application ID以前直接绑定到包名称; 因此一些Android API在其方法名称和参数名称中使用术语“包名称”,但这实际上是application ID。 例如,Context.getPackageName()方法返回application ID。 没有必要在app代码之外分享代码的真实包名。
      • 如果您正在使用WebView,请考虑在application ID中使用您的程序包名称作为前缀; 否则您可能会遇到问题applicationIdSuffix breaks some WebView use cases in apps的问题。
        *targetSdkVersion:是Android提供向前兼容的主要依据,在应用的targetSdkVersion没有更新之前系统不会应用最新的行为变化。
      • 随着 Android 系统的升级,某个系统的API或者模块的行为可能会发生改变,但是为了保证老 APK 的行为还是和以前兼容。只要APK的targetSdkVersion不变,即使这个APK安装在新Android系统上,其行为还是保持老的系统上的行为,这样就保证了系统对老应用的前向兼容性。
        *versionCode:整数值,代表应用程序代码的相对版本,也就是版本更新过多少次
      • 整数值有利于其它程序比较,检查是升级还是降级。你可以把这个值设定为任何想设的值,但是,你必须保证后续更新版的值要比这个大。系统不会强制要求这一行为,但是随着版本更新值也增加是正常的行为。
      • 一般来说,你发布的第一版程序的versionCode设定为1,然后每次发布都会相应增加,不管发布的内容是较大还是较小的。这意味着android:versionCode不像应用程序的发布版本(android:versionName)那样显示给用户。应用程序和发布的服务不应该显示这个版本值给用户。
    • versionName:字符串值,代表应用程序的版本信息,需要显示给用户。
      • 与android:versionCode一样,系统不会为了任何内部的目的使用这个值,除了显示给用户外。发布的服务也需要提取这个值来显示给用户。

    buildTypes:构建类型,一般可以分为debug(主要用于开发阶段)和release(生产发布阶段)

            buildTypes {
            release {
                //是否进行混淆(设置是否使用优化打包)
                 <strong>minifyEnabled </strong> false
                //设置为true后,生成的APK会去掉未使用的资源,减少APK的体积
                 <strong>shrinkResources</strong> true
                 //是否启动zipAlign优化
                 <strong>zipAlignEnabled </strong> false
                // 混淆文件的位置(设置proguard文件(用于混淆代码))
                <strong>proguardFilesgetDefaultProguardFile('proguard-android.txt'),'proguard-rules.pro'</strong>
            }
            debug {
                minifyEnabled false
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            }
        }
    
    • zipAlignEnabled:AndroidSDK中包含一个“zipalign”的工具,它能够对打包的应用程序进行优化。在你的应用程序上运行zipalign,使得在运行时Android与应用程序间的交互更加有效率。因此,这种方式能够让应用程序和整个系统运行得更快。

    配置多渠道打包(风格定制 )

    android{
        //配置多渠道打包(项目风格)
        productFlavors {
            huawei {
                applicationId "com.suchengkeji.andeoid.gradlerdemo.huawei"
            }
            wandoujia {
                applicationId "com.suchengkeji.andeoid.gradlerdemo.wandoujia"
            }
        }
    }
    

    配置打包签名设置

     android{
        signingConfigs {//签名的配置
            debug {
                storeFile file('H:\\configTest.jks')//签名文件路径
                storePassword "123456"//签名密钥密码
                keyAlias "configTest"//.jks文件别名
                keyPassword "123456"  //签名公钥密码
            }
            release {
                storeFile file('H:\\configTest.jks')//签名文件路径
                storePassword "123456"
                keyAlias "configTest"
                keyPassword "123456"  //签名密码
            }
        }
    }
    
    • 配置完成打包签名设置后再buildTypes{}中的release{}中天机打包命令行(可选设置)设置后可以通过命令打包
      • gradlew assembleRelease:这个是打包所有渠道(风格)release版本
      • gradlew assembleBaiduRelease:只要打某个渠道的

      打包后的apk文件在app–>build–>outputs—>apk中

      使用gradlew时可能出现没有找到该命令,需要chmod 755 gradlew

    打包命令行

    project/build.gradle(根目录下的build.gradle)

    • 用于添加子工程或模块共用的配置项。
    • buildscript:配置此项目的构建脚本类路径。
    • repositories:配置该项目的存储库。
      • 支持java 依赖库管理(maven/ivy),用于项目的依赖。
      • 如果需要的话,从https://jcenter.bintray.com/下载code reposities。
    • dependencies:配置此项目的依赖关系。
      • 依赖包的定义。支持maven/ivy,远程,本地库,也支持单文件
      • 定义classpath,gradle会从“repositories”中下载对应版本的Gradle。如果使用gradle wrapper的话,感觉这个配置会被忽略。Wrapper会自己去下载所使用的gradle版本。
      • **不要把你的应用程序依赖这里;他们属于个别模块build.gradle文件
    • allprojects:该配置会被应用到所有的子工程。
    // 运行gradle clean时,执行此处定义的task。
    // 该任务继承自Delete,删除根目录中的build目录。
    // 相当于执行Delete.delete(rootProject.buildDir)。
    // gradle使用groovy语言,调用method时可以不用加()。
    task clean(type: Delete) {
        delete rootProject.buildDir
    }
    

    提下根目录下还有一个setting.gradle:

    • 作用就是导入子工程。它支持导入多个子工程,使整个工程支持multi-project的编译。
    • 调用include函数,将子工程app(目录名为app)导入进来。
      include ':app'(有多个时用逗号分开)

    dex突破65535的限制

    • 首先是在defaultConfig节点使能多DEX功能


      dex.png
    • 然后就是在dependencies{}中引入multidex库文件
    dependencies {
        compile 'com.android.support:multidex:1.0.0'
    }
    
    • 最后就是你的AppApplication继承一下MultiDexApplication即可。

    相关文章

      网友评论

        本文标题:Android Gradle

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