task javadoc(type: Javadoc,dependsOn: 'build') { version "1.0.1" options.addStringOption("charset", "UTF-8") options.encoding = "UTF-8" title = "MySDKII" include( "com/wangpos/test/inter/*.java", ) source = android.sourceSets.main.java.srcDirs failOnError false } def custom = project.hasProperty('custom') ? custom : 'defaultCustom' def testName = project.hasProperty('TestName') ? TestName : 'defaultName' println(custom) println(testName) /**这个task会自动运行,注意脚本运行顺序由上到下*/ task initTask { println('***初始化模块***') } /**在终端手动调用的时候才会执行 ./gradlew releaseJar*/ task releaseJar << { println('***创建jar包***') } //这个Task必须手动调用,因为这是一个继承Copy的task task copyDocs(type: Copy) { println("copyDoc开始执行...") from 'src/main/doc' into 'build/target/doc' println("copyDocs执行完...") } //依赖javadoc 意思是先把doc生成 task makeSdkJar(type: org.gradle.api.tasks.bundling.Jar, dependsOn: 'javadoc') { baseName 'TestSDK' //只打包org.cmdmac下的org.cmdmac.pluginsdk.impl和org.cmdmac.gamecenter,其他子包不会被打包进去 from('build/intermediates/classes/obm/debug') { //有了include表示只包括某些文件 include 'com/wangpos/test/MainActivity.class' // include 'com/wangpos/test/Presenter.class' } // into('org/cmdmac/') // 排除一些文件 exclude('com/wangpos/test/Presenter.class') //    exclude{ it.name.startsWith('R$');} } android { compileSdkVersion rootProject.ext.compileSdkVersion buildToolsVersion localBuildToolsVersion defaultConfig { applicationId "com.wangpos.test" minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion versionCode 2 versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" flavorDimensions "versionCode" } signingConfigs { keystore { keyAlias 'androiddebugkey' keyPassword 'android' storeFile file('/Users/qiyue/wangpos/code2/keystore/debug.keystore') storePassword 'android' } } buildTypes { release { signingConfig signingConfigs.keystore minifyEnabled false manifestPlaceholders = ["app_name": 'Gradle详解正式版'] buildConfigField "boolean", "isDebug", "false" } debug { applicationIdSuffix ".debug" manifestPlaceholders = ["app_name": 'Gradle详解测试版'] buildConfigField "boolean", "isDebug", "true" } other { applicationIdSuffix ".other" manifestPlaceholders = ["app_name": 'Gradle普通版本'] buildConfigField "boolean", "isDebug", "false" } } productFlavors { obm { buildConfigField "String", "VERSION", "\"obm\"" } oem { buildConfigField "String", "VERSION", "\"oem\"" } odm { buildConfigField "String", "VERSION", "\"odm\"" } } lintOptions { //build release 版本 时 开启lint 检测 checkReleaseBuilds true //lint 遇到 error 时继续 构建 abortOnError false } dexOptions { javaMaxHeapSize "4g" } testOptions { resultsDir = "${project.buildDir}/foo/results" } project.afterEvaluate { tasks.getByName("copyDocs") { it.doFirst { println("执行配置111") } it.doLast { println("执行配置222") } } } project.assemble.doLast { println "assemble finish" } project.assemble.doFirst { println "assemble start" } } /* * compileSdkVersion 26 //告诉 Gradle 用哪个 Android SDK 版本编译你的应用,当你修改了 compileSdkVersion 的时候, * 可能会出现新的编译警告、编译错误,但新的 compileSdkVersion 不会被包含到 APK 中:它纯粹只是在编译的时候使用。 * compileSdkVersion 通常我们使用最新的,在编译的时候检查代码的错误和警告,提示开发者修改和优化 * */ /* buildToolsVersion "26.0.1" 表示构建工具的版本号,这个属性值对应 AndroidSDK 中的 Android SDK Build-tools, 正常情况下 build.gradle 中的 buildToolsVersion 跟你电脑中 Android SDK Build-tools 的最新版本是一致的 */ /* minSdkVersion 15 //应用可以运行的最低要求,app运行所需的最低sdk版本.低于minSdkVersion的手机将无法安装. */ /* targetSdkVersion 26 minSdkVersion和targetSdkVersion相信非常多人都不太理解。我在网上也看了很多关于这两者差别的文章,感觉说的都非常模糊。直到我在stackOverFlow看到Android Min SDK Version vs. Target SDK Version这篇文章后,我才最终弄清楚怎样去设置minSdkVersion和targetSdkVersion。如今我将分享给大家。 简言之,这篇文章的目的是为了区分minSDK和targetSDK,这两者相当于一个区间。你能够用到targetSDK中最新的API和最酷的新功能,但你又不得不向下兼容到minSDK,保证这个区间内的设备都能够正常的执行你的app。换句话说,你想使用Android刚刚推出的新特性。但这对于你的app又不是必须的。你就能够将targetSDK设置为你想使用新特性的SDK版本号,minSDK设置成低版本号保证全部人都能够使用你的app。 */ /* defaultConfig 配置默认构建属性 */ /* applicationId 指定应用唯一标识,相同的applicationId不能安装到同一台设备 adb uninstall 这里是applicationId adb uninstall com.wangpos.test adb uninstall com.wangpos.test.debug versionCode 应用版本号 versionName 应用版本名称 packages 是改变会影响资源文件的应用,R文件生成路径 */ /* * BuildType 构建类型 * * 默认情况下,Android Plugin 会自动给项目构建 debug 和 release 版本。两个版本的区别在于能否在安全设备 * (非 dev)上调试,以及 APK 如何签名。debug 使用通过通用的 name/password 对生成的密钥证书进行签名 * (为了防止在构建过程中出现认证请求)。release 在构建过程中不进行签名,需要自行签名。 * * 我们在开开发过程可以自己添加很多调试版本,通过Android Studio左下角Build Variants 选择当前的调试版本 * * */ /* buildscript 声明是gradle脚本自身需要使用的资源。可以声明的资源包括依赖项、第三方插件、maven仓库地址等 buildscript和allprojects的作用和区别 buildscript中的声明是gradle脚本自身需要使用的资源,就是说他是管家自己需要的资源,跟你这个大少爷其实并没有什么关系。 而allprojects声明的却是你所有module所需要使用的资源,就是说如果大少爷你的每个module都需要用同一个第三库的时候,你可以在allprojects里面声明 */ /* productFlavors 多渠道打包, 和BuildScript组合使用,可以构建多总不同的版本 如果productFlavors3种产品,buildScript中两种模式,最终会有3 X 2 = 6种版本类型 */ /* repositories 顾名思义就是仓库的意思啦,而jcenter()、maven()和google()就是托管第三方插件的平台 dependencies 当然配置了仓库还不够,我们还需要在dependencies{}里面的配置里,把需要配置的依赖用classpath配置上,因为这个dependencies在buildscript{}里面, 所以代表的是Gradle需要的插件。 */ /* manifestPlaceholders 占位符,我们可以通过它动态配置AndroidManifest文件一些内容,譬如app的名字 */ /* OBM:A设计,A生产,A品牌,A销售==工厂自己设计自产自销 ODM:B设计,B生产,A品牌,A销售==俗称“贴牌”,就是工厂的产品,别人的品牌 OEM:A设计,B生产,A品牌,A销售==代工,代生产,别人的技术和品牌,工厂只生产 */ /* dexOptions{} 我们知道,Android中的Java源代码被编译成class字节码后,在打包成apk的时候 被dx命令优化成Android虚拟机可执行的DEX文件。 DEX文件比较紧凑,Android费尽心思做了这个DEX格式,就是为了能使我们的程序在Android中平台上运行快一些。对于这些生成DEX文件的过程和处理,Android Gradle插件都帮我们处理好了,Android Gradle插件会调用SDK中的dx命令进行处理。 但是有的时候可能会遇到提示内存不足的错误,大致提示异常是 java,lang.OutOfMemoryError: GC overhead limit exceeded,为什么会提示内存不足呢? 其实这个dx命令只是一个脚本,它调用的还是Java编写的dx.jar库,是Java程序处理的,所以当内存不足的时候,我们会看到这个Java异常信息.默认情况下给dx分配的内存是一个G8,也就是 1024MB。 所以我们只需要把内存设置大一点,就可以解决这个问题,上图我的项目就把内存设置为4g。 */ /* dependencies{} 我们平时用的最多的大概就这个了, 1. 首先第一句compile fileTree(include: ['.jar'], dir: 'libs')*,这样配置之后本地libs文件夹下的扩展名为jar的都会被依赖,非常方便。 2. 如果你要引入某个本地module的话,那么需要用compile project('×××')。 3. 如果要引入网上仓库里面的依赖,我们需要这样写compile group:'com.squareup.okhttp3',name:'okhttp',version:'3.0.1',当然这样是最完整的版本,缩写就把group、name、version去掉,然后以":"分割即可。 compile 'com.squareup.okhttp3:okhttp:3.0.1' */ /* gradle 3.0中依赖implementation、api的区别: 其实api跟以前的compile没什么区别,将compile全部改成api是不会错的; 而implementation指令依赖是不会传递的,也就是说当前引用的第三方库仅限于本module内使用,其他module需要重新添加依赖才能用,下面用两个图说明: */