android studiogradle gradle dependencies 包存放在哪儿

为Android Studio编写自定义Gradle插件的教程
作者:喝醉的毛毛虫
字体:[ ] 类型:转载 时间:
这篇文章主要介绍了为Android Studio编写自定义Gradle插件的教程,Android Studio现在基本上已经成为了安卓开发的标配IDE,友可以参考下
Google已经建议Android开发全部转向Android Studio开发,Android Studio 是使用gradle编译、打包的,那么问题来了,gradle可是有一堆东西...,为了彻底了解gradle,今天就来学习下如何写自己的gradle插件(当然插件源码是使用groovy写的),先看如下代码目录:
如上图所示,plugin目录是插件源码目录,sample是用来测试插件的。
1、在目录plugin/src/main/groovy/com/micky/gradle/下新建插件类MyCustomPlugin.groovy
package com.micky.
import org.gradle.api.*;
class MyCustomPlugin implements Plugin&Project& {
void apply(Project project) {
project.task('myTask') && {
println "Hi this is micky's plugin"
看看Plugin的源码,其实就是一接口
public interface Plugin&T& {
* Apply this plugin to the given target object.
* @param target The target object
void apply(T target);
2、在目录plugin/src/main/resources/META-INF/gradle-plugins/下创建文件com.micky.mycustom.properties用来指定插件实现类
implementation-class=com.micky.gradle.MyCustomPlugin
&& 特别注意下:文件名“com.micky.mycustom”即是以后我们在使用插件时的apply plugin 'java' 的java,这里我也是折腾了半天才得出的结果,坑啊。
3、一般情况下,我们还需要指定插件项目名称,在plugin目录下新建settings.gradle
rootProject.name='gradle-micky'
4、万事具备,就差编译了,编译需要在plugin目录下新建build.gradle
apply plugin: 'groovy'
apply plugin: 'maven'
dependencies {
compile gradleApi()
compile localGroovy()
repositories {
mavenCentral()
group='com.micky'
version='1.0.0'
uploadArchives {
repositories {
mavenDeployer {
repository(url: uri('../repo'))
在这个脚本里使用groovy插件编译groovy源码,声明gradleAPI作为即时编译依赖,apply plugin: 'maven' 是用来创建一个插件jar文件并且存储在本地maven库里,本地maven库即我们在脚本里创建的"../repo"目录
执行命令:&&
gradle uploadArchives
5、以上4个步骤已经编译插件并上传到了本地库中,接下来就看看怎么使用插件,在sample目录下,新建build.gradle
buildscript {
repositories {
url uri('../repo')
dependencies {
classpath group: 'com.micky',
name: 'gradle-micky',
version: '1.0.0'
apply plugin: 'com.micky.mycustom'
6、执行命令
myTask即我们在MyCustomPlugin.groovy代码中创建的任务。
7、自定义Task
(1)copy一份改名CustomPluginTask
在plugin\src\main\groovy\com\micky\gradle目录创建源文件 MyCustomTask.groovy
package com.micky.
import org.gradle.api.DefaultTask
import org.gradle.api.tasks.TaskAction
class MyCustomTask extends DefaultTask {
@TaskAction
void output() {
println "Hello this is my custom task output"
(2)修改MyCustomPlugin.groovy
package com.micky.
import org.gradle.api.*;
class MyCustomPlugin implements Plugin&Project& {
void apply(Project project) {
project.task('customTask', type: MyCustomTask)
(3)修改plugin目录下的build.gradle,修改版本号
apply plugin: 'groovy'
apply plugin: 'maven'
dependencies {
compile gradleApi()
compile localGroovy()
repositories {
mavenCentral()
group='com.micky'
version='1.0.1'
uploadArchives {
repositories {
mavenDeployer {
repository(url: uri('../repo'))
执行gradle uploadArchives 编译插件包
(4)sample目录下的build.gradle
buildscript {
repositories {
url uri('../repo')
dependencies {
classpath group: 'com.micky',
name: 'gradle-micky',
version: '1.0.1'
apply plugin: 'com.micky.mycustom'&
执行gradle customTask 结果如下:
8、向Plugin Task 传递参数
(1)拷贝一份上面的代码,改名为CustomPluginTaskWithParam,修改plugin\src\main\groovy\com\micky\gradle\MyCustomPlugin.groovy
package com.micky.
import org.gradle.api.*;
class MyCustomPluginExtension {
def message = "From MyCustomPluginExtention"
def sender = "MyCustomPluin"
class MyCustomPlugin implements Plugin&Project& {
void apply(Project project) {
project.extensions.create('myArgs', MyCustomPluginExtension)
project.task('customTask', type: MyCustomTask)
(2)修改plugin\src\main\groovy\com\micky\gradle\MyCustomTask.groovy
package com.micky.
import org.gradle.api.DefaultTask
import org.gradle.api.tasks.TaskAction
class MyCustomTask extends DefaultTask {
@TaskAction
void output() {
println "Sender is ${project.myArgs.sender},\nmessage: ${project.myArgs.message}"
(3)修改plugin/build.gradle
apply plugin: 'groovy'
apply plugin: 'maven'
dependencies {
compile gradleApi()
compile localGroovy()
repositories {
mavenCentral()
group='com.micky'
version='1.0.2'
uploadArchives {
repositories {
mavenDeployer {
repository(url: uri('../repo'))
&&&&&&& 执行gradle uploadArchives 编译插件包&&&&
(4)修改sample/build.gradle
buildscript {
repositories {
url uri('../repo')
dependencies {
classpath group: 'com.micky',
name: 'gradle-micky',
version: '1.0.2'
apply plugin: 'com.micky.mycustom'
(5)执行gradle customTask,结果如下:
(6)在gradle文件配置参数
buildscript {
repositories {
url uri('../repo')
dependencies {
classpath group: 'com.micky',
name: 'gradle-micky',
version: '1.0.2'
apply plugin: 'com.micky.mycustom'
sender='Micky Liu'
message='Gradle is so simple.'
(7)执行gradle customTask,结果如下:
8、向Plugin Task 传递嵌套试复杂参数
(1)拷贝一份上面的代码,改名为CustomPluginTaskWithNestParam,修改plugin\src\main\groovy\com\micky\gradle\MyCustomPlugin.groovy
package com.micky.
import org.gradle.api.*;
class MyNestPluginExtension {
def receiver = "Kate Zhou"
def email = ""
class MyCustomPluginExtension {
def message = "From MyCustomPluginExtention"
def sender = "MyCustomPluin"
class MyCustomPlugin implements Plugin&Project& {
void apply(Project project) {
project.extensions.create('myArgs', MyCustomPluginExtension)
project.myArgs.extensions.create('nestArgs', MyNestPluginExtension)
project.task('customTask', type: MyCustomTask)
(2)修改MyCustomPlugin.groovy
package com.micky.
import org.gradle.api.DefaultTask
import org.gradle.api.tasks.TaskAction
class MyCustomTask extends DefaultTask {
@TaskAction
void output() {
println "Sender is ${project.myArgs.sender} \nmessage: ${project.myArgs.message}"
println "Receiver is ${project.myArgs.nestArgs.receiver} \nemail: ${project.myArgs.nestArgs.email}"
(3)修改plugin/build.gradle
apply plugin: 'groovy'
apply plugin: 'maven'
dependencies {
compile gradleApi()
compile localGroovy()
repositories {
mavenCentral()
group='com.micky'
version='1.0.3'
uploadArchives {
repositories {
mavenDeployer {
repository(url: uri('../repo'))
(4)执行gradle uploadArchives 编译插件包
(5)修改sample/build.gradle
buildscript {
repositories {
url uri('../repo')
dependencies {
classpath group: 'com.micky',
name: 'gradle-micky',
version: '1.0.3'
apply plugin: 'com.micky.mycustom'
sender='Micky Liu'
message='Gradle is so simple.'
&&&&&&&&&&
(6)执行执行gradle customTask,结果如下:
(7)在gradle文件配置参数
buildscript {
repositories {
url uri('../repo')
dependencies {
classpath group: 'com.micky',
name: 'gradle-micky',
version: '1.0.3'
apply plugin: 'com.micky.mycustom'
sender='Micky Liu'
message='Gradle is so simple.'
nestArgs {
receiver='David Chen'
(8)执行gradle customTask,结果如下:
& 源码地址:/mickyliu945/GradleCustomPlugin
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具解决Android Studio:一直处于Gradle:Reslove dependencies ':classpath'中
解决 Studio:一直处于Gradle:Reslove dependencies ':classpath'中。在使用Android Studio升级gradle版本在同步的使用可能会遇到这样一个问题,就是一直处于Gradle:Reslove dependencies &:classpath&中:
可能是Plugin version和Required Gradle version不对应造成的:如下图
这两个版本是有个对应关系的,查阅可知以下对应关系:
所以解决的办法就是根据以上的表格将两边的版本对应一直问题即可解决。Android Studio中Gradle使用详解 - 简书
Android Studio中Gradle使用详解
一)基本配置
buildscript {
repositories {
dependencies {
classpath 'com.android.tools.build:gradle:1.2.3'
Android脚本
apply plugin: 'com.android.application'
Android配置
compileSdkVersion 22
buildToolsVersion "22.0.1"
├── build.gradle
├── settings.gradle
└── app
├── build.gradle
├── build
├── libs
└── src
└── main
├── java
└── com.package.myapp
└── res
├── drawable
├── layout
└── etc.
Gradle Wrapper结构(这些新建项目时都添加给了用户,不需要重新添加)
├── gradlew
├── gradlew.bat
└── gradle/wrapper/
├── gradle-wrapper.jar
└── gradle-wrapper.properties
运行build任务 - 列出所有可用任务
$ ./gradlew tasks
生成App-debug.apk任务
$ ./gradlew assembleDebug
# Apk路径: MyApp/app/build/ outputs/apk
手动导入Eclipse-Android项目(自动导入请连续点“下一步”)在项目路径下创建build.gradle文件:
buildscript {
repositories {
dependencies {
classpath 'com.android.tools.build:gradle:1.2.3'
apply plugin: 'com.android.application'
compileSdkVersion 22
buildToolsVersion "22.0.1"
sourceSets {
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')
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
PS 也可以复制粘贴Eclipse-Android项目的源代码到Android Studio的项目里
二)自定义配置
Gradle所有文件结构
├── build.gradle
├── settings.gradle
└── app
└── build.gradle
settings.gradle
include ':app'
MyApp/build.gradle
buildscript {
repositories {
dependencies {
classpath 'com.android.tools.build:gradle:1.2.3'
allprojects {
repositories {
MyApp/app/build.gradle
apply plugin: 'com.android.application'
compileSdkVersion 22
buildToolsVersion "22.0.1"
defaultConfig {
applicationId "com.gradleforandroid.gettingstarted"
minSdkVersion 14
targetSdkVersion 22
versionCode 1
versionName "1.0"
buildTypes {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:22.2.0'
$ ./gradlew assemble -为所有构建类型创建apk
$ ./gradlew check 运行所有的检查,比如说Android Lint,如果发现问题可终止任务
$ ./gradlew build 运行以上两个任务
$ ./gradlew clean -清除生成的apk
$ ./gradlew connectedCheck - 在设备上运行测试
$ ./gradlew deviceCheck - 远程设备运行测试
$ ./gradlew installDebug/installRelease - 在设备商安装指定版本
$ ./gradlew uninstall - 卸载
Build Types不同版本的参数设置 - BuildConfig/Resource Value
buildTypes {
applicationIdSuffix ".debug"
buildConfigField "String", "API_URL","\"/api\""
buildConfigField "boolean", "LOG_HTTP_CALLS", "true"
resValue "string", "app_name", "Example DEBUG"
buildConfigField "String", "API_URL", "\"/api\""
buildConfigField "boolean", "LOG_HTTP_CALLS", "false"
resValue "string", "app_name", "Example"
全局设置(项目根目录的build.gradle)
allprojects {
apply plugin: 'com.android.application'
compileSdkVersion 22
buildToolsVersion "22.0.1"
设置全局参数
compileSdkVersion = 22
buildToolsVersion = "22.0.1"
在MyApp/app/build.gradle里面使用参数
compileSdkVersion pileSdkVersion
buildToolsVersion rootProject.ext.buildToolsVersion
默认任务(MyApp/build.gradle)
defaultTasks 'clean', 'assembleDebug'
三) 依赖管理
仓库预设配置仓库
repositories {
mavenCentral()
mavenLocal()
repositories {
url "/maven2"
credentials {
username 'user'
password 'secretpassword'
url "/repo"
repositories {
url "../repo"
本地依赖项目文件依赖
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
原生库结构与配置
├── AndroidManifest.xml
└── jniLibs
├── armeabi
└── nativelib.so
├── armeabi-v7a
└── nativelib.so
├── mips
└── nativelib.so
└── x86
└── nativelib.so
sourceSets.main {
jniLibs.srcDir 'src/main/libs'
Libray项目
# 修改Android插件:
apply plugin: 'com.android.library'
# settings.gradle新增libray项目:
include ':app', ':library'
# app内引用library项目:
dependencies {
compile project(':library')
repositories {
dirs 'aars'
dependencies {
compile(name:'libraryname', ext:'aar')
# 动态版本
dependencies {
compile 'com.android.support:support-v4:22.2.+'
compile 'com.android.support:appcompat-v7:22.2+'
compile 'com.android.support:recyclerview-v7:+'
Android Studio内添加依赖
四)构建变体
构建类型android {
buildTypes {
# release类型
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
# staging类型 复制debug类型
staging.initWith(buildTypes.debug)
applicationIdSuffix ".staging"
versionNameSuffix "-staging"
buildConfigField "String", "API_URL", "\"/api\""
产品格局android {
productFlavors {
applicationId 'com.gradleforandroid.red'
versionCode 3
applicationId 'com.gradleforandroid.blue'
minSdkVersion 14
versionCode 4
构建变体&待续&
签名配置android {
signingConfigs {
staging.initWith(signingConfigs.debug)
storeFile file("release.keystore")
storePassword"secretpassword"
keyAlias "gradleforandroid"
keyPassword "secretpassword"
五)多模块构建管理
加速构建在gradle.properties里面添加:
org.gradle.parallel=true
单元测试使用JUnit
└─── src
├─── main
│ ├─── java
└─── com.example.app
└───res
└─── test
└─── java
└─── com.example.app
dependencies {
testCompile 'junit:junit:4.12'
使用Robolectric
apply plugin: 'org.robolectric'
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:22.2.0'
testCompile 'junit:junit:4.12'
testCompile'org.robolectric:robolectric:3.0'
testCompile'org.robolectric:shadows-support:3.0'
@RunWith(RobolectricTestRunner.class)
@Config(manifest = "app/src/main/AndroidManifest.xml", sdk = 18)
public class MainActivityTest {
public void clickingButtonShouldChangeText() {
AppCompatActivity activity = Robolectric.buildActivity(MainActivity.class).create().get();
Button button = (Button) activity.findViewById(R.id.button);
TextView textView = (TextView) activity.findViewById(R.id.label);
button.performClick();
assertThat(textView.getText().toString(), equalTo(activity.getString(R.string.hello_robolectric)));
功能测试使用Espresso
测试覆盖度使用Jacoco
七)创建任务与插件
八)配置CI
九)自定义配置 - 进阶
缩减apk文件大小使用ProGuardandroid {
buildTypes {
minifyEnabled true
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
收缩资源文件 - 自动 (&手动待续&)android {
buildTypes {
minifyEnabled true
shrinkResources true
org.gradle.parallel=true # 并行构建
org.gradle.daemon=true # 开启Gradle守护进程
org.gradle.jvmargs=-Xms256m -Xmx1024m # 配置JVM&参照下图&
使用Profiling
使用Jack(Java Android Compiler Kit) and Jill(Jack Intermediate Library Linker)
lintOptions {
abortOnError false
app打包 - 进阶分割apk
enable true
exclude 'ldpi', 'mdpi'
compatibleScreens 'normal', 'large', 'xlarge'
生成结果:
app-hdpi-release.apk
app-universal-release.apk
app-xhdpi-release.apk
app-xxhdpi-release.apk
app-xxxhdpi-release.apk
《Gradle for Android》
DockOne翻译及编辑: http://dockone.io/people/llitfkitfk}

我要回帖

更多关于 android studiogradle 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信