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
《第一行代码(第二版)》
![](https://i.imgur.com/XzNkCHJ.png)
从上往下依次是:Linux内核层、系统运行库层、应用框架层、应用层
1. 应用层:Android应用的开发都在这一层,系统自带的系统级程序,如闹钟、日历也属于这一层级
2. 框架层:为上层提供构建程序时需要用的各种API接口
3. 系统运行库层:这一层主要用C/C++为Android系统提供各种特性支持。处于这一层的还有Android运行时库,提供开发者可以使用Java编写Android的支持。Android运行时库还包含了Dalvik虚拟机(Android L后改为ART),它使得每一个Android应用都能运行在独立的进程当中,并且拥有一个自己的Dalvik虚拟机实例。相较于JVM,DVM是专门为移动设备定制的,对嵌入式设备的内存、CPU性能有限等情况做了优化处理。
4. Linux内核层:提供各种底层硬件的驱动,如我们常说的声卡、网卡等等。
注:网络上很多关于这两个IDE的安装以及使用教程,这里不多介绍
![](https://i.imgur.com/cprGjTp.png)
R:保存项目中使用的资源id
dimens:长度资源文件,用来定义长度资源
style:样式和主题资源文件
清单文件中的内容说明:
package:应用在系统中的唯一识别,相当于身份识别ID(唯一),跟代码包中的包名虽然名字相同,但是没有任何联系,可以与包名名字不相同。
versionCode:应用的版本号
具有以下子节点的activity就是入口的activity(所谓入口,相当于JavaSE中的main()):
![](https://i.imgur.com/jKwEe7W.png)
除了app目录之外,大多数的文件和目录都是自动生成的,不用太理睬,app目录才是我们的工作重点:
![](https://i.imgur.com/2MHfdcb.png)
![](https://i.imgur.com/5CqFGVr.png)
之所以有这么多mipmap开头的文件夹,主要是考虑Anroid的碎片化问题,适配各种屏幕的设备,drawble同理~~~当程序运行的时候,会自动去根据设备的分辨率智能地去选择加载哪个文件夹。
通过前面的内容可知,项目中有两个build.gradle文件,一个是在最外层的目录下,另一个实在app目录下。这两个文件对构建Android Studio项目都起到了至关重要的作用,下面我们就来对这两个文件中内容进行详细的分析。
最外层的build.gradle文件:
以上的代码是自动生成:
以上有两处repositories的闭包中都声明了jcenter()这行配置,那么这个jcenter是什么意思呢?其实它是一个代码托管仓库,很多Android开源项目都会选择将代码托管到jcenter上,声明了这行配置之后,我们就可以在项目中轻松引用任何jcenter上的开源项目了。
dependencies闭包中使用classpath声明了一个Gradle插件。因为Gradle并不是专门为构建Android项目而开发的,Java、C++等很多种项目都可以使用Gradle来构建。因此如果我们要想使用它来构建Android项目,则需要声明
通常情况下,并不需要修改上面这个文件,除非你想添加一些全局的项目构建配置。
app目录下的bulid.gradle文件:
第一行应用了一个插件,一般有两种值可选:
接下来是一个大的android闭包,这里我们可以配置项目构建的各种属性。其中,
android闭包中又嵌套了一个defaultConfig闭包,defaultConfig闭包中可以对项目的更多细节进行配置。其中
接下来看看那buildTypes闭包。buildTypes闭包中用于指定生成安装文件的相关配置,通常只会有两个子闭包,一个是debug,一个是release。debug闭包用于指定生成测试版安装文件的配置,release闭包拥有普指定生成正式版安装文件的配置。另外debug闭包是可以忽略不写的,因此我们看到上面的代码中就只有一个release闭包。release闭包中,
dependencies闭包,它可以指定当前项目所有的依赖关系。通常Android Studio项目一共有三种依赖方式:本地依赖、库依赖和远程依赖。本地依赖可以针对本地的jar包或者目录添加依赖关系,库依赖可以针对项目中的库模块添加依赖关系,远程依赖则可以对jcenter库上的开源项目添加依赖关系。观察一下dependencies闭包中的配置,第一行的compile fileTree就是一个本地依赖声明,它表示将libs目录下所有.jar后缀的文件都添加到项目的构建路径当中。而第三行的compile则是远程依赖声明,
日志信息总共分为5个等级
verbose:打印最为烦琐的,意义最小的日志信息。级别最低
debug:打印调试阶段的信息,比verbose高一级别
info:打印比较重要的数据,可以帮你分析用户行为。比debug高一级
warn:打印一些警告信息,提示程序在这个地方可能会有潜在的风险,最好去修复一下这些出现警告的地方。比info高一级
error:打印程序中的错误信息,出现后,应尽快去修复。级别比warn高
定义过滤器方便查看
![](https://i.imgur.com/rgw1EMu.png)
不用System.out.println()是因为,日志打印不可控制、打印时间无法确定、不能添加过滤器、日志没有级别区分……
System.out.print输出的日志级别是info,tag是System.out
Android提供的日志输出api
如果使用过滤器加日志级别控制还不能满足需求,可以进一步使用关键字过滤:
《第一行代码(第二版)》
Android的前世今生
中文名一般称为安卓,由Andy Rubin领导的团队基于Linux内核所开发的操作系统,目前世界上(截止至2017年)占有率最高的操作系统。系统分支有Android Wear、Android TV、Android Auto。系统设计
![](https://i.imgur.com/XzNkCHJ.png)
从上往下依次是: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项目目录结构介绍:
![](https://i.imgur.com/cprGjTp.png)
src
存放的项目的Java代码gen
buildConfig:应用是否可以debugR:保存项目中使用的资源id
Android.jar
导入这个包后,应用才可以使用Android的apilibs:
存放第三方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项目目录结构介绍
![](https://i.imgur.com/jKwEe7W.png)
.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目录
![](https://i.imgur.com/2MHfdcb.png)
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文件后,如果不希望其他别有用心的人轻松地破解你的代码,就要用到混淆。详解资源文件夹
![](https://i.imgur.com/5CqFGVr.png)
drawable
存放图片、animation、selectormipmap
主要存放图片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高
定义过滤器方便查看
![](https://i.imgur.com/rgw1EMu.png)
不用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, "加油吧,童鞋们");
如果使用过滤器加日志级别控制还不能满足需求,可以进一步使用关键字过滤:
![](https://i.imgur.com/v9DIINv.png)
相关文章推荐
- android 词典 简介
- Android android:configChanges的简介
- Android中Toast的用法简介
- Android Web Service--SOAP简介(三)
- 【lint】Android Lint简介
- android之ConnectivityManager简介,网络连接状态
- 移动互联网应用技术架构简介-Android
- android之PackageManager简介
- android mtp简介
- Android Resource Types之Layout简介
- android 动画interpolator简介
- Android动画学习(一)——Android动画系统框架简介
- android学习日记22--Animation动画简介
- Android 控件架构简介&ListView第一部分
- Android网络通信库Volley简介
- Android gradle简介
- Android 内存泄露简介、典型情景及检测解决
- Android Fragment(一)---简介
- Android开发环境配置简介
- 六款值得推荐的android(安卓)开源框架简介