android的入门知识扫盲

已经有很长时间没有去做过Android开发了,最近公司的一个android项目需要进行下整理,然后看过整个项目后觉得整个人都有点不太好了,加上知识的更新迭代,感觉自己所了解的知识已经跟不上android开发组了,所以趁着周末进行了一下恶补,鉴于朋友要求,特意整理了一下文档,供大家查阅 :)

下面主要对一些基础的 术语 进行简单介绍,使大家能快速的了解一些东西。

  • SDK: 这个就不过多解释了,Software Development Kit,咱们做开发的应该都是清楚的。android开发,我们需要在开发机上安装相应的SDK环境。

  • ADT: 由于我之前也是使用Eclipse学习Android的,所以ADT(Android Development Tools)是针对于Eclipse的插件。如果我们使用Eclipse作为主开发工具那么就需要安装插件。

  • Android Studio: 这个工具还这没有使用过,好像是基于IntelliJ IDEA,我个人一般很少使用具有特定针对性的开发工具,想起来以前一个同事,开发机上各种特定的Eclipse安装了好多,每次我们看着都着急。目前Android的开发同事使用的是这个,据说很好使。

  • IntelliJ IDEA: 我个人一般开发使用的是这个工具,主要使用这个和Eclipse

  • Gradle: 项目自动化构建工具,使用一种基于Groovy的特定领域语言(DSL)来声明项目设置,抛弃了基于XML的各种繁琐配置。感觉从 build.xml -> pom.xml -> build.gradle 有点让人应接不暇。如果有朋友感兴趣可以深挖APK的编译过程,来完成手动编译。我尝试使用maven和Gradle对Android项目进行编译,只能感叹,Gradle做的太方便了。

  • jcenter: 据说是最大的构件仓库,是Maven Center的超集,由Bintray公司维护的Maven仓库,主要有很好的CDN来进行加速处理。目前Android Studio默认的仓库配置。

  • Maven Center: 是由sonatype.org维护的Maven仓库,咱们做Java的同学应该是最清楚的了。

关于构件仓库这个的使用,由于公司当前的产品并没有进行单独模块的拆分,所有的项目模块都是在一个Android项目里面,而且Class也并没有按照功能模块进行组件封装、拆分,有点类似最早用C#做Win32程序,一个Form中包含了所有的这个界面逻辑,结果修改维护大家可想而知,所以按照我们的通常的开发方式,按照组件化开发,以达到代码的合理复用性。拆分出来的单个组件需要独立打包、管理,以供其他同学或项目使用,由于在Java的项目开发中,维护了一套Nexus系统,所以关于Android的组件构件仓库,还是想选用Nexus来进行打包上传。

关于aar的一些介绍

aar全名为Android Archive Library,通过名称可以简单的理解下,就是Android提供的类库,类似我们常见的DLL、Jar等。Android不是用Java语言开发的么?打包怎么也应该是Jar,怎么是aar呢? 这个其实就是要说下这两个的区别了。

  • jar: jar是我们在java项目开发中常使用的一种组件包,以ZIP文件为基础,添加了一些自己的文件说明,然后将.java源码文件编译为.class后进行打包,可以在别的项目中进行引用使用。
  • aar: android基于ZIP提供的一种扩展,丰富了jar的文件内容格式,因为我们在android的开发中,一些功能并不是纯的java代码,可能还会有一些图片、布局文件等其他资源等需要一起发布。所以Android就提供了可以将一个Andorid项目所有的资源打包为一个.aar文件,可以被别的项目来进行引用使用。
    aar File Format

举个小栗子,比如轮播图功能,我们如果想把轮播图的逻辑抽离为一个单独的模块,然后在以后别的项目或者别的模块中想直接进行使用,那么就可以考虑将轮播图的相关代码、资源等打包为一个.aar文件。

在项目中使用aar时,需要注意资源的覆盖问题,所以在定义资源时,要添加上模块标识进行逻辑区分。

apk项目与aar项目的差异

首先,生成的文件肯定是不一样的,虽然都是相同的资源数据。因为使用场景不一样,所以后缀也是不一样的。

其次,在项目的属性中,好像是aar项目定义为: android.library=true,在Gradle中定义为: apply plugin: 'com.android.library',apk项目在Gradle中定义为: apply plugin: 'com.android.application'。所以我们可以通过修改该属性来进行项目定义。备注:library项目中Gradle是没有applicationId值的。

使用Gradle来构建Android项目的一些说明

当我们使用工具创建一个Gradle项目后,将会获得如下目录,我们主要关注红框的两个build.gradle文件:
android project

build.gradle文件在不同层级的文件夹中,也就具有了继承上层配置的关系。比如图中app/build.gradle 就可以继承 build.gradle的一些配置项。

build.gradle

同学们使用过maven,应该对于这种配置项的内容,一眼就能推测出来是做什么用的了,比如:

  1. repositories: 是依赖仓库的配置,其中的jcenter()就是指我们前面定义中说的jcenter仓库。可以通过mavenCentral()mavenLocal()定义maven的仓库信息。还可以通过maven { url 'xxxx'}定义自己私有的仓库地址。

  2. dependencies: 是依赖组件的配置,可以使用compile groupID:artifactId:version@extcompile group: '', module: '', version: ''来进行引用。也可以使用compile fileTree(dir: '', exclude: ['xxx-*.jar'], include: '*.jar')进行目录文件引用。使用compile files('xxx.jar')进行jar文件引用。也可以使用compile project(path: ':xxx')进行项目引用。 或者使用compile name:'xxxx', ext: 'aar'来使用。或者使用classpath ''来进行指定。

  3. allprojects: 这个就是标明,所有的项目公用的配置信息。

build.gradle

  1. apply plugin: ‘xx’: 指定使用的插件。com.android.application表示是个.apk的项目,如果是com.android.library表示输出为.aar

  2. android { }: 是android项目的一些配置。

Gradle 版本升级的问题

由于我个人使用的IDEA版本较低,所以在自动生成的Android项目中使用的Gradle版本较低,就想着给升下级,结果出现了一些意料之中的问题。

  • build.gradle中com.android.tools.build:gradle的版本问题:
    我们可以从官网Android Plugin for Gradle Release Notes看到对应的关系,如下图
    gradle插件对应关系
    修改完后要记得配置IDE的Gradle版本为相应的,也要配置环境变量GRADLE_HOME=xxx

  • 在2.2版本编译正常,升级到3.5之后编译提示Java Home问题,或者 Java.exe问题
    我出现这个问题的原因是,我使用的是32位方式打开的IDEA,JAVA_HOME是64位的JDK,结果就出现这个问题,使用64位方式打开一切OK,可以正常编译。
    选择64位打开IDEA