android有关gradle配置

作者: ccccccal | 来源:发表于2017-12-14 16:32 被阅读119次
    gradle使用source set 的概念,一个source set就是一系列资源文件,其将会被便衣和执行,对于android项目,main就是一个source set,其包含了所有的资源文件,相对main测试文件test也是一个source set,只做测试

    基础命令:

    • 查看gradle版本 gradlew -v
    • 查看所有可运行的tasksgradlew tasks
    • 清除目录下的output文件夹 gradlew clean
    • 打包编译, 包括debug和releasegradlew build
    • 编译并打Debug包 gradlew assembleDebug
    • 编译并打Release的包 gradlewassembleRelease
    • 只打包阿里release版本 gradlew assemblealiRelease
    • 关于多moudle gradlew :UpdateAppUtils:assembleDebug
    • 帮助 gradlew --help
    • 查看编译信息 gradlew build --info–stacktrace
    • 制定module gradlew -p app build

    打包需要在build配置签名文件以及密码

     signingConfigs {
            debug {
                // No debug config
            }
    
            release {
                storeFile file("../yourapp.keystore")
                storePassword "your password"
                keyAlias "your alias"
                keyPassword "your password"
            }
        }
    

    gradlew配置文件结构和eclipse结构相同

    android {
         sourceSets {
           main {
             manifest.srcFile 'AndroidManifest.xml'
             java.srcDirs = ['src']
             resources.srcDirs = ['src']
             aidl.srcDirs = ['src']
             renderscript.srcDirs = ['src']
             res.srcDirs = ['res']
             assets.srcDirs = ['assets']
        }
         androidTest.setRoot('tests')
        } 
    }
    

    在grade文件中配置,将会保存eclipse目录结构,如果有依赖的jar包,需要告诉gradle,假设jar包会在一个叫做libs的文件夹内,那么你应该这么配置(现在这条会默认配置):

    dependencies {
           compile fileTree(dir: 'libs', include: ['*.jar'])
    }
    

    gradle 配置解析:

    创建一个新的android项目时,会默认生成三个gradle文件

    • project 的build.gradle文件
    • settings.build文件(声明包含的moudle都有哪些)
    • 默认moudle的App下的build.gradle文件

    根目录的gradle文件一般如下

    //声明自定义的gradle文件
    apply from: "config.gradle"
    buildscript {
        repositories {//配置仓库,使用jcenter,现在studio3.0以后默认使用google
            jcenter()
            google()
        }
        dependencies {//配置gradle的插件默认配置gradle,我这里还配置tinker插件,用于热更新
            classpath 'com.android.tools.build:gradle:3.0.1'
            classpath 'com.tencent.bugly:tinker-support:1.1.1'
            }
    }
    
    allprojects {//定义模块默认属性
        repositories {
            jcenter()
            google()
        }
    }
    
    task clean(type: Delete) {//我这里配置task clean的时候直接删除项目的build文件夹
        delete rootProject.buildDir
    }
    
    

    模块内build.gradle文件

    以下是studio3.0之前的配置,3.0之后稍后改动

    //声明模块要使用的插件,默认配置android.application
    apply plugin: 'com.android.application'
       android {
           compileSdkVersion 22//配置编译app的api版本
           buildToolsVersion "22.0.1"//3.0之后已经去除,不需要再配置
           defaultConfig {
               applicationId "com.gradleforandroid.gettingstarted"//默认对应清单文件里的包名
               minSdkVersion 14//兼容的最小版本号
               targetSdkVersion 22//最适合的版本号
               versionCode 1//版本号标识
               versionName "1.0"//版本名字,一般用于给用户展示,除此没有其他用处
           }
           buildTypes {
               release {
                   minifyEnabled false
                   proguardFiles getDefaultProguardFile
                    ('proguard-android.txt'), 'proguard-rules.pro'
               }
            } 
        }
        dependencies {//3.0以后使用implementation  来代替compile
           compile fileTree(dir: 'libs', include: ['*.jar'])
           compile 'com.android.support:appcompat-v7:22.2.0'
           implementation  'com.android.support:appcompat-v7:22.2.0'
    
         }
    

    使用BuildConfig和resources动态配置不同渠道资源

    比如baseUrl

      release {
                //关闭日志输出
                buildConfigField("boolean", "LOG_DEBUG", "false")
                //配置默认baseUrl
                buildConfigField("String", "SERVER_URL", rootProject.ext.configs['releaseUrl'])
                //配置下载地址
                buildConfigField("String", "DOWNLOAD_URL", rootProject.ext.download['releaseUrl'])
                // 移除无用的resource文件
                shrinkResources true
                //是否混淆
                minifyEnabled true
                //混淆文件(.text处于SDK下面,针对全项目,.pro只针对本项目)
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
                //配置签名文件
                signingConfig signingConfigs.sweetorange_sign
            }
    

    比如app名字:

    android {
           buildTypes {
               debug {
                   resValue "string", "app_name", "我的测试版本"
               }
               release {
                   resValue "string", "app_name", "我是正式版本"
                } 
           }
    }
    
    

    配置全局配置

    关于多moudle开发,方便多人分模块开发,这也是组件化开发的模式,这样每个moudle都会配置各自的build.gradle文件,为了配置统一,一般配置全局配置,让各个moudle去调用

    全局配置有两种方法

    • 直接在project的build.gradle文件中配置
    • 自定义一个gradle文件,然后再project中声明一下,然后去调用

    两种方式一样,个人觉得第二种更方便管理

    有关第二种:

    • 醒目目录改为project,主目录下创建一个.gradle文件名字随便,例如我的config.gradle文件

    主要是配置了项目所使用到的第三方依赖库,有关依赖哭的混淆可以看我的混淆配置https://www.jianshu.com/p/181d6f2d5bae

    ext {
    
        configs = [//配置baseUrl
                debugUrl  : '"http://111.111.1.111.8080"',
                releaseUrl: '"https://www.baidu.com"',
        ]
    
           android = [compileSdkVersion        : 25,
                   applicationId            : "com.sweetorange.read",
                   minSdkVersion            : 16,
                   targetSdkVersion         : 25,
                   versionCode              : 13,
                   versionName              : "1.3",
                   testInstrumentationRunner: "android.support.test.runner.AndroidJUnitRunner"]
    
        dependencies = [//配置所有的第三方依赖库(不多不多,也就二十个)
    
                //multidex方法书超过64K
                "multidex"                     : 'com.android.support:multidex:1.0.1',
    
                //bumptech,用于glide配置okhttp请求
                "bumptech"                     : 'com.github.bumptech.glide:okhttp3-integration:1.4.0@aar',
    
                //pgyer蒲公英用于测试
                "pgyer"                        : 'com.pgyersdk:sdk:2.8.1',
    
                //MZBannerView,banner轮播图,用于引导页面
                "MZBannerView"                 : 'com.github.pinguo-zhouwei:MZBannerView:v2.0.0',
    
                //bugly ,热修复
                "bugly"                        : 'com.tencent.bugly:crashreport_upgrade:1.3.4',
    
                //微信
                "wechat"                       : 'com.tencent.mm.opensdk:wechat-sdk-android-with-mta:1.0.2',
    
                //伸缩textView
                "expandableTextView"           : 'com.ms-square:expandableTextView:0.1.4',
    
                //屏幕适配
                "autolayout"                   : 'com.zhy:autolayout:1.4.5',
    
                //v7包
                "support_v7"                   : 'com.android.support:appcompat-v7:25.3.1',
    
                //设置阅读页动画
                "nineoldandroids"              : 'com.nineoldandroids:library:2.4.0',
    
                //Xutils3用于网络请求
                "xutils"                       : 'org.xutils:xutils:3.3.40',
    
                //design包
                "support_design"               : 'com.android.support:design:25.3.0',
    
                //glide
                "glide"                        : 'com.github.bumptech.glide:glide:3.7.0',
    
                //v4
                "support_v4"                   : 'com.android.support:support-v4:25.3.0',
    
                //drawable
                "support_drawable"             : 'com.android.support:support-vector-drawable:25.1.0',
    
                //eventbus
                "eventbus"                     : 'org.greenrobot:eventbus:3.0.0',
    
                //fastJson
                "fastjson"                     : 'com.alibaba:fastjson:1.2.23',
    
                //litepal
                "litepal"                      : 'org.litepal.android:core:1.5.1',
    
                //circleimageview
                "circleimageview"              : 'de.hdodenhof:circleimageview:2.1.0',
    
                //klog
                "klog"                         : 'com.github.zhaokaiqiang.klog:library:1.5.0',
    
                //Luban
                "Luban"                        : 'top.zibin:Luban:1.1.3',
    
                //jsoup
                "jsoup"                        : 'org.jsoup:jsoup:1.10.2',
    
                //permission
                "permission"                   : 'com.yanzhenjie:permission:1.0.7',
    
                //album
                "album"                        : 'com.yanzhenjie:album:1.0.7',
    
                //constraint-layout
                "constraint_layout"            : 'com.android.support.constraint:constraint-layout:1.0.0-alpha8',
    
                //BaseRecyclerViewAdapterHelper
                "BaseRecyclerViewAdapterHelper": 'com.github.CymChad:BaseRecyclerViewAdapterHelper:2.9.18',
    
                //badgeview
                "badgeview"                    : 'q.rorbin:badgeview:1.1.2',
    
                //butterknife
                "butterknife"                  : 'com.jakewharton:butterknife:8.7.0',
    
                //butterknife
                "butterknife_two"              : 'com.jakewharton:butterknife-compiler:8.7.0',
    
                //lombok
                "lombok"                       : 'org.projectlombok:lombok:1.16.18',
    
                //nohttp
                "nohttp"                       : 'com.yanzhenjie.nohttp:nohttp:1.1.4',
    
                //junit
                "junit"                        : 'junit:junit:4.12',
    
                //okhttp
                "okhttp"                       : 'com.yanzhenjie.nohttp:okhttp:1.1.4',
    
                //添加注解,配合lombok
                "annotation"                   : 'org.glassfish:javax.annotation:10.0-b28',
    
                "SmartRefreshLayout"           : 'com.scwang.smartrefresh:SmartRefreshLayout:1.0.3',
                "SmartRefreshHeader"           : 'com.scwang.smartrefresh:SmartRefreshHeader:1.0.3',
        ]
    }
    

    使用全局配置

    主项目build文件声明自定义的build文件

    apply from: "config.gradle"
    

    在moudle中使用

    apply plugin: 'com.android.application'
    
    // 依赖插件脚本
    apply from: 'tinker-support.gradle'
    
    android {
    
        //项目编译版本
        compileSdkVersion rootProject.ext.android.compileSdkVersion
        defaultConfig {
            //项目包名
            applicationId rootProject.ext.android.applicationId
            //最低兼容
            minSdkVersion rootProject.ext.android.minSdkVersion
            //最佳使用版本
            targetSdkVersion rootProject.ext.android.targetSdkVersion
            //版本号
            versionCode rootProject.ext.android.versionCode
            //版本名
            versionName rootProject.ext.android.versionName
            testInstrumentationRunner rootProject.ext.android.testInstrumentationRunner
            vectorDrawables.useSupportLibrary = true
            multiDexEnabled true
            flavorDimensions "versionCode"
        }
        buildTypes {
            release {
                //关闭日志输出
                buildConfigField("boolean", "LOG_DEBUG", "false")
                //配置默认baseUrl
                buildConfigField("String", "SERVER_URL", rootProject.ext.configs['releaseUrl'])
                //配置下载地址
                buildConfigField("String", "DOWNLOAD_URL", rootProject.ext.download['releaseUrl'])
                // 移除无用的resource文件
                shrinkResources true
                //是否混淆
                minifyEnabled true
                //混淆文件(.text处于SDK下面,针对全项目,.pro只针对本项目)
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
               }
    
            debug {
                buildConfigField("String", "SERVER_URL", rootProject.ext.configs['debugUrl'])
                minifyEnabled true
                //混淆文件(.text处于SDK下面,针对全项目,.pro只针对本项目)
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
                buildConfigField("boolean", "LOG_DEBUG", "true")
                //配置下载地址
                buildConfigField("String", "DOWNLOAD_URL", rootProject.ext.download['debugUrl'])
                }
        }
    
        //配置多渠道包
        productFlavors {
            huawei {}
            xiaomi {}
            qh360 {}
            baidu {}
        }
    
         //使用友盟多渠道打包替换
        productFlavors.all {
            flavor -> flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
        }
    
        //layout文件分包
        sourceSets {
            main {
                res.srcDirs =
                        [
                                'src/main/res/layouts/activities',
                                'src/main/res/layouts/dialogs',
                                'src/main/res/layouts/fragments',
                                'src/main/res/layouts/headviews',
                                'src/main/res/layouts/items',
                                'src/main/res/layouts/views',
                                'src/main/res/layouts',
                                'src/main/res'
                        ]
            }
        }
    
        //配置使用lambda表达式
        compileOptions {
            sourceCompatibility JavaVersion.VERSION_1_8
            targetCompatibility JavaVersion.VERSION_1_8
        }
    }
    
    //配置仓库,可以使用全局配置,默认jcenter,3.0以后默认google
    allprojects {
        repositories {
            jcenter()
            maven { url "https://jitpack.io" }
            maven { url "https://raw.githubusercontent.com/Pgyer/mvn_repo_pgyer/master" }
    
        }
    }
    
    dependencies {
        implementation fileTree(include: ['*.jar'], dir: 'libs')
        androidTestImplementation('com.android.support.test.espresso:espresso-core:2.2.2', {
            exclude group: 'com.android.support', module: 'support-annotations'
        })
        implementation files('libs/alipaySdk-20170309.jar')
        implementation project(':sharelibrary')
        implementation project(':UpdateAppUtils')
        implementation rootProject.ext.dependencies.pgyer
        implementation rootProject.ext.dependencies.bumptech
        implementation rootProject.ext.dependencies.wechat
        implementation rootProject.ext.dependencies.MZBannerView
        implementation rootProject.ext.dependencies.expandableTextView
        implementation rootProject.ext.dependencies.autolayout
        implementation rootProject.ext.dependencies.support_v7
        implementation rootProject.ext.dependencies.nineoldandroids
        implementation rootProject.ext.dependencies.xutils
        implementation rootProject.ext.dependencies.support_design
        implementation rootProject.ext.dependencies.glide
        implementation rootProject.ext.dependencies.support_v4
        implementation rootProject.ext.dependencies.support_drawable
        implementation rootProject.ext.dependencies.eventbus
        implementation rootProject.ext.dependencies.fastjson
        implementation rootProject.ext.dependencies.litepal
        implementation rootProject.ext.dependencies.circleimageview
        implementation rootProject.ext.dependencies.klog
        implementation rootProject.ext.dependencies.Luban
        implementation rootProject.ext.dependencies.jsoup
        implementation rootProject.ext.dependencies.permission
        implementation rootProject.ext.dependencies.album
        implementation rootProject.ext.dependencies.constraint_layout
        implementation rootProject.ext.dependencies.BaseRecyclerViewAdapterHelper
        implementation rootProject.ext.dependencies.badgeview
        implementation rootProject.ext.dependencies.butterknife
        annotationProcessor rootProject.ext.dependencies.butterknife_two
        implementation rootProject.ext.dependencies.lombok
        annotationProcessor rootProject.ext.dependencies.lombok
        implementation rootProject.ext.dependencies.nohttp
        implementation rootProject.ext.dependencies.okhttp
        testImplementation rootProject.ext.dependencies.junit
        provided rootProject.ext.dependencies.annotation
        implementation rootProject.ext.dependencies.SmartRefreshLayout
        implementation rootProject.ext.dependencies.SmartRefreshHeader
        implementation rootProject.ext.dependencies.bugly
        implementation rootProject.ext.dependencies.multidex
        implementation project(':PushSDK')
        implementation files('libs/umeng-analytics-7.4.0.jar')
        implementation files('libs/umeng-common-1.4.0.jar')
    }
    
    

    gradle的以依赖管理

    gradle支持三种仓库

    • Maven
    • lvy
    • 文件夹

    一个依赖需要三个元素:

    • group------组织名字
    • name------库名字
    • version----库版本

    例如:

    implementation 'com.github.ALguojian:SpannableHelper:1.0'
    

    gradle使用groovy编写,完整表述如下:

    implementation group: 'com.github.ALguojian' , name: 'SpannableHelper' , version: '1.0'
    

    有关公司私人权限仓库配置:

    repositories {
           maven {
               url "http://repo.acmecorp.com/maven2"
               credentials {
                   username 'user'
                   password 'secretpassword'
               }
            } 
       
    

    建议有关密码都配置在gradle.properties文件中,并添加到忽略文件

    # 应用版本名称
    VERSION_NAME=1.0.0
    # 应用版本号
    VERSION_CODE=100
    

    使用如下:

    android {
        compileSdkVersion project.ANDROID_BUILD_SDK_VERSION as int
        buildToolsVersion project.ANDROID_BUILD_TOOLS_VERSION
     
        defaultConfig {
            versionCode project.VERSION_CODE as int
            versionName project.VERSION_NAME
            minSdkVersion project.ANDROID_BUILD_MIN_SDK_VERSION as int
            targetSdkVersion project.ANDROID_BUILD_TARGET_SDK_VERSION as int
        }
    }
    

    添加so包如下:

    用c或者c++写的library叫做so包,android插件默认是支持的,需要把so文件放在对应文件夹中

    app
       ├── AndroidManifest.xml
       └── jniLibs
           ├── armeabi
           │   └── nativelib.so
           ├── armeabi-v7a
           │   └── nativelib.so
           ├── mips
           │   └── nativelib.so
           └── x86
               └── nativelib.so
    

    被依赖的moudle编译之后会生成aar文件,使用aar文件和jar相同

    关于以来的配置:

    • implementation 其含义是包含所有的依赖包,即在APK里,implementation 的依赖会存在。
    • Runtime only 仅仅编译是使用
    • testImplementation 添加额外的library支持针对测试
    • androidTestCompile添加额外的library支持针对测试
    • Debug implementation 针对不同的渠道配置

    关于配置多版本

    buildTypes下面配置多渠道配置:

    android {
        buildTypes {
            alguojain{
                applicationIdSuffix ".alguojain"
                versionNameSuffix "-alguojain"
                buildConfigField "String","API_URL","\"http://alguojain.com"\"
             }
        }
    }
    

    关于配制多渠道 product flavors

    android {
    
        flavorDimensions "123", "456"
        productFlavors {
            aaa{
                 applicationId 'com.alguojian.aaa'
                  flavorDimension "123"
                 versionCode 3
            }
            bbb{
                 flavorDimension "456"
                 applicationId 'com.alguojian.bbb'
                 minSdkVersion 14
                 versionCode 4
            }
        }
    }
    

    配置渠道过滤器

    android.variantFilter { variant ->
           if(variant.buildType.name.equals('release')) {
               variant.getFlavors().each() { flavor ->
                   if (flavor.name.equals(tbl)) { variant.setIgnore(true);
                }
            }
        }
    }
    

    配置多版本的签名文件

    有关签名,debug版本shistudio默认的签名,使用的是公共的签名文件,下面alguojian版本使用initWith方法是使用debug版本的配置

    android {
           signingConfigs {
    
               alguojian.initWith(signingConfigs.debug)
    
               release {
                   storeFile file("release.keystore")
                   storePassword"secretpassword"
                   keyAlias "gradleforandroid"
                   keyPassword "secretpassword"
               }
          }
    }
    

    针对不同版本不同渠道配置不同签名

    android {
           buildTypes {
               release {
                   productFlavors.red.signingConfig signingConfigs.aaa
                   productFlavors.blue.signingConfig signingConfigs.bbb
               }
           }
    }
    

    多moudle开启多线程构建(电脑内存要大,要大,要大!!!)

    需要在grade.properties文件中配置如下属性:

    
    org.gradle.parallel=true
    
    

    自定义gradle插件,待定,正在学习grovvy

    相关文章

      网友评论

        本文标题:android有关gradle配置

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