Android项目编译

mac2026-04-06  3

一、Gradle简介

1、什么是gradle?

      gradle是一个构建系统,构建项目的工具,用来编译Android  app,能够简化编译,打包,测试过程。

 

2、android  studio项目的gradle版本在哪看?

      project/gradle/wrapper/gradle-wrapper.properties文件,文件内容如下:

distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists distributionUrl=https\://services.gradle.org/distributions/gradle-4.4-all.zip

       其中,distributionUrl指定的就是gradle的版本,上面代码指定的gradle的版本是4.4,可以修改gradle的版本使用我们本地已经下载好的gradle版本。

 

3、导入新项目时,编译时间过长,这是什么原因?

     当Android  studio打开一个工程时,首先会读取gradle-wrapper.proerties文件,从而知道这个工程需要哪个版本的gradle,然后就会去保存gradle的文件夹中去看存不存在这个版本的gradle,如果不存在则会去distribubtionUrl去下载,下载比较缓慢。

 

4、gradle下载的位置。

      Linux系统:~/.gradle/wrapper/dists

      windows系统: C:\users\用户名\.gradle\wrapper\dists

5、如何手动配置gradle。

     gradle的离线下载地址:gradle的下载地址

     离线下载对应版本的gradle后,一般都是下载gradle-x-all.zip,无需解压,直接放到对应版本文件夹下有个一串字母文件夹下,如图所示:

   最后重新启动项目。

 

二、gradle插件总结

1、android  studio中gradle插件位置

     在整个项目的build.gradle文件下,dependencies配置的内容,如图所示:

2、Gradle插件

      gradle插件跟Android SDK BuildTool有关联,因为它还承接着AndroidStudio里的编译相关的功能,这也是我们要在项目的local.properties文件里写明Android  SDK路径,在build.gradle里注明buildtoolsVersion的原因。它是独立于Android studio运行的,它的更新跟Android  Studio是分开的。

3、gradle插件版本号得对应一些Gradle版本,否在在工程构建的时候会报错。视图如下:

 

三、compile 、 implemention、   api

(1)compile过时

Configuration 'compile' is obsolete and has been replaced with 'implementation' and 'api'.

     android Gradle Plugin 3.0.0开始,'compile’已经被废弃,所以如果你的Plugin版本升级到了3.0.0及以上,AS中肯定会看到这个提示.

(2)api 与implemention区别

        api功能与compile完全一样,但是与implention有区别。api或compile关键字引用的包对于其他module来说是可见的,而implementation关键字引用的包对于其他module来说是不可见的。

例:有个module,compile了a包,implemention了b包,这个module被引入app module,那么在app中是可以访问a包,无法访问b包

 

四、Maven、MavenCenter、JCenter

(1)Maven仓库一个存放各种工程jar文件、library文件、插件或者任何工程项目的仓库,用Maven来构建项目的时候可能也会用 到Maven仓库里面的依赖库。

     Maven仓库有三种类型:

                本地(local)                 中央(central),在android开发中最常用                 远程(remote)

本地仓库:Maven本地仓库是在计算机上的一个文件夹,它在你第一次运行任何maven命令(这里的maven是构建工具)的时候创建,Maven本地仓库会保存你的工程所有依赖(library jar、plugin jar等)当你运行一次Maven构建工具的时候,Maven会自动下载所有依赖的jar文件到本地仓库中,它避免了每次构建的时候都要引用存放在远程仓库中的依赖。

mavenCentral:中央仓库,这个仓库是由Maven社区管理,由Sonatype公司提供服务,是Apache Maven、SBT和其他构建系统默认的仓库,并且很容易被Apache Ant、Gradle和其他的构建工具使用,需要通过网络访问,通过:http://search.maven.org/#browse 开发者就可以在里面找到自己所需要的代码库。

(2)JCenter是一个由bintray.com维护的Maven仓库,整个仓库的内容:http://jcenter.bintray.com/

        下载依赖jar的时候,出现下载不了,偶尔能下载,但是很慢,使用阿里的镜像仓库:         https://maven.aliyun.com/mvn/view

        在project的build.gradle中添加阿里的Maven地址

buildscript { repositories { maven{ url 'http://maven.aliyun.com/nexus/content/groups/public/'} maven{ url 'https://maven.aliyun.com/repository/public' }//这两个是一样的,写法不一样 mavenCentral() google() jcenter() } dependencies { classpath 'com.android.tools.build:gradle:3.4.0' } } allprojects { repositories { maven{ url 'http://maven.aliyun.com/nexus/content/groups/public/'} google() jcenter() } }

      阿里云提供的其他仓库代理

// jcenter() maven { url 'https://maven.aliyun.com/repository/jcenter' } //google() maven { url 'https://maven.aliyun.com/repository/google' }

(3)发布项目到maven

        发布项目到maven(JCenter)

 

五、buildScript块、allprojects块、根级别三种所属的repositories区别

       buildScript块的repositories主要是为了Gradle脚本自身的执行,获取脚本依赖插件。也就是buildScript是用来加载gradle脚本自身需要使用的资源,可以声明的资源包括依赖项、第三方插件、maven仓库地址等。

       根级别的repositories主要是为了当前项目提供所需依赖包,依赖包可从mavenCentral仓库获得。

       allprojects块的repositories用于多项目构建,为所有项目提供共同所需依赖包。而子项目可以配置自己的repositories以获取自己独需的依赖包。

 

六、统一管理引入版本

       在project的build.gradle中天添加:

ext{ //版本号相关 versionCode=1; versionName='1.0.0' //相关依赖库版本 supportVerson='28.0.0' constraintLayoutVerson='1.1.3' }

     在module中使用:(注意原先是单引号,会报错,改成双引号)

api "com.android.support:appcompat-v7:$rootProject.supportVerson" api "com.android.support.constraint:constraint-layout:$rootProject.constraintLayoutVerson"

七、compileSdkVersion,minSdkVersion,targetSdkVersion还有buildToolsVersion的区别

minSdkVersion

        应用最低兼容的android sdk版本,假如 minSdkVersion 指定为 19,而要引入的一个方法是 API 20 才新增的,这时候在写代码的时候得判断手机的运行版本android.os.build.version.SDK_INT.

 compileSdkVersion

        编译源代码所使用的 API 版本,编译期间使用,并不是真实设备上运行 APK 的 API Version;我们一般使用最新的 SDK 进行编译。如引入support library,最新发布的 Support Library 就需要使用最新的 SDK 编译。使用 Support Library的version为 29.0.0 ,那么compileSdkVersion 就必需至少是 29 (大版本号要一致!)

targetSdkVersion

       android 系统提供前向兼容的主要手段。这是什么意思呢?随着 Android 系统的升级,某个系统的 API 或者模块的行为可能会发生改变,但是为了保证老 APK 的行为还是和以前兼容。只要 APK 的 targetSdkVersion 不变,即使这个 APK 安装在新 Android 系统上,其行为还是保持老的系统上的行为。

buildToolsVersion

      就是构建工具的版本。所谓的构建工具其实就是指我们 sdk 下面的 build-tools 目录

 

八、support-v4与support-v7,support-design冲突

(1)检查依赖冲突

        在Terminal 终端面板里输入以下命令

// XXX表示想打印的module的name gradle XXX:dependencies

依赖报告示例如下:

+--- project :libraryContentLink | \--- com.android.support:support-v4:25.1.0 -> 25.1.1 | +--- com.android.support:support-compat:25.1.1 | | \--- com.android.support:support-annotations:25.1.1 -> 25.3.1 +--- com.lzy.widget:imagepicker:0.5.5 | +--- com.android.support:appcompat-v7:25.1.1 (*) | +--- com.github.chrisbanes.photoview:library:1.2.4 | | \--- com.android.support:support-v4:22.0.0 -> 25.1.1 (*) | \--- com.android.support:recyclerview-v7:25.1.1 (*)

(2)sdk版本高于app的版本

去掉 SDK 中的低版本依赖,使用 SDK 中的新版本(这个过程可以是 Android Studio自动完成,无需改动)如果 App 中不想引用高版本的 V4 V7 包,而 AS 中默认情况下会优先高版本的依赖库,这种情况下怎么办呢?需要手动处理排除依赖 compile('com.facebook.fresco:fresco:0.10.0') { exclude module: 'support-v4' }

 

最新回复(0)