Android简介

来源:互联网 发布:vue.js nexttick用法 编辑:程序博客网 时间:2024/06/10 20:33

参考: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。

系统设计

Android系统架构设计

从上往下依次是: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文件

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

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, "加油吧,童鞋们");
  • 如果使用过滤器加日志级别控制还不能满足需求,可以进一步使用关键字过滤:

原创粉丝点击