阅读 907

Android Gradle统一管理打包

前言

Gradle

  Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化构建开源工具。它使用一种基于Groovy的特定领域语言(DSL)来声明项目设置,目前也增加了基于Kotlin语言的kotlin-based DSL,抛弃了基于XML的各种繁琐配置,面向Java应用为主。当前其支持的语言限于Java、Groovy、Kotlin和Scala,计划未来将支持更多的语言。 AndroidStudio使用Gradle作为基础的构建工具,所以我们需要对Gradle做进一步的了解,这就提到了Groovy语言。

Groovy

  Groovy是一种基于JVM(Java虚拟机)的敏捷开发语言,它结合了Python、Ruby和Smalltalk的许多强大的特性,Groovy 代码能够与 Java 代码很好地结合,也能用于扩展现有代码。由于其运行在JVM上的特性,Groovy也可以使用其他非Java语言编写的库。Groovy是用于Java虚拟机的一种敏捷的动态语言,它是一种成熟的面向对象编程语言,既可以用于面向对象编程,又可以用作纯粹的脚本语言。使用该种语言不必编写过多的代码,同时又具有闭包和动态语言中的其他特性。

一、对Gradle统一管理

  在项目中,有可能出现多个module的情况,很多moudle都拥有相同的依赖,比如V7包,如果想做V7包版本的变动,很可能造成版本的不兼容。所以对依赖进行统一的管理对于有多个moudle的情况非常方便。 那么如何进行统一管理呢?

1、建立config.gradle

在主项目根目录下建立 config.gradle

2、声明版本和库

编写如下代码,对需要用到的版本号和库进行声明。

ext {
    android = [
            minSdkVersion    : 16,
            compileSdkVersion: 26,
            targetSdkVersion : 26,
            buildToolsVersion: "26.0.2",
            supportVersion   : "26.1.0",
            versionCode      : 1,
            versionName      : "1.0",
            resConfigs       : "zh"
    ]

    plug = [
            mainVersion        : 1,
            mainVersionName    : '1.0.0',

            libBaseVersion     : 1,
            libBaseVersionName : '1.0.0',

            libStyleVersion    : 1,
            libStyleVersionName: '1.0.0',

            libUtilVersion     : 1,
            libUtilVersionName : '1.0.0'
    ]

    def supportVersion = "26.1.0"
    def constraintSupportVersion = "1.1.3"
    def cardViewVersion = '25.3.0'
    
    dependencies = [
            // Android support library
            SupportDesign           : "com.android.support:design:$supportVersion",
            SupportAppcompatV7      : "com.android.support:appcompat-v7:$supportVersion",
            SupportConstraint       : "com.android.support.constraint:constraint-layout:$constraintSupportVersion",
            CardView                : "com.android.support:cardview-v7:$cardViewVersion",
    ]
}
复制代码

3、根目录中添加config.gradle

打开项目的build.gradle,在其最上方添加代码

apply from: "config.gradle
复制代码

4、使用

对版本号做统一管理:

//实例化统一版本管理器
def app = rootProject.ext.android
compileSdkVersion app.compileSdkVersion
efaultConfig {
    applicationId "com.tianzi.chuji"
    minSdkVersion app.minSdkVersion
    targetSdkVersion app.targetSdkVersion
    versionCode app.versionCode
    versionName app.versionName
    multiDexEnabled true
    ndk {}
}
复制代码

对第三方库做统一管理:

dependencies {
    def app = rootProject.ext.dependencies
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile app.SupportAppcompatV7
    compile app.SupportDesign
    compile app.CardView
    compile app.Gson
    compile app.Okttp
    compile app.OkHttpLoggingInterceptor
    compile app.Retrofit
    compile app.RetrofitConverterGson
    compile app.RetrofitAdapterRxJava
    compile app.RxJava
    compile app.RxAndroid
    compile app.EventBus
    compile app.SmartRefreshLayout
    compile app.SmartRefreshHeader
    compile app.AndroidAnnotations
    compile app.RxKit
    compile app.RxUi
}
复制代码

二、对项目配置进行统一管理

我们在打包apk时,会有一些项目配置,比如是否混淆、是否压缩、是否消除冗余资源引用。如果都都写在gradle中是难以管理的,最好进行统一的管理。

1、建立gradle-build.properties

在打包的moudle根目录下建立gradle-build.properties文件。

#是否发布
deliver=true
#发布位置
appReleaseDir=C:/Users/xxhdp/Desktop/release/release
#签名信息
keyAlias=xxxxxx
keyPassword=xxxxxx
storeFile=xxxxxx
storePassword=xxxxxx
#打包配置
############################## release ###################
#Log开关 上线版本设置为“false”
release_LOG_DEBUG=true
#上线版本设置为“false”
release_isDev=false
release_versionNameSuffix="-release"
#是否混淆
release_minifyEnabled=false
#是否资源优化
release_zipAlignEnabled=true
#是否删除无效资源
release_shrinkResources=false
############################## debug ######################
#Log开关 上线版本设置为“false”
debug_LOG_DEBUG=true
#是否是线下版本 上线版本设置为“false”
debug_isDev=true
debug_versionNameSuffix="-debug"
#是否混淆
debug_minifyEnabled=false
#是否资源优化
debug_zipAlignEnabled=true
#是否删除无效资源
debug_shrinkResources=false
复制代码

2、gradle中获取gradle-build.properties

使用Groovy语法定义两个变量,其实只需要一个就够了,我这里自己增加了一条打包路径

声明buildProperty

ext.buildProperty = null
ext.appReleaseDir = ''
def loadProperties() {
    def proFile = file("gradle-build.properties")
    Properties p = new Properties()
    proFile.withInputStream { stream ->
        p.load(stream)
    }
    buildProperty = p
    appReleaseDir = p.appReleaseDir
}
loadProperties()//调用方法
复制代码

签名的使用

signingConfigs {
        debug {
            keyAlias buildProperty.keyAlias
            keyPassword buildProperty.keyPassword
            storeFile file(buildProperty.storeFile)
            storePassword buildProperty.storePassword
        }
        release {
            keyAlias buildProperty.keyAlias
            keyPassword buildProperty.keyPassword
            storeFile file(buildProperty.storeFile)
            storePassword buildProperty.storePassword
        }
    }
复制代码

buildTypes的使用

buildTypes {
        debug {
            buildConfigField "boolean", "LOG_DEBUG", buildProperty.debug_LOG_DEBUG
            buildConfigField "boolean", "isDev", buildProperty.debug_isDev
            buildConfigField "String", "versionNameSuffix", buildProperty.debug_versionNameSuffix
            minifyEnabled Boolean.parseBoolean(buildProperty.debug_minifyEnabled)
            zipAlignEnabled Boolean.parseBoolean(buildProperty.debug_zipAlignEnabled)
            shrinkResources Boolean.parseBoolean(buildProperty.debug_shrinkResources)
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            signingConfig signingConfigs.debug
        }
        release {
            buildConfigField "boolean", "LOG_DEBUG", buildProperty.release_LOG_DEBUG
            buildConfigField "boolean", "isDev", buildProperty.release_isDev
            buildConfigField "String", "versionNameSuffix", buildProperty.release_versionNameSuffix
            minifyEnabled Boolean.parseBoolean(buildProperty.release_minifyEnabled)
            zipAlignEnabled Boolean.parseBoolean(buildProperty.release_zipAlignEnabled)
            shrinkResources Boolean.parseBoolean(buildProperty.release_shrinkResources)
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            signingConfig signingConfigs.release
            applicationVariants.all { variant ->
                variant.outputs.each { output ->
                    def outputFile = output.outputFile
                    if (outputFile != null && outputFile.name.endsWith('.apk')) {
                        def fileName = "ChuJi_v${app.versionName}_${releaseTime()}_${variant.productFlavors[0].name}.apk"
                        if (Boolean.parseBoolean(buildProperty.deliver)) {//是否正式发布,需要配置发布版打包位置
                            output.outputFile = new File(appReleaseDir + '/' + releaseTime(), fileName)
                        }
                    }
                }
            }
        }
    }
复制代码

三、配置多渠道打包

只需要在productFlavors里面添加需要的渠道名即可

productFlavors {//配置渠道包或者版本包
        'ChuJi' {
        }
        'BaiDu' {
        }
    }
    productFlavors.all { flavors ->
        flavors.manifestPlaceholders = [channelValue: name]
    }
复制代码

四、动态命名

在buildTypes中有这段代码,在打开release模式的情况下,会按照如下方式在gradle-build.properties声明的位置生成fileName格式的apk包。

applicationVariants.all { variant ->
     variant.outputs.each { output ->
         def outputFile = output.outputFile
         if (outputFile != null && outputFile.name.endsWith('.apk')) {
              def fileName = "ChuJi_v${app.versionName}_${releaseTime()}_${variant.productFlavors[0].name}.apk"
              if (Boolean.parseBoolean(buildProperty.deliver)) {//是否正式发布,需要配置发布版打包位置
                  output.outputFile = new File(appReleaseDir + '/' + releaseTime(), fileName)
              }
          }
      }
  }
复制代码

五、打包加固

  通过gradle方式进行打包,点击项目右侧gradle标签,展开项目下需要打包的moudle,点击Task展开列表,再展开build列表。点击assembleRelease即可打包。打包成功后通过乐固进行apk加固。


长路漫漫,菜不是原罪,堕落才是原罪。
我的CSDN:blog.csdn.net/wuyangyang_…
我的简书:www.jianshu.com/u/20c2f2c35…
我的掘金:juejin.im/user/58009b…
我的GitHub:github.com/wuyang2000
个人网站:www.xiyangkeji.cn
个人app(茜茜)蒲公英连接:www.pgyer.com/KMdT
我的微信公众号:茜洋 (定期推送优质技术文章,欢迎关注)
Android技术交流群:691174792

以上文章均可转载,转载请注明原创。


关注下面的标签,发现更多相似文章
评论