v4 v7包的使用,Android Gradle的理解,版本号对应Gradle发行版本

222 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第15天,点击查看活动详情

目录

v4 v7包的使用

Android Gradle的理解

版本号对应Gradle发行版本

升级Android Gradle Plugin到3.0.1的踩坑之旅

groovy语法:https://www.jianshu.com/p/ae97aad0505d


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.32.2.1 - 2.3
1.2.0 - 1.3.12.2.1 - 2.9
1.5.02.2.1 - 2.13
2.0.0 - 2.1.22.10 - 2.13
2.1.3 - 2.2.32.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的踩坑之旅

按照提示,解决方案大致有两个:

  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    //加上这行即可
    }
    }

  2. 然后再次同步gradle

  3. 同步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
    再次同步...

  4. 嗯,没错,又报错了。

    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')
                ...
            }
        }
    }
    

  5. 反正就是各种各样的groovy语法报错,然而并不懂groovy语法,现学现卖改一改
    我们工程里是既有动态修改manifest文件的需求,也有自定义apk名字的功能,
    包括自动修改apk名称的代码也有报错,也要改,最终改成了这样

groovy语法:www.jianshu.com/p/ae97aad05…