Android Gradle

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的限制
        multiDexEnabled true//下面有介绍
    }
    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 {
            //是否进行混淆(设置是否使用优化打包)
             minifyEnabled </strong> false
            //设置为true后,生成的APK会去掉未使用的资源,减少APK的体积
             shrinkResources true
             //是否启动zipAlign优化
             zipAlignEnabled false
            // 混淆文件的位置(设置proguard文件(用于混淆代码))
            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即可。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,271评论 5 466
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,725评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,252评论 0 328
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,634评论 1 270
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,549评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,985评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,471评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,128评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,257评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,233评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,235评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,940评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,528评论 3 302
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,623评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,858评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,245评论 2 344
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,790评论 2 339

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,246评论 25 707
  • 1.介绍 如果你正在查阅build.gradle文件的所有可选项,请点击这里进行查阅:DSL参考 1.1新构建系统...
    Chuckiefan阅读 12,107评论 8 72
  • 这一章主要针对项目中可以用到的一些实用功能来介绍Android Gradle,比如如何隐藏我们的证书文件,降低风险...
    acc8226阅读 7,544评论 3 25
  • 今天上中班,来到公司被质检室的同事过去了,说是干的活出了质检问题,我接班的同事说,干吧没事,出了事有我和组长呢!车...
    沉默雨佳阅读 164评论 0 0
  • 假期里总少不了婆家各三姑六婆大集合吃一顿饭,讲真,每次吃饭我都觉得食不知味度秒如年,几乎每家都有娃,二胎放开...
    桔若阅读 176评论 0 0