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

Android简介

2017-10-27 17:21 169 查看
参考:https://zh.wikipedia.org/wiki/Android#.E5.88.86.E6.94.AF.E5.B9.B3.E5.8F.B0

《第一行代码(第二版)》

Android的前世今生

中文名一般称为安卓,由Andy Rubin领导的团队基于Linux内核所开发的操作系统,目前世界上(截止至2017年)占有率最高的操作系统。系统分支有Android Wear、Android TV、Android Auto。

系统设计



从上往下依次是:Linux内核层、系统运行库层、应用框架层、应用层

1. 应用层:Android应用的开发都在这一层,系统自带的系统级程序,如闹钟、日历也属于这一层级

2. 框架层:为上层提供构建程序时需要用的各种API接口

3. 系统运行库层:这一层主要用C/C++为Android系统提供各种特性支持。处于这一层的还有Android运行时库,提供开发者可以使用Java编写Android的支持。Android运行时库还包含了Dalvik虚拟机(Android L后改为ART),它使得每一个Android应用都能运行在独立的进程当中,并且拥有一个自己的Dalvik虚拟机实例。相较于JVM,DVM是专门为移动设备定制的,对嵌入式设备的内存、CPU性能有限等情况做了优化处理。

4. Linux内核层:提供各种底层硬件的驱动,如我们常说的声卡、网卡等等。

开发环境的介绍

Android诞生之初,没有专门的IDE,所以大多数人选择了万能的“Eclipse”。后由Google亲力亲为,开发了专门用于开发Andoird程序的Android Studio,所以现在市面上,更推荐用它进行Android程序的开发工作。

注:网络上很多关于这两个IDE的安装以及使用教程,这里不多介绍

Eclipse项目目录结构介绍:



src

存放的项目的Java代码

gen

buildConfig:应用是否可以debug

R:保存项目中使用的资源id

Android.jar

导入这个包后,应用才可以使用Android的api

libs:

存放第三方jar包

assets

资源文件夹,存放视频或者音乐等较大的文件

bin

存放应用打包编译后的文件

res

资源文件夹,在这个文件夹中的所有资源,都会有资源id,读取时通过资源id就可以读取

layout

布局文件夹,保存布局文件,Android中所有布局文件都是xmL文件

menu

菜单配置文件夹,保存菜单的配置文件,决定菜单的样式

values

strings:字符串资源文件,用来定义字符串资源的

dimens:长度资源文件,用来定义长度资源

style:样式和主题资源文件

AndroidManifest

清单文件,声明该程序所用到的所有四大组建和应用权限声明,这个文件经常用到,日后再做详细说明。

清单文件中的内容说明:

package:应用在系统中的唯一识别,相当于身份识别ID(唯一),跟代码包中的包名虽然名字相同,但是没有任何联系,可以与包名名字不相同。

versionCode:应用的版本号

具有以下子节点的activity就是入口的activity(所谓入口,相当于JavaSE中的main()):

<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>


Android Studio项目目录结构介绍



.gradle和.idea

都是Android Studio自动生成的一些文件,不要去手动编辑

app

存放Java代码、资源文件,后续的开发工作基本实在这个目录进行

build

主要包含了一些在编译时自动生成的文件

gradle

这个目录下包含了gradle wrapper的配置文件,使用gradle wrpper的方式不需要提前将gradle下载好,而是会自动根据本地的缓存情况决定是否需要联网下载gradle。Android Studio默认没有启用gradle wrapper的方式,如果需要打开,可以点击Android Studio导航栏 → File → Settings → Build,Execution,Deployment → Gradle,进行配置更改

.gitignore

将指定的目录或文件排除在版本控制工具之外

build.gradle

项目全局的gradle构建脚本,通常这个文件中的内容是不需要修改的。

gradle.properties

全局的gradle配置文件,在这里配置属性将会影响到项目中的所有gradle编译脚本

gradlew和gradlew.bat

这两个文件是用来在命令行界面中执行gradle命令的,其中gradlew是在Linux或Mac系统中使用的,gradlew.bat则是在Windows使用

xxx.iml

自动生成的文件,主要目的是标示这是一个IntelliJ IDEA项目(Android Studio基于IntelliJ IDEA开发),不需理会

local.properties

用于指定本机中的Android SDK路径,通常是自动生成的,无需修改。除非你本机中的Android SDK位置发生了变化,那么就将这个文件中的路径修改成最新的位置即可。

settings.gradle

用于指定项目中所有引入的模块。本项目就只有一个app模块,因此该文件也就引入了app这一个模块。通常情况下模块的引入都是自动完成,需要我们手动去修改这个文件的场景比较少。

除了app目录之外,大多数的文件和目录都是自动生成的,不用太理睬,app目录才是我们的工作重点:

app目录



build

和外层的build相似,包含一些在编译时自动生成的文件,不过内容更多更复杂,无需太关心

libs

图片中没有此目录,但是如果你的项目中用到了第三方的jar包,就需要把jar包放在此目录下,再去gradle中进行构建路径

androidTest

编写AndroidTest测试用例的,可以对项目进行一些自动化测试。

java

编写代码的地方

res

资源文件夹,同eclipse中介绍的内容

AndroidManifest.xml

清单文件,同eclipse中介绍的内容

test

编写Unit Test测试用例的,是对项目进行自动化测试的另一种方式。

.gitignore

将app模块内的指定的目录或者文件排除在版本控制之外,作用和外层的.gitignore文件类似。

app.iml

IntelliJ IDEA自动生成的文件,不需太过关心。

build.gradle

app模块的gradle构建脚本,这个文件中会制定很多项目构建相关的配置,稍后会详细分析gradle构建脚本中的具体内容。

proguard-rules.pro

指定代码的混淆规则,对于什么是混淆,就是将项目打包成apk文件后,如果不希望其他别有用心的人轻松地破解你的代码,就要用到混淆。

详解资源文件夹



drawable

存放图片、animation、selector

mipmap

主要存放图片

values

存放字符串、样式、颜色等配置

layout

放置布局文件的

之所以有这么多mipmap开头的文件夹,主要是考虑Anroid的碎片化问题,适配各种屏幕的设备,drawble同理~~~当程序运行的时候,会自动去根据设备的分辨率智能地去选择加载哪个文件夹。

build.gradle文件

Android Studio采用的是Gradle构建项目的。它是一种非常先进的项目构建工具,使用了一种基于Groovy的领域特定语言(DSL)来声明项目设置,摒弃了传统基于XML的各种繁琐配置。

通过前面的内容可知,项目中有两个build.gradle文件,一个是在最外层的目录下,另一个实在app目录下。这两个文件对构建Android Studio项目都起到了至关重要的作用,下面我们就来对这两个文件中内容进行详细的分析。

最外层的build.gradle文件:

// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.3.1'

// 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
}


以上的代码是自动生成:

以上有两处repositories的闭包中都声明了jcenter()这行配置,那么这个jcenter是什么意思呢?其实它是一个代码托管仓库,很多Android开源项目都会选择将代码托管到jcenter上,声明了这行配置之后,我们就可以在项目中轻松引用任何jcenter上的开源项目了。

dependencies闭包中使用classpath声明了一个Gradle插件。因为Gradle并不是专门为构建Android项目而开发的,Java、C++等很多种项目都可以使用Gradle来构建。因此如果我们要想使用它来构建Android项目,则需要声明
com.android.tools.build:gradle:2.3.1
这个插件,后面的数字指的是版本号。

通常情况下,并不需要修改上面这个文件,除非你想添加一些全局的项目构建配置。

app目录下的bulid.gradle文件:

apply plugin: 'com.android.application'

android {
compileSdkVersion 25
buildToolsVersion "26.0.1"
defaultConfig {
applicationId "com.example.treestructuredemo"
minSdkVersion 17
targetSdkVersion 25
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}

dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
compile 'com.android.support:appcompat-v7:25.3.1'
compile 'com.android.support.constraint:constraint-layout:1.0.2'
testCompile 'junit:junit:4.12'
}


第一行应用了一个插件,一般有两种值可选:
com.android.application
表示这是一个应用程序模块,
com.android.library
表示这是一个库模块。应用程序模块和库模块的最大区别在于,一个是可以直接运行的,一个只能作为代码库依附于别的应用程序模块来运行。

接下来是一个大的android闭包,这里我们可以配置项目构建的各种属性。其中,
compileSdkVersion
用于指定项目的编译版本,这里指定成25表示使用Android7.1.1系统的SDK编译。
buildToolsVersion
用于指定项目构建工具的版本,如果有要更新的版本时,Android Studio会进行提示。

android闭包中又嵌套了一个defaultConfig闭包,defaultConfig闭包中可以对项目的更多细节进行配置。其中
applicationId
用于指定项目的报名,前面我们在创建项目的时候其实已经指定过包名了,若你想在后面对其进行修改,那么就是在这里修改的。
minSdkVersion
用于指定项目最低兼容的Android系统版本,这里指定为17表示最低兼容到Android 4.2系统。
targetSdkVersion
指定的值表示你在该目标版本上已经做了充分的测试,系统将会为你的应用程序启动一些最新的功能和特性。比如说Android 6.0系统中引入了运行时权限这个功能,如果你将
targetSdkVersion
指定成23或者更高,那么系统就会为你的程序启用运行时权限功能,而如果你将
targetSdkVersion
指定成22,那么就说明你的程序最高只在Android 5.1系统上做过充分的测试,Android 6.0系统中引入的新功能自然就不会启动了。
versionCode
用于指定项目的版本号,
versionName
用于指定项目的版本名,这两个属性在生成安装文件的时候非常重要。

接下来看看那buildTypes闭包。buildTypes闭包中用于指定生成安装文件的相关配置,通常只会有两个子闭包,一个是debug,一个是release。debug闭包用于指定生成测试版安装文件的配置,release闭包拥有普指定生成正式版安装文件的配置。另外debug闭包是可以忽略不写的,因此我们看到上面的代码中就只有一个release闭包。release闭包中,
minifyEnabled
用于指定是否对项目的代码进行混淆,true表示混淆,false表示不混淆。
proguardFiles
用于指定混淆时使用的规则文件,这里指定了两个文件,第一个proguard-android.txt是在Android SDK目录下的,里面是所有项目通用的混淆规则,第二个proguard-rules.pro是在当前项目的根目录下的,里面可以编写当前项目特有的混淆规则。需要注意的是,通过Android Studio直接运行项目生成的都是测试版安装文件。

dependencies闭包,它可以指定当前项目所有的依赖关系。通常Android Studio项目一共有三种依赖方式:本地依赖、库依赖和远程依赖。本地依赖可以针对本地的jar包或者目录添加依赖关系,库依赖可以针对项目中的库模块添加依赖关系,远程依赖则可以对jcenter库上的开源项目添加依赖关系。观察一下dependencies闭包中的配置,第一行的compile fileTree就是一个本地依赖声明,它表示将libs目录下所有.jar后缀的文件都添加到项目的构建路径当中。而第三行的compile则是远程依赖声明,
com.android.support:appcompat-v7:25.3.1
就是一个标准的远程依赖库格式,其中
com.android.support
是域名部分,用于和其他公司的库做区分;
appcompat-v7
是组名称,用于和同一个公司中不同的库做区分;
25.3.1
是版本号,用于和同一个库不同的版本做区分。加上这句声明后,Gradle在构建项目时会首先检查一下本地是否已经有这个库的缓存,如果没有的话则会去自动联网下载,然后再添加到项目的构建路径当中。至于库依赖声明这里没有用到,它的基本格式是
compile project
后面加上要依赖的库名称,比如说有一个库模块的名字叫helper,那么添加这个库的依赖关系只需要加入
compile project(':helper')
这句声明即可。另外剩下的一句
testCompile
是用于声明测试用例库的,这个暂时用不到,忽略

Android日志工具Logcat的使用

Android中的日志工具类Logcat,作用类似于JavaSE中的System.out.println(),有以下方法:

日志信息总共分为5个等级

verbose:打印最为烦琐的,意义最小的日志信息。级别最低

debug:打印调试阶段的信息,比verbose高一级别

info:打印比较重要的数据,可以帮你分析用户行为。比debug高一级

warn:打印一些警告信息,提示程序在这个地方可能会有潜在的风险,最好去修复一下这些出现警告的地方。比info高一级

error:打印程序中的错误信息,出现后,应尽快去修复。级别比warn高

定义过滤器方便查看



不用System.out.println()是因为,日志打印不可控制、打印时间无法确定、不能添加过滤器、日志没有级别区分……

System.out.print输出的日志级别是info,tag是System.out

Android提供的日志输出api

Log.v(TAG, "加油吧,童鞋们");
Log.d(TAG, "加油吧,童鞋们");
Log.i(TAG, "加油吧,童鞋们");
Log.w(TAG, "加油吧,童鞋们");
Log.e(TAG, "加油吧,童鞋们");


如果使用过滤器加日志级别控制还不能满足需求,可以进一步使用关键字过滤:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息