zoukankan      html  css  js  c++  java
  • Gradle在Android中的基本使用

    1.基本概念

    程序开发作为一种工程作业,不光是编写代码,还涉及到工程的各种管理(依赖,打包,部署,发布,各种渠道的差异管理.....).很多时候,我们反复的build,clean,签名,打包,发布,那么该过程能否像代码那样被描述出来,且能复用.例如,Android开发后期发布上线版本时,往往需要用到多渠道打包,另外可能需要针对不同(手机品牌,尺寸等各种硬件信息)的手机做一些特殊处理,此时Gradle可以用来针对不同情况单独建工程,还能通过一些变量来控制,像这样:if(isSamsung){do something} else if(isHuawei){do something}

    由此,我们引入Google的官方打包工具Gradle,暂且把它看做是一个编程框架工具吧.

    2.Gradle在AS中的使用

    gradle通过解析build.gradle这个文件来运行

    build.gradle 主要由task和一些配置组成,task之间有相互依赖关系 通过这些依赖关系和配置就能编译项目

    可以通过 apply plugin 来加入一些默认的task 例如

    apply plugin: 'java'
    

    这是java的插件 他加入了许多编译java的task 如果你的目录结构正确 那么通过gradle 运行 task 就能编译java项目


    编译过程

    这是一个最简单的显示 hellowrold的 apk的文件结构


    一个android项目实际上在gradle 的编译体系中属于 multi project build 每个使用gradle编译的android项目都有一个app文件夹 android项目源码就在这个文件夹下

    gradle文件中放的是


    一个jar包 当你的电脑中没有安装gradle 就会通过他来下载gradle 从而继续编译

    build.gradle中的是

    buildscript {
        repositories {
            jcenter()
        }
        dependencies {
            classpath 'com.android.tools.build:gradle:2.1.3'
        }
    }
    
    allprojects {
        repositories {
            jcenter()
        }
    }
    
    task clean(type: Delete) {
        delete rootProject.buildDir
    }
    

    他只是通过

    dependencies {
            classpath 'com.android.tools.build:gradle:2.1.3'
        }
    

    来描述插件的位置

    gradle.properties 中是配置信息 在这里设置jvm的heapsize 什么的

    settings.gradle 之前说了每个用gradle 的android 项目是一个multi project build 那么就需要指明有哪些project 这里我们就只有默认的app

    local.properties中配置的是sdk的位置


    gradlew.bat 和gradlew 分别是在windows 和linux下的执行gradle 命令的程序 例如在windows下要编译apk 就 .gradlew assemble

    进入到app文件夹



    libs文件夹下放项目要用的jar包

    src下就是正常的android 项目的源码了

    build.gradle中是

    // 声明是Android程序
    apply plugin: 'com.android.application'
    
    android {
        // 编译SDK的版本
        compileSdkVersion 21
        // build tools的版本
        buildToolsVersion "21.1.1"
    
        defaultConfig {
        	// 应用的包名
            applicationId "me.storm.ninegag"
            minSdkVersion 14
            targetSdkVersion 21
            versionCode 1
            versionName "1.0.0"
        }
    
        // java版本
        compileOptions {
            sourceCompatibility JavaVersion.VERSION_1_7
            targetCompatibility JavaVersion.VERSION_1_7
        }
        
        buildTypes {
            debug {
                // debug模式
            }
            
            release {
                // 是否进行混淆
                minifyEnabled false
                // 混淆文件的位置
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
            }
        }
        
        // 移除lint检查的error
        lintOptions {
          abortOnError false
        }
    }
    
    dependencies {
        // 编译libs目录下的所有jarcompile fileTree(dir: 'libs', include: ['*.jar'])
        compile 'com.android.support:support-v4:21.0.2'
        compile 'com.etsy.android.grid:library:1.0.5'
        compile 'com.alexvasilkov:foldable-layout:1.0.1'
        // 编译extras目录下的ShimmerAndroid模块
        compile project(':extras:ShimmerAndroid')
    }

    这里需要说明几点:

    • buildToolsVersion这个需要本地安装该版本才行,很多人导入新的第三方库,失败的原因之一是build version的版本不对,这个可以手动更改成你本地已有的版本或者打开 SDK Manager 去下载对应版本。

    • applicationId代表应用的包名。

    • android 5.0开始默认安装jdk1.7才能编译.

    • proguardFiles,前一部分表示系统默认的android程序的混淆文件,该文件已经包含了基本的混淆声明,目录在 **<sdk目录>/tools/proguard/proguard-android.txt** , 后一部分是自定义的混淆文件,目录就在 **app/proguard-rules.txt** ,具体混淆的语法暂且不去管它。最终混淆的结果是这两部分文件共同作用的。

    • compile project(‘:extras:ShimmerAndroid’)这一行是因为项目中存在其他Module, 可以理解成Android Library,由于Gradle的普及以及远程仓库的完善,这种依赖渐渐的会变得非常不常见,但是你需要知道有这种依赖的。

    • 以上文件里的内容只是基本配置,其实还有很多自定义部分,如自动打包debug,release,beta等环境,签名,多渠道打包等,后续有时间的话会进一步深入。

    3.小结一下

    多个工程在一起的话,要注意分清哪些是应用工程,哪些是依赖工程,各个工程的build.gradle里要统一gradle以及插件版本,像这样def gradleVersion = System.env.ANDROID_TOOL_BUILD_GRADLE != null ? System.env.ANDROID_TOOL_BUILD_GRADLE : '1+';以前,一个项目被创建以后,基本不会再去动这build.gradle了,一方面不太理解里面具体的含义懂了怕出错,另一方面没有这方面的需求就不会主动去了解这个东西.以上只是Gradle作为工具的基本用途,然而它的作用域远不止于此,后续会继续深入的了解和学习.

  • 相关阅读:
    计算机基础理论 基本功
    mac 下使用gcc 编译c函数
    技术书籍 读书方法有感
    IntentFilter的相关问题解析
    IOS 学习笔记 2015-04-03 OC-API-文件读写
    (转)iOS中3种正则表达式的使用与比较
    (转)IOS学习笔记-2015-03-29 int、long、long long取值范围
    mysql 游标
    (转) 生活感悟
    IOS 学习笔记 2015-03-27 我理解的OC-代理模式
  • 原文地址:https://www.cnblogs.com/fuyaozhishang/p/6540477.html
Copyright © 2011-2022 走看看