build.gradle

apply plugin: 'com.android.application'

android {
compileSdkVersion rootProject.ext.android.compileSdkVersion //编译sdk版本
buildToolsVersion rootProject.ext.android.buildToolsVersion //编译tools version defaultConfig {
applicationId "com.example.myapp"
minSdkVersion rootProject.ext.android.minSdkVersion //最低sdk
targetSdkVersion rootProject.ext.android.targetSdkVersion//目标sdk
versionCode 6
versionName "1.0"
multiDexEnabled true //使用multidex
// testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
} signingConfigs { //签名配置
release {
keyAlias 'deviceapp'
keyPassword '111111'
storeFile file('../deviceAppKey.key')
storePassword '111111'
}
debug {
//empty
}
} buildTypes {
debug {
versionNameSuffix "-debug"
minifyEnabled false
zipAlignEnabled false
shrinkResources false
signingConfig signingConfigs.debug
} release {
//混淆
minifyEnabled true
//Zipalign优化
zipAlignEnabled true
// 移除无用的resource文件 minifyEnabled true有效
shrinkResources true
signingConfig signingConfigs.release
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'//混淆配置
} } dataBinding {//data binding 使用
enabled = true
} } dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')//文件夹下面全部依赖
compile files('libs/gson.jar')//单文件依赖
// androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
// exclude group: 'com.android.support', module: 'support-annotations'
// })
compile 'com.android.support.constraint:constraint-layout:1.0.2'
compile rootProject.ext.libSupportAppcompatV7
    compile rootProject.ext.libGson
    compile rootProject.ext.libOKHttp
    //    compile rootProject.ext.libOKIO
    compile rootProject.ext.libRetorfit
    //    compile rootProject.ext.libOKHttpLogging
    compile rootProject.ext.libRetorfitConvertGson
    compile rootProject.ext.libRXJava
    compile rootProject.ext.libRXAndroid
    compile rootProject.ext.libRXRetrofitAdapter

compile project(':configlibrary')//module library依赖
compile (project(':configlibrary')) { exclude group: "com.android.support" }//类库去重处理 }

这里涉及到统一版本号(类库版本,编译版本,使用版本)管理,为了防止相同项目引入相同类库不同版本,以及编译相关版本,方便后续统一维护修改,所以需要统一版本号

在项目根目录创建config.gradle将通用的类库写在里面,内容如下

ext {
android = [
compileSdkVersion: 25,
buildToolsVersion: "25",
minSdkVersion : 18,
targetSdkVersion : 25
] def supportVersion = "23.4.0"
def gsonVersion = "2.7"
def butterKnifeVersion = "8.4.0"
def butterKnifeCompilerVersion = "8.4.0" def okHttpVersion = "3.6.0";
def okIOVersion = "1.11.0";
def retrofitVersion = "2.2.0";
def okHttpLogVersion = "3.6.0"; def rxJavaVersion = "2.0.7"
def rxAndroidVersion = "2.0.1"
def retorfitRxAdapterVersion = "2.2.0" libSupportAppcompatV7 = "com.android.support:appcompat-v7:${supportVersion}"
libSupportDesign = "com.android.support:design:${supportVersion}"
libSupportRecyclerview = "com.android.support:recyclerview-v7:${supportVersion}"
libSupportV4 = "com.android.support:support-v4:${supportVersion}"
libGson = "com.google.code.gson:gson:${gsonVersion}" libButterKnife = "com.jakewharton:butterknife:${butterKnifeVersion}"
libButterKnifeCompiler = "com.jakewharton:butterknife-compiler:${butterKnifeCompilerVersion}" libOKHttp = "com.squareup.okhttp3:okhttp:${okHttpVersion}"
libOKIO = "com.squareup.okio:okio:${okIOVersion}"
libRetorfit = "com.squareup.retrofit2:retrofit:${retrofitVersion}"
libRetorfitConvertGson = "com.squareup.retrofit2:converter-gson:${retrofitVersion}"
libOKHttpLogging = "com.squareup.okhttp3:logging-interceptor:${okHttpLogVersion}"
libRXJava = "io.reactivex.rxjava2:rxjava:${rxJavaVersion}"
libRXAndroid = "io.reactivex.rxjava2:rxandroid:${rxAndroidVersion}"
libRXRetrofitAdapter = "com.squareup.retrofit2:adapter-rxjava2:${retorfitRxAdapterVersion}" }

在根目录build.gradle里引用该配置文件

// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.3.1'
}
}
apply from: "config.gradle"

即可在其它module内使用,统一通用版本,防止相同类库产生多个版本

编译产生java.lang.OutOfMemoryError: GC overhead limit exceeded问题解决

 // solve java.lang.OutOfMemoryError: GC overhead limit exceeded
dexOptions {
preDexLibraries true
javaMaxHeapSize "3g"
incremental true
dexInProcess = true
}


debug,release打包签名配置

 signingConfigs {
config {
keyAlias 'key0'
keyPassword 'xinju123'
storeFile file('F:/StudioProjects/PublisherSystem/xinju_mediaplayer.jks')
storePassword 'xinju123'
}
} buildTypes {
debug {
versionNameSuffix "-debug"
applicationIdSuffix ".alpha"
minifyEnabled false
zipAlignEnabled false
shrinkResources false
// signingConfig signingConfigs.config
}
release {
versionNameSuffix "-release"
applicationIdSuffix ".beata"
debuggable false
jniDebuggable false
//混淆
minifyEnabled false
//Zipalign优化
zipAlignEnabled false
// 移除无用的resource文件 minifyEnabled true有效
shrinkResources false
signingConfig signingConfigs.config
// proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'//混淆配置
}
}

项目内部分为多个功能模块,同时会产生在同一个res资源内的layout,value,drawable对应文件有很多,不方便查找及后续的分离处理,

因此需要对资源内容进行按功能模块进行分离除处理,使用gradle可以轻松实现此需求

在module工程内的build.gradle android内加入sourceSets命令

android {
compileSdkVersion rootProject.ext.android.compileSdkVersion
buildToolsVersion rootProject.ext.android.buildToolsVersion defaultConfig {
minSdkVersion rootProject.ext.android.minSdkVersion //最低sdk
targetSdkVersion rootProject.ext.android.targetSdkVersion//目标sdk
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
} sourceSets { //资源分割模块化处理
main.res.srcDirs += 'src/main/res-logcat'
main.res.srcDirs += 'src/main/res-config'
main.res.srcDirs += 'src/main/res-config2'
main.res.srcDirs += 'src/main/res-httpchunk'
main.res.srcDirs += 'src/main/res-logviewer'
main.res.srcDirs += 'src/main/res-standout'
}
}

最终效果

可以看到,多个res资源目录按功能分割好了。

或者按目录进行划分处理

    sourceSets { //资源分割模块化处理
// java.srcDirs('src/test1','src/test2')
main.java.srcDirs('src/test1/java')//定义java源文件目录
main.res.srcDirs('src/test1/res')//定义资源目录,drawable layout values
}

gradle 生产同一程序,不同packgeName方法
http://blog.csdn.net/chenaini119/article/details/46874241

productFlavors{
flavors_release{
manifestPlaceholders = [str:"releaseStr",package_name:"com.example.android.newsreader"]
applicationId "com.example.android.newsreader"
} flavors_dev{
manifestPlaceholders = [str:"devStr",package_name:"com.example.android.newsreaderdev"]
applicationId "com.example.android.newsreaderdev"
}
}

androidStudio3.0 gradle flavor打包

buildTypes {
......
flavorDimensions "ver_test","ver_online"
productFlavors {
opt_test {
dimension "ver_test"
applicationIdSuffix ".test"
}
opt_online {
dimension "ver_online"
applicationIdSuffix ".online"
}
}
//包数量flavorDimensions * productFlavors (2x2)
}

在Android Studio的右侧的gradle面板中点击  按钮刷新下,于是在build子栏目中
其中以assemble*打头的都是生成apk的选项,生成的apk在build/outputs/apk中,这里我们对任一项双击即可生成对应的apk
对应flavors_release和flavors_dev的apk应该就是和这两个,于是分别双击他们等待各自生成apk的过程

工程内部代码功能分离

sourceSets {
main {
def dirs = ['p_widget', 'p_theme',
'p_location', 'p_log','p_im','p_share']
dirs.each { dir ->
java.srcDir("src/$dir/java")
res.srcDir("src/$dir/res")
}
}
wm {
dirs.each { dir ->
java.srcDir("src/${dir}/wm/java")
res.srcDir("src/${dir}/wm/res")
}
}
mt {
dirs.each { dir ->
java.srcDir("src/${dir}/mt/java")
res.srcDir("src/${dir}/mt/res")
}
}
}

gradle动态控制BuildConfig.java

BuildConfig.java是Android Gradle自动生成的一个java类文件,无法手动编译,但是可以通过Gradle控制,也就是说它是动态可配置的

buildTypes {
debug {
//debug包BuildConfig LOG_DEBUG 为true
buildConfigField "boolean", "LOG_DEBUG", "true"
buildConfigField "String", "Flag", "111"
} release {
//release包BuildConfig LOG_DEBUG 为false
buildConfigField "boolean", "LOG_DEBUG", "false"
//release的包中BuildConfig.Flag 就会被赋值为 222
buildConfigField "String", "Flag", "222"
}
}

在配置加入如上命令时,编译后 BuildConfig会生成LOG_DEBUG,Flag常量,并且会根据不同的包产生不同值

同时也可以生成resValue内容,如,生成strings.xml类型的字符串的值,

buildTypes {
debug {
resValue "string", "app_name1", "MyApp_debug"
...
}
release {
//将release的包中名为 app_name 的 string value 值改为 app1
resValue "string", "app_name1", "MyApp_release"
}
}

值得注意,resValue生成内容并不是在strings.xml内,而在MyApp\app\build\generated\res\resValues\debug\values\generated.xml内,内容如下

<?xml version="1.0" encoding="utf-8"?>
<resources> <!-- Automatically generated file. DO NOT MODIFY --> <!-- Values from build type: debug -->
<string name="app_name1" translatable="false">MyApp_debug</string> </resources>

关于gradle编译命令:

命令行切换到项目根目录:

执行gradlew -v如有内容输出即可证明正常

基本命令:

./gradlew -v 版本号
./gradlew clean 清除Project目录下的build文件夹
./gradlew build 检查依赖并编译打包
注意gradlew build 命令把debug、release环境的包都打出来

./gradlew assembleDebug 编译并打Debug包
./gradlew assembleRelease 编译并打Release的包
./gradlew installRelease Release模式打包并安装
./gradlew uninstallRelease 卸载Release模式包

gradlew app:clean 清理app module输出文件
gradlew app:build 构建app module
gradlew app:check lint检查

gradlew app:assembleRelease 打release安装包
gradlew app:assembleDebug debug安装包

依赖类库:
对只依赖类库中的很小功能的,需要对内容进行精简处理重新打包

例如:butterknife
compile('com.jakewharton:butterknife:8.4.0') {
        exclude group: 'com.android.support', module: 'support-annotations'
    }
    annotationProcessor 'com.jakewharton:butterknife-compiler:8.4.0'

 其它module
// 编译CommonSDK模块,但是去掉此模块中对com.android.support的依赖,防止重复依赖报错
        compile (project(':CommonSDK')) { exclude group: "com.android.support" }

依赖 aar 包
    把 aar 包放到 libs 目录下
  repositories {
    flatDir {
        dirs 'libs'
    }
}
implementation(name:'faceplatform-release', ext:'aar')    

aar 包需要被多个 module 依赖时,我们就不能把 aar 包放在单一的 module 中,我们可以在项目的根目录创建一个目录,比如叫 aar 目录,然后把我们的 aar 包放进去
在项目的根目录的 build.gradle 的 allprojects 标签下的 repositories 添加
flatDir {
            dirs ../aar  //    ../aar 表示根目录下的 aar 文件夹。
        }
然后就可以添加依赖了 compile(name:'tt',ext:'aar')

compile是默认的那个,其含义是包含所有的依赖包,即在APK
provided的意思是提供编译支持,但是不会写入apk
debugCompile/releaseCompile

更多介绍:https://mp.weixin.qq.com/s/hCXLz-9BnAOGWyZ2eRikKg

两个重要的命令:
Gradle查看Android项目中库的依赖关系

使用gradlew <projectname>:dependencies --configuration compile检测依赖关系,去除重复
dependencies指令,
./gradlew :app:dependencies --configuration compile

dependencyInsight指令,查看指定库的依赖关系
./gradlew :app:dependencyInsight --dependency fastjson --configuration compile

studio3.0 compile 替换为 implementation 引用类库,查找改为,

dependencies指令,
gradlew :app:dependencies --configuration releaseCompileClasspath
:app:dependencies

dependencyInsight指令
gradlew :app:dependencyInsight --dependency support-annotations --configuration releaseCompileClasspath
:app:dependencyInsight

studio3.0

implementation 替换compile依赖类库,只对本module有效,不能传递依赖,(隔离功能)

api可以对外暴露依赖类库,可传递

android gradle配置及编译command的更多相关文章

  1. cocos2dx - android环境配置及编译

    接上一节内容:cocos2dx - 伤害实现 本节主要讲Android环境配置及编译 在第一节中setup.py的配置里,我们没有配置对应的ndk,sdk,ant的路径,在这里需要先配置好环境变量. ...

  2. Android Gradle 配置选项合集

    //让gradle 引入构建安卓app的插件 apply plugin: 'com.android.application' //自定义变量, 使用的时候不需要 ext 前缀 ext { minSdk ...

  3. Android Gradle配置

    解决问题 错误: Could not find the AndroidManifest.xml file, going up from path //打开app build.gradle文件加入以下代 ...

  4. Android gradle 配置

    gradle https://www.cnblogs.com/qianxudetianxia/p/4948499.html flavor https://blog.csdn.net/user11223 ...

  5. Android Studio gradle配置详解

    android gradle配置详解 AppExtension类及其属性 可能大部分人看到AppExtension类会感觉到非常的陌生,其实我们在app中的build.gradle中填写配置信息的时候 ...

  6. Gradle系列之Android Gradle高级配置

    本篇文章主要在之前学习的基础上,从实际开发的角度学习如何对 Android Gradle 来进行自定义以满足不同的开发需求,下面是 Gradle 系列的几篇文章: Gradle系列之初识Gradle ...

  7. 在 Android studio 中 配置Gradle 进行 “动态编译期间,指定 远程服务器地址 ,生成多个安装包”

    需求: 在产品开发中,经常需要发布各个版本,每个版本的服务器地址有不同的服务器地址.比如 开发服务器使用 192.168.1.232服务器, 测试服务器使用 192.168.1.245服务器, 正式上 ...

  8. Android studio gradle配置!!!【转】

    转自:http://www.open-open.com/lib/view/open1415793464648.html Gradle 基本概念 首先我们学习几个gradle 的脚本语法,掌握了这几个语 ...

  9. Android Gradle 依赖配置:implementation & api

    背景: Android Gradle plugin 3.0开始(对应Gradle版本 4.1及以上),原有的依赖配置类型compile已经被废弃,开始使用implementation.api和anno ...

  10. Android开发之深入理解Android Studio构建文件build.gradle配置

    摘要: 每周一次,深入学习Android教程,TeachCourse今天带来的一篇关于Android Studio构建文件build.gradle的相关配置,重点学习几个方面的内容:1.applica ...

随机推荐

  1. java8 Stream API之reduce

    通过前面那篇文章,我们已经对Stream API有了初步的认识,并对它在集合处理中的增强作用表示了肯定.同时我们上篇中示例了forEach.fiter.sum这些常用的功能,本篇我们只讲reduce. ...

  2. PHP接口微信支付

    PHP后台调用微信支付下单function wx_getPayRequest($openid, $orderid, $rmb, $title,$appoids){ $nonce = $orderid. ...

  3. Mac用自带软件QuickTime Player进行录屏

    ​ Mac电脑用自带软件QuickTime Player进行录屏的教程,几步就可以学会,挺简单的. 1.首先,找到并打开QuickTime Player软件.可以鼠标右键这个图标,选择"选项 ...

  4. 基于HttpWebRequest,HttpWebResponse发起请求

    /// <summary> /// 获取版本更新信息 GET /// </summary> /// <param name="softwareKey" ...

  5. 一个小demo---递归计算子类下的某个值的总和

    public function demo($frames) { foreach ($frames as $k => $frame) { $frames[$k]['allCount'] = $fr ...

  6. harbor 修改主机地址

    harbor 修改主机地址 1 # cd /var/lib/wise2c/harbor/harbor 2 # docker-comppose down 3 # vi harbor.cfg 4 host ...

  7. java传递参数调用python完成剪切多个视频最终拼接成一个

    需求如题,综合考虑之后我选择python去做视频处理,最终结果也让我非常满意. 我是windows 环境,安装的python3.8和moviepy模块 第一步:安装python3.8 第二步:修改py ...

  8. AC间二层漫游

    这个实验没有找到用packet tracer做的例子,故使用ensp,参考了文章: 配置WLAN AC间二层漫游示例 - WLAN V200R008C10 典型配置案例集 - 华为 (huawei.c ...

  9. 免费节假日 API

    转载地址:http://timor.tech/api/holiday 获取指定日期的节假日信息 接口地址:http://timor.tech/api/holiday/info/$date@params ...

  10. 存储单位bit、byte、KB、MB、GB、TB、PB、EB、ZB、YB、BB、NB、DB、CB、XB

    bit(binary digit)比特,这是表示信息的最小单位,它只能表示 0 或 1. byte(字节),其表示的值范围是0~255(无符号) 或 -127~127(有符号),1 byte = 8 ...