博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
android gradle配置指南
阅读量:6325 次
发布时间:2019-06-22

本文共 6645 字,大约阅读时间需要 22 分钟。

Gradle简介

Gradle 是一个基于Ant和Maven概念的项目自动化建构工具。它使用一种基于Groovy的特定领域语言(DSL)来声明项目设置,这比我们的ANT使用XML构建配置要灵活的多。在编写配置时,你可以像编程一样灵活,Gradle是基于Groovy的DSL语言,完全兼容JAVA。

Android Studio中使用Gradle

Android Studio是使用Gradle进行自动化构建的IDE,当我们在Android Studio新建项目的时候,项目的目录大抵如下:

├── app #Android App目录│   ├── app.iml│   ├── build #构建输出目录│   ├── build.gradle #构建脚本│   ├── libs #so相关库│   ├── proguard-rules.pro #proguard混淆配置│   └── src #源代码,资源等├── build│   └── intermediates├── build.gradle #工程构建文件├── gradle│   └── wrapper├── gradle.properties #gradle的配置├── gradlew #gradle wrapper linux shell脚本├── gradlew.bat├── LibSqlite.iml├── local.properties #配置Androod SDK位置文件└── settings.gradle #工程配置复制代码

其中,settings.gradle用于配置project,标明其下有几个module,比如这里包含一个:app module(当我们使用Android Studio添加一个在当前项目中添加一个module的时候,会自动的在这个文件中将新的module的名字include进来)

include ':app'复制代码

和settings.gradle在同一目录下的build.gradle是一个顶级的build配置文件,在这里可以为所有project以及module配置一些常用的配置。

// Top-level build file where you can add configuration options common to all sub-projects/modules.buildscript {    repositories {        jcenter()//使用jcenter库    }    dependencies {        // 依赖android提供的2.1.2的gradle build         classpath 'com.android.tools.build:gradle:2.1.2'        // NOTE: Do not place your application dependencies here; they belong        // in the individual module build.gradle files    }}//为所有的工程的repositories配置为jcentersallprojects {    repositories {        jcenter()    }}复制代码

Android Gradle基本配置

配置应用的签名信息

在android.signingConfigs{}下定义一个或者多个签名信息,然后在buildTypes{}配置使用即可。例如:

android {        signingConfigs {            release {                //指定签名用的文件,file对应的根目录是gradle文件所在的根目录               storeFile file("release.keystore")                 //别名                keyAlias "release"                //key的密码                keyPassword "123456"                //证书的密码                storePassword "123456"            }            debug {                ...            }        }        buildTypes {            release {                signingConfig signingConfigs.release            }            debug {                signingConfig signingConfigs.debug            }        }    }复制代码
启用proguard混淆息

我们可以为不同的buildTypes选择是否启用混淆,一般release发布版本是需要启用混淆的,这样别人反编译之后就很难分析你的代码,而我们自己开发调试的时候是不需要混淆的,所以debug不启用混淆。对release启用混淆的配置如下:

android{        buildTypes {            release {                //是否启用混淆                minifyEnabled true                //是否去除无效的资源文件,这个设置依赖于minifyEnabled的设置,因此要两者同时设置为true才会生效                shrinkResources true                //getDefaultProguardFile('proguard-android.txt')表示获取SDK下'proguard-android.txt‘文件中的默认混淆规则                //'proguard-rules.pro'表示使用项目根目录下的 'proguard-rules.pro'文件中的混淆规则                //proguard-rules.pro文件名可以任意,只要在配置文件中指明即可                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'            }        }    }复制代码

此处查看更多关于的信息

启用zipAlign

是一款重要的优化apk应用程序的工具。

apk包的本质是一个zip压缩文档,优化的目的是使包内未压缩的数据能够有序的排列,从而减少应用程序运行时的内存消耗.

android{        buildTypes {            release {                zipAlignEnabled true            }        }    }复制代码
多渠道打包

通过设置productFlavors的值,我们可以指定不同的渠道包,并且每个渠道包可以自定义其applicationId、versionCode以及versionName等信息

android  {        productFlavors {            dev{                applicationId "com.gdut.demo.dev"            }            qa{                applicationId "com.gdut.demo.qa"            }            pro{                applicationId "com.gdut.demo.pro"            }        }    }复制代码
AndroidManifest里的占位符

manifestPlaceholders,它允许我们动态替换我们在AndroidManifest文件里定义的占位符。例如:

然后我们可以针对不同的flavors或者buildTypes动态的指定相应的值,例如: buildTypes { debug { manifestPlaceholders = [umeng_app_key: "替代的内容",umeng_app_secret:"替换的内容"] } ... }复制代码
自定义Android BuildConfig

BuildConfig.java是Android Gradle自动生成的一个java类文件,无法手动编译,但是可以通过Gradle控制,也就是说他是动态可配置的。在 gradle 文件 buildTypes 或者 productFlavors 下面,如:

buildTypes {        release{            //release的包中BuildConfig.ENDPOINT 就会被赋值为 http://example.com 就可以供 Java 代码调用了。            buildConfigField "String", "ENDPOINT", "\"http://example.com\""        }    }复制代码
动态设置 Android resValue

修改 res value 的方式,比如修改 strings.xml 文件中的 AppName 的值。在gradle文件 buildTypes 或者 productFlavors 下面,如:

buildTypes{        release{            //将release的包中名为 AppName 的 string value 值改为 app1            resValue "string", "AppName", "app1"        }    }复制代码
splits的使用

我们除了可以通过设置buildtypes来进行分类打包之外,还可以根据屏幕大小、cpu架构适配类型来进行分类打包,通过使用splits我们可以达成这个目的,例如

splits {        density {            enable true            reset()            include "mdpi", "hdpi"        }        abi {            enable true            reset()            include "x86", "mips"        }    }复制代码

更多的使用情况以及使用说明请参考android的官方文档:

解决方法数限制

Android设定的方法数是65536个(DEX 64K problem),超过这个方法数,导致dex无法生成,就无法生成APK.处理这个问题,除了尽可能的进行apk瘦身,减少整个apk的方法数之外,可以进行两种设置进行解决。

1. 使用multiDex。开启分包模式        defaultConfig {            multiDexEnabled=true        }2. 忽略方法数的检查。2.3版本及以下的手机无法正常安装        android {            dexOptions {                jumboMode = true        }复制代码
dependencies依赖配置
dependencies {        compile fileTree(include: '*.jar', dir: 'libs')        compile project(':pullrefresh')        prodCompile files('src/prod/libs/bankcard-encrypt.jar')        debugCompile files('src/qa/libs/bugrpt.jar')    }复制代码

compile配置将被用于编译main application。它里面的所有东西都被会被添加到编译的classpath中,同时也会被打包进最终的APK。 以下是添加依赖时可能用到的其它一些配置选项:

compile main application(主module)。androidTestCompile test application(测试module)debugCompile debug Build Type(debug类型的编译)prodCompile prod productFlavors(prod渠道的编译)复制代码

因为没有可能去构建一个没有关联任何BuildType(构建类型)的APK,APK默认配置了两个或两个以上的编译配置:compile和< buildTypes >Compile. 创建一个新的buildTypes或者productFlavors将会自动创建一个基于它名字的新配置

使用FindBugs

FindBugs是一个Java静态分析工具,用来检查类或者jar文件,用来发现可能的问题。检测完成之后会生成一份详细的报告,借助这份报告可以找到潜在的bug,比如NullPointException,特定的资源没有关闭,查询数据库没有调用Cursor.close()等;

Java的静态分析工具当然可以无难度的在Android上面运行,通过这种FindBugs的检查可以让App的运行更加的稳定。

使用实例如下:

apply plugin: "findbugs"    //定义一个task任务,这个任务的类型是FindBugs    task findbugs(type: FindBugs) {        //有警告错误的时候也是允许构建        ignoreFailures= true        effort= "default"        //报告的级别,Low,Medium,High        reportLevel= "high"        println( "$project.buildDir")        //classes和source分别是对应的.classe文件夹地址,和源代码文件地址。        classes = files("$project.buildDir/intermediates/classes")        source= fileTree("src/main/java/")        classpath= files()        //指定报告类型,有两种方式xml和html,只允许一种输出格式        reports{            xml.enabled=false            html.enabled=true            xml {                destination "$project.buildDir/findbugs.xml"            }            html{                destination "$project.buildDir/findbugs.html"            }        }    }复制代码

参考文献

转载地址:http://cimaa.baihongyu.com/

你可能感兴趣的文章
zabbix对数据盘磁盘容量进行监控
查看>>
PHP开发api接口安全验证的实例,值得一看
查看>>
Redis-Sentinel Redis的哨兵模式
查看>>
RNN网络【转】
查看>>
Openwrt 远程调试
查看>>
keras的训练引擎:train_array.py和train_generator.py
查看>>
WebSocket
查看>>
使用CefSharp在.Net程序中嵌入Chrome浏览器(十)——独立文件夹部署
查看>>
BZOJ4598: [Sdoi2016]模式字符串(点分治 hash)
查看>>
docker中mysql数据库的数据导入和导出
查看>>
图片 base64转byte[]
查看>>
关于C#中async/await中的异常处理(下)-(转载)
查看>>
Java中使用同步关键字synchronized需要注意的问题
查看>>
(原創) 今晚重看中森明菜1988年的演唱会 (中森明菜) (日記)
查看>>
让你的Windows Mobile充当wifi路由 - WMWifiRouter
查看>>
常见证书格式和转换
查看>>
什么是.Net, IL, CLI, BCL, FCL, CTS, CLS, CLR, JIT
查看>>
Atlas Control ToolKit 发布
查看>>
神经网络和深度学习简史(一)
查看>>
世界是数字的
查看>>