您的位置:首页 > 移动开发

Android Studio导入工程报错[Plugin with id 'com.android.application' not found]

2017-05-19 18:11 615 查看
http://blog.csdn.net/seafishyls/article/details/53572939

版权声明:本文为博主原创文章,未经博主允许不得转载。

目录(?)[-]
出错现象
原因分析
buildgradleProject xxxx
buildgradleModule xxx

解决方案

出错现象

互联网上下载了一份源码,想通过Android Studio导入查看源码,gradle同步的时候,出现了如下错误: 


 

大概意思是找不到:com.android.application 插件,以上现象对于初学者来说会经常碰到,下面分析下产生的原因。

原因分析

首先来看看导入后的工程结构: 


 

对于此工程结构,是否有个疑问? 这是未正常同步完成的结构,Gradle Scripts下面似乎少了个 build.gradle ,上图红框部分描述清楚了是 Module: GraphicsDemo ,表示该 build.gradle 是Module的,而不是Project的。来看看一个正常的 Project+Module的工程是怎样的: 



请注意红框位置,一个是Project, 一个是 Module 。这两个 build.gradle 究竟啥区别呢? 众所周知,Android Studio在组织工程结构的时候是以Project作为基础,可以在它的基础上创建多个Module,正如上图所示!不少开发人员在贡献自己的代码到Github或者CSDN下载频道的时候,就直接把Module 整个文件夹丟上去了,导致下载使用的人出现了上述错误现象。 究其原因,还是先了解下 两种类型 gradle文件的错用吧!


build.gradle(Project: xxxx)

该文件是整个工程编译的全局文件,优先级最高 

源码如下:
// Top-level build file where you can add configuration options common to all sub-projects/modules.
// 优先级最高的build文件,先于Module的build.gradle执行
buildscript {
repositories {
jcenter() //指定maven镜像,下同
}
dependencies {
classpath 'com.android.tools.build:gradle:2.2.0' //指定classpath
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
jcenter()
}
}
task clean(type: Delete) {
delete rootProject.buildDir //指定clean的时候清除掉指定目录
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

从上述的注释可以看出该文件的作用: 

1. 编译工程最顶级的文件,优先级最高; 

2. 指定maven仓库地址,gradle相关的包是从maven拉取下来的; 

3. 指定 classpath,不然无法找到某些类,标题出现的问题就是这个原因。


build.gradle(Module: xxx)

该文件是某个Module编译时候用到的文件 

源码如下:
//注意:Gradle是通过插件来区分是可执行的工程还是libiary工程,下面表示可执行工程
apply plugin: 'com.android.application'
android {
compileSdkVersion 23
buildToolsVersion "23.0.3"
defaultConfig {
applicationId "mashen.graphicsdemo"
minSdkVersion 17
targetSdkVersion 22
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.4.0'
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

这里面的配置都是大家耳熟能详的了,重点看看第一行,apply plugin: ‘com.android.application’ 表示当前Module是可执行工程。 然而找不到这个插件,原因就是 com.android.application 来源于 com.android.tools.build:gradle:2.2.0 。 这下估计都明白了!

解决方案:

将build.gradle里面的配置脚本拷贝到Module下的 build.gradle里面,也就是下面的脚本:
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.2.0'
//注意:更换成自己的AS的版本
}
}
allprojects {
repositories {
jcenter()
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
1
2
3
4
5
6
7
8
9
10
11
12
13
14

查看gradle版本: Terminal —> gradle -v (前提是配置了环境变量)

总结:将project里面的build脚本合并到module下的build.gradle 。通常出现标题头这种问题都是这样解决的。gradle里面支持 DSL的方式编写脚本,很cool!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐