1.Android目录结构分析
.gradle Android studio自动生成的文件
.idea Android studio自动生成的文件
app 项目中的代码、资源;
gradle 编译时自动生成的文件;
.gitignore 包含gradle.wrapper的配置文件,使用gradle.wrapper的方式不需要提前将gradle下载好,会自动根据本地缓存情况决定是否联网下载gradle,Android studio默认没有启用gradle.wrapper的方式,如果需要打开,可以打开菜单栏File--settings--Build--Execution--Deployment--Gradle进行配置更改;
build.gradle 项目全局的gradle构建脚本,通常这个内容不需要修改;
gradle.properties 全局的gradle配置文件,在这里配置的属性将会影响到项目中所有的gradle编译脚本;
gradlew 用来在命令行界面执行gradle命令,在Linux或Mac系统中使用;
gradlew.bat 用来在命令行界面执行gradle命令,在Windows系统中使用;
HelloWorld.iml .iml是所有的IntelliJ IDEA项目都会自动生成的一个文件,用于标识这是一个IntelliJ IDEA项目;
local.properties 用于指定本机中Android SDK路径,通常内容都会自动生成;
settings.gradle 指定项目中所有引入的模块,通常自动完成;
2.app目录结构分析
build 包含在编译时自动产生的文件;
libs 存放第三方的jar包,放在这个目录下的jar包会自动添加到构建路径里面;
androidTest 用来编写Android Test测试用例,可以对项目进行一些自动化测试;
java 存放java代码的地方
res 项目中使用道德所有图片、布局、字符串等资源都放在这个目录下面;图片放在drawable目录,布局放在layout目录,字符串放在values目录;
AndroidManifest.xml 整个Android项目的配置文件,程序中定义的四大组件都需要在这里注册,可以在这个文件中添加权限声明;
test 用来编写Unit Test测试用例,对项目进行自动化测试的另一种方法;
.gitgnore 将app模块内的指定的目录或文件排除在版本控制之外;
app.iml IntelliJ IDEA自动生成;
build.gradle app模块的gradle构建脚本,指定很多项目构建相关的配置;
proguard-rules.pro 指定项目代码混淆规则;
3.分析项目运行起来的过程
3.1在AndroidManifest.xml注册Activity,在intent-filter李米娜定义两行代码:
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
表示当前Activity是这个项目的主活动,应用上第一个打开的活动;
3.2 HelloWorldActivity是继承自AppCompatActivity,这是一种向下兼容的Activity,可以将Activity在各个系统版本中增加的特性和功能最低兼容到Android2.1.
Activity是Android系统提供的一个活动基类,我们项目中所有的活动都必须继承它或者继承它的子类才能拥有活动的特性(AppCompatActivity是Activity的子类);
4.res目录结构解析
4.1所有的drawable开头的文件夹都是放图片的;
4.2所有的mipmap开头的文件夹都是放应用图标的;
4.3所有以values开头的文件夹都是用来放字符串、样式、颜色等配置的;
4.4layout文件夹是用来存放布局文件的;
4.5在AndroidManifest.xml文件中找到<application>标签,在application标签中,android:icon设置用用图标,android:label设置应用名称;
5.详解build.gradle文件
android studio 采用Gradle来构建项目;
Gradle是一个非常先进的项目构建工具,它使用了一种基于Groovy的领域特定语言(DSL)来声明项目设置,摒弃了传统基于XML(如Ant和Maven)的各种繁琐配置;
build.gradle文件在项目中有两个,一个是项目的build.gradle文件,一个是app的build.gradle文件;
项目build.gradle:
buildscript{
respositories{
jcenter()
}
dependencies{
classpath 'com.android.tools.build:gradle:2.2.0'
}
}
allprojects{
repositories{
jcenter{}
}
}
两处repositories闭包中都声明了jcenter()这行配置,jcenter()是一个代码托管仓库,很多Android开源项目都会选择将代码托管到jcenter()上,声明这行配置之后,我们可以在项目中轻松引用任何jcenter上的开源项目;
dependencies闭包中使用classpath声明了一个Gradle插件。因为Gradle并不是专门为构建Android项目而开发的,Java、C++等很多项目都可以使用Gradle来构建。因此,我们要想使用Gradle构建Android项目,需要声明'com.android.tools.build:gradle:2.2.0'这个插件;
通常情况下,我们不需要修改项目build.gradle文件的内容,除非我们需要添加一些全局的项目构建配置;
app中的build.gradle:
apply plugin: 'com.android.application'
android{
compileSdkVersion 24
buildToolsVersion "24.0.2"
defaultConfit{
applicationId "com.example.helloworld"
minSdkVersion 15
targetSdkVersion 24
versionCode 1
versionName "1.0"
}
buildTypes{
release{
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'),
'proguard-rules.pro'
}
}
}
dependedcies{
compile fileTree(dir:'libs',include:['*.jar'])
compile 'com.android.support:appcompat-v7:24.2.1'
testComplie 'junit:junit:4.12'
}
第一行应用了一个插件,一般有两种值可以选择:
com.android.application表示这是一个应用程序模块,com.android.library表示这是一个库模块;
应用程序模块和库模块最大区别就是:一个是可以直接运行的,一个只能作为代码库依附在应用程序模块来运行;
android闭包,在这个闭包中,我们可以配置项目构建的各种属性;
compileSdkVersion用于指定项目的编译版本,这里的24表示使用Android7.0系统的SDK编译;
buildToolsVersion用于指定项目构建的版本;
在android闭包中又嵌套了一个defaultConfig闭包,defaultConfig闭包可以对项目的更多细节进行配置;
applicationId用于指定项目的包名;
minSdkVersion用于指定项目的最低兼容版本;15表示最低兼容Android4.0版本;
targetSdkVersion指定的值表示你在该目标版本上已经做过了充分的测试,系统将会为你的应用程序启用一些最新的功能和特性;比如Android6.0引入的运行时权限功能;
versionCode用于指定项目的版本号;
versionName用于指定项目的版本名;
versionCode和versionName在生成安装文件的时候非常重要;
buildTpyes闭包用于指定生成安装文件的相关配置,通常只会有两个子闭包,一个是debug,一个是release。
debug闭包用于指定生成测试版安装文件的配置;debug闭包是可以忽略不写的;
release闭包用于指定生成正式版安装文件的配置;
release闭包具体内容:
minifyEnabled用于指定是否对项目的代码进行混淆,true表示混淆,false表示不混淆;
proguardFiles用于指定混淆文件使用的混淆规则,这里指定了两个文件,第一个proguard-android.txt实在Android SDK目录下,里面是所有项目通用的的混淆规则;第二个proguard-rules.pro是在当前项目的根目录下的,里面可以编写当前项目特有的混淆规则。需要注意,通过AS直接运行项目生成的都是测试版安装文件;
dependencies闭包,他可以指定当前项目所有的依赖关系。通常AS项目一共有3种依赖方式:本地依赖、库依赖、远程依赖。
本地依赖:可以对本地的jar包或目录添加依赖关系;
库依赖:可以对项目中的库模块添加依赖关系;
远程依赖:可以对jenter库上的开源项目添加依赖关系;
第一行的compile fileTree就是一个本地以来声明;
第二行的conpile则是远程依赖声明,com.android.support:appcompat-v7:24.2.1就是一个标准的远程依赖库格式;加上这句声明,Gradle在构建项目时会自动检查本地是否已经有这个库的缓存,如果没有的话,则会自动联网去下载,然后添加到项目的构建路径当中;
其中com.android.support是域名部分,用于和其他公司的库做区分;appcompat-v7是组名称,用于和同一个公司中的不同库做区分;24.2.1是版本号,用于和同一个库的不同版本做区分;
库依赖声明上面没有用到,基本格式为compile projext后面加上要依赖的库的名称,如helper是一个库模块,compile project(':helper');
剩下的testCompile用于声明测试用例库的;
6.日志工具的使用
6.1使用android的日志工具Log
android的日志工具类是Log(android.util.Log),这个类中有5个方法供我们使用;
Log.v()打印最为琐碎,意义最小的日志信息,对应级别为verbose,是android日志里面级别最低的一种;
Log.d()打印调试信息,这些信息对你调试程序和分析问题应该是有帮助的,对应的级别为debug,比verbose高一级;
Log.i()打印比较重要的数据,对应级别为info,比debug高一级;
Log.w()打印警告信息,提示程序这个地方可能会有潜在的风险,对应级别为warn,比info高一级;
Log.e()打印程序中的错误信息,比如程序进入到catch语句中,当有错误信息打印出的时候,一般都代表你的程序出现严重的问题了,必须尽快修复,对应级别为error,比warn高一级;
不建议使用System.out.printIn()原因:
日志打印不可控制;
打印时间无法确定;
不能添加过滤器;
日志没有级别区分;
logcat可以添加过滤器:
目前只有三种过滤器:
Show only selected application只显示当前选中程序的日志;
Firebase是谷歌提供的一个分析工具;
No Filters相当于没有过滤器;
我们也可以自定义过滤器;
点击Edit Filter Configuration会弹出一个过滤器配置界面,给他起名为data,比对名为data的tag进行过滤;
logcat里面的日志级别控制,分为5个级别:
Vervose
Debug
Info
Warn
Error
logcat还有关键字过滤;