v4 v7包的使用
compile 'com.android.support:appcompat-v7:23.1.1' //必须要导入他才能使用v7包下面的控件 compile 'com.android.support:cardview-v7:23.0.0' //v7包下面的控件 compile 'com.android.support:recyclerview-v7:23.0.0'//v7包下面的控件 复制代码
gradle引用appcompat-v7包的时候就不需要引用v4了,因为v7里默认包含了v4包;
compile ‘com.android.support:appcompat-v7:21.0.3’ 中的21代表API level 21推出的兼容包,所以如果你引用的是21之前的版本,则默认这些Theme.AppCompat.Light是Holo风格的,从21开始的版本默认是Material风格
使用appcompat之后,你的所有的Activity应该继承自ActionBarActivity,而ActionBarActivity继承自FragmentActivity,所以放心的使用Fragment;
Android Gradle的理解
综述:
Android Gradle Plugin 本质上就是 一个AS的插件,它一边调用 Gradle本身的代码和批处理工具来构建项目,一边调用Android SDK的编译、打包功能,从而让我们能够顺畅地在AS上进行开发。
Gradle其实就是一个构建项目的工具,也就是把那一个个文件、文件夹按照一定的规则关联起来,形成一个项目的工具,它其实不仅仅是用在AndroidStudio上。
我们在AS中用到的Gradle其实应该被叫做 Android Gradle Plugin,也就是安卓项目上的gradle插件;
Gradle插件会有版本号,每个版本号又对应有一个或一些 Gradle发行版本(一般是限定一个最低版本),也就是我们常见的类似gradle-3.1-all.zip这种东西;
如果这两个版本对应不上了,那你的工程构建的时候就会报错。
版本号对应Gradle发行版本
插件版本 | Gradle版本 |
1.0.0 - 1.1.3 | 2.2.1 - 2.3 |
1.2.0 - 1.3.1 | 2.2.1 - 2.9 |
1.5.0 | 2.2.1 - 2.13 |
2.0.0 - 2.1.2 | 2.10 - 2.13 |
2.1.3 - 2.2.3 | 2.14.1+ |
2.3.0+ | 3.3+ |
3.0.0+ | 4.1+ |
Android Studio 3.0 之后自动将插件版本升级到3.0.0,所以我们也需要对应地把Gradle升级到4.1才行
另外, Android Gradle Plugin又会跟 Android SDK BuildTool有关联,因为它还承接着AndroidStudio里的编译相关的功能
这也是我们要在项目的 local.properties 文件里写明Android SDK路径、在build.gradle 里注明 buildToolsVersion 的原因。
所以 Android Gradle Plugin 本质上就是 一个AS的插件,它一边调用 Gradle本身的代码和批处理工具来构建项目,一边调用Android SDK的编译、打包功能,从而让我们能够顺畅地在AS上进行开发。
升级Android Gradle Plugin到3.0.1的踩坑之旅
按照提示,解决方案大致有两个:
- 要么我们需要在依赖于注解的module中,加上“annotationProcessor”这个配置;
要么我们可以设置android.defaultConfig.javaCompileOptions.annotationProcessorOptions.includeCompileClasspath = true,但是要注意这玩法以后会被删除
按照官方推荐的第一种方法:应该是在报错的build.gradle中修改:
dependencies { compile xxxxx ... //加上类似这些对于注解处理器的的依赖 annotationProcessor 'com.xxxx.xxxxx-1.0.0' }
但是我加上了并没有什么作用,原因待查..
为了节约时间,还是先用includeCompileClasspath=true的办法凑合下吧,以后真的被删除了再说...
直接在app/build.gradle(准确的说是每个涉及到注解依赖的module的build.gradle)上加一行
defaultConfig { minSdkVersion rootProject.ext.android.minSdkVersion targetSdkVersion rootProject.ext.android.targetSdkVersion versionCode 1 versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" javaCompileOptions { annotationProcessorOptions { includeCompileClasspath = true //加上这行即可 } } }
javaCompileOptions { annotationProcessorOptions { includeCompileClasspath = true //加上这行即可 } }
- 然后再次同步gradle
- 同步gradle,不出意外的又报错了。
一堆的style属性未找到的问题,跟第六步里的现象貌似是一样的
Error:(713, 5) error: style attribute '@android:attr/windowExitAnimation' not found. Error:(713, 5) error: style attribute '@android:attr/windowExitAnimation' not found. Error:(713, 5) error: style attribute '@android:attr/windowExitAnimation' not found.
这才发现其实clean是没有用的,真正的问题原因在一堆错误的最后几行
Error:java.util.concurrent.ExecutionException: java.util.concurrent.ExecutionException: com.android.tools.aapt2.Aapt2Exception: AAPT2 error: check logs for details Error:java.util.concurrent.ExecutionException: com.android.tools.aapt2.Aapt2Exception: AAPT2 error: check logs for com.android.tools.aapt2.Aapt2Exception: AAPT2 error: check logs for details
AAPT2 , 貌似就是aapt的2.0版本?
aapt.exe 是 Android SDK里的一个工具
直接说解决方案:
在Project/gradle.properties中添加 android.enableAapt2=false
再次同步...
- 嗯,没错,又报错了。
Error:(247, 1) Execution failed for task ':app:processMarketDebugManifest'. Manifest Tasks does not support the manifestOutputFile property any more, please use the manifestOutputDirectory instead. For more information, please check https://developer.android.com/studio/build/gradle-plugin-3-0-0-migration.html
这个错跟7号有点类似,又是新版本gradle插件不支持某些方法啦,又要换用新的写法才行啦...然后最后给你贴一个文档地址自己看去。。
大概就是说:现在不支持manifestOutputFile这个方法,要用processManifest.manifestOutputDirectory()来替换,
也就是你app/build.gradle 打包的这一段代码要重新写一下;一般我们都会在build.gradle中编写这样的代码,来实现对Manifest文件的修改、以及自定义apk的输出文件名等。
android.applicationVariants.all { variant -> variant.outputs.each { output -> output.processManifest.doLast { ... def manifestFile = output.processManifest.manifestOutputFile; //这里被废弃导致报错 def apkFileName = "_myapp_${android.defaultConfig.versionCode}_${formatedDate}.apk"; manifestFile.write(updatedContent, 'UTF-8') ... } } }
- 反正就是各种各样的groovy语法报错,然而并不懂groovy语法,现学现卖改一改
我们工程里是既有动态修改manifest文件的需求,也有自定义apk名字的功能,
包括自动修改apk名称的代码也有报错,也要改,最终改成了这样