创建项目时需要注意与明确

1、project模式的项目结构


1. gradle和idea
这两个目录下放置的都是 Android studio自动生成的一些文件,我们]无须关心,也不要去手
动编辑。
2. app
项目中的代码、资源等内容几乎都是放置在这个目录下的,我们后面的开「发工作也基本都是
在这个目录下进行的,待会儿还会对这个目录单独展开进行讲解
3. build
这个目录你也不需要过多关心,它主要包含了一些在编译时自动生成的文件
4. gradle
这个目录下包含了 gradle wrapper的配置文件,使用 gradle wrapper的方式不需要提前将 gradle
下载好,而是会自动根据本地的缓存情况决定是否需要联网下载 gradle。 Android studio默认没有
启用 gradle wrapper的方式,如果需要打开,可以点击 Android studio导航栏→ ile SettingsBuild,
Execution, Deployment+Gradle,进行配置更改。
5. gitignore
这个文件是用来将指定的目录或文件排除在版衣控制之外的,关于版木控制我们将在第5章
中开始正式的学习
6. build gradle
这是项目全局的 gradle构建脚本,通常这个文件中的内容是不需要修改的。稍后我们将会详
细分析 gradle构建脚本中的具体内容
7. gradle. properties
这个文件是全局的 gradle配置文件,在这里配置的属性将会影响到项目中所有的 gradle编译
脚本
8. gradlew fA gradlew bat
这两个文件是用来在命令行界面中执行 gradle命令的,其中 gradlew是在 Linux或Mac系统
中使用的, gradlew bat是在 Windows系统中使用的
9. Helloworld. iml
iml文件是所有 IntelliJ IDea项目都会自动生成的一个文件( Android studio是基于 Intellij
IDEA开发的),用于标识这是一个 Intellij idea项目,我们不需要修改这个文件中的任何内容。
10.local properties
这个文件用于指定本机中的 Android sdK路径,通常内容都是自动生成的,我们并不需要修改

除非你本机中的 Android sdK位置发生了变化,那么就将这个文件中的路径改成新的位置即可。

11. settings. gradle

这个文件用于指定项目中所有引入的模块。由于 Hello world项目中就只有一个app模块,因
此该文件中也就只引入了app这一个模块。通常情况下模块的引入都是自动完成的,需要我们手

动去修改这个文件的场景可能比较少

现在整个项目的外层目录结构已经介绍完了。你会发现,除了app口录之外,大多数的文件
和目录都是自动生成的,我们并不需要进行修改。想必你已经猜到了,ap目录下的内容才是我

们以后的工作重点,展开之后结构。


那么下面我们就来对app目录下的内容进行更为详细的分析
1 build
这个目录和外层的buid目录类似,主要也是包含了一些在编译时自动生成的文件,不过它
里面的内容会更多更杂,我们不需要过多关心
2. ibs
如果你的项目中使用到了第三方jar包,就需要把这些janr包都放在 libs目录下,放在这个目
录下的jar包都会被自动添加到构建路径里去
3. androidTest
此处是用来编写 Android test测试用例的,可以对项目进行一些自动化测试。
4.java
毫无疑问,java目录是放置我们所有Jaa代码的地方,展开该目录,你将看到我们刚才创建
的 Hello worldActivity文件就在里面
5. res
这个目录下的内容就有点多了。简单点说,就是你在项目中使用到的所有图片、布局、字符
串等资源都要存放在这个目录下。当然这个目录下还有很多子目录,图片放在 drawable目录下,布

局放在 layout I目录下,字符串放在 values目录下,所以你不用担心会把整个res目录弄得乱糟糟的。

6. Androidmanifestxml
这是你整个 Android项目的配置文件,你在程序中定义的所有四大组件都需要在这个文件里
注册,另外还可以在这个文件中给应用程序添加权限声明。由于这个文件以后会经常用到,我们
用到的时候再做详细说明。
7 test
此处是用来编写 Unit Test测试用例的,是对项目进行自动化测试的另一种方式。
8.. gitignore
这个文件用于将app模块内的指定的目录或文件排除在版本控制之外,作用和外层
的 gitignore文件类似。
9. app. iml
IntelliJ IDEA项目自动生成的文件,我们不需要关心或修改这个文件中的内容。
10. build gradle
这是app模块的 gradle构建脚本,这个文件中会指定很多项目构建相关的配置,我们稍后将
会详细分析 gradle构建脚本中的具体内容。
11. proguard-rules pro
这个文件用于指定项目代码的混淆规则,当代码开发完成后打成安装包文件,如果不希望代
码被别人破解,通常会将代码进行混淆,从而让破解者难以阅读
这样整个项目的目录结构就都介绍完了,如果你还不能完全理解的话也很正常,毕竞里面有
太多的东西你都还没接触过。不过不用担心,这并不会影响到你后面的学习。等你学完整本书再

回来看这个目录结构图时,你会觉得特别地清晰和简单。

前面这些都是借鉴,下面这些是觉得有必要复习一下

项目如何运行过起来的,首先打开AndroidManifest.xml

找到以下代码:

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

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

这段代码表示MainActivity这个活动的注册,没有在这个文件里注册是不能使用的,其中intent-filter非常重要

<action and roid: name=android. intent. action MAIN"/>

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

这两行表示Mainactivity是这个项目的主要活动,点击这个应用的图标,首先启动这个活动

下面来分析他的代码:

package co.example.hanwei.myapplication;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
}

MainActivity是继承自AppCompatActivity,这是向下兼容的一种Activity,可以将Activity中各个系统版本中的各种特性和功能最低兼容到Andrid2.1,Activity是Android系统提供的一个活动基类,所有活动都必须是继承他或者它的子类(AppCompatActivity是Activity的子类),在里面有一个onCreate( )方法,这个方法是一个活动创建时必定要执行的方法

Android程序讲究逻辑和视图分离,不推荐在活动中直接编写界面的,通用办法是,在布局文件中编写界面,在活动中引入,在onCreate()中方法的第二行中就调用了setContentView( )方法,就是这个方法给当前活动引入了一个布局activity_mian.

详解 build. gradle文件

项目中有两个buld. gradle文件,一个是在最外层
目录下的,一个是在app目录下的。这两个文件对构建 Android studio项目都起到了至关重要的
作用,下面我们亻就来对这两个文件中的内容进行详细的分析。
先来看一下最外层目录下的buid. 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.3'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        jcenter()
    }
}
这些代码都是自动生成的,虽然语法结构看上去可能有点难以理解,但是如果我们忽略语法

结构,只看最关键的部分,其实还是很好懂的

首先,两处 repositories的闭包中都声明了 center()这行配置,那么这个 center是什
么意思呢?其实它是一个代码托管仓库,很多 Android开源项目都会选择将代码托管到 Center
上,声明了这行配置之后,我们就可以在项目中轻松引|用任何 center上的开源项目了
接下来, dependencies闭包中使用 classpath声明了一个 Gradle插件。为什么要声明这
个插件呢?因为 Gradle并不是专门为构建 Android项目而开发的,Java、C++等很多种项目都可
以使用 Gradle来构建。因此如果我们要想使用它来构建 Android项目,则需要声明com, android
tools, BUild: gradle:2.2.6这个插件。其中,最后面的部分是插件的版本号,我在写作本书
时最新的插件版本是22.0
这样我们就将最外层目录下的 build gradle文件分析完了,通常情况下你并不需要修改这个

文件中的内容,除非你想添加一些全局的项目构建配置。

下面我们再来看一下app目录下的 build gradle文件,代码如下所示

apply plugin: 'com.android.application'

android {
    compileSdkVersion 26
    buildToolsVersion "25.0.3"
    defaultConfig {
        applicationId "co.example.hanwei.myapplication"
        minSdkVersion 23
        targetSdkVersion 26
        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:26.+'
    compile 'com.android.support.constraint:constraint-layout:1.0.2'
    testCompile 'junit:junit:4.12'
}
这个文件中的内容就要相对复杂一些了,下面我们一行行地进行分析。首先第一行应用了
个插件,一般有两种值可选:com. android. application表示这是一个应用程序模块,
Com. android. Library表示这是一个库模块。应用程序模块和库模块的最大区别在于,一个是
可以直接运行的,一个只能作为代码库依附于别的应用程序模块来运行。
接下来是一个大的 android闭包,在这个闭包中我们可以配置项目构建的各种属性。其中,
compilesdkversion用于指定项目的编译版本,这里指定成23表示使用 Android6.0系统的SDK

编译。 buildToolsversion用于指定项目构建丁具的版本,目前最新的版本就是25.0.3,如果有更新的版本时, Android studio会进行提示。
        然后我们看到,这里在 android闭包中又嵌套了一个 defaultconfig闭包, default Config闭包
中可以对项目的更多细节进行配置。其中, applicationId用于指定项目的包名,前面我们在
创建项目的时候其实已经指定过包名了,如果你想在后面对其进行修改,那么就是在这里修改的。
minsdkversion用于指定项目最低兼容的 Android系统版本,这里指定成15表示最低兼容到
Android40系统。 target Sdkversion指定的值表示你在该目标版本上已经做过了充分的测试,
系统将会为你的应用程序启用一些最新的功能和特性。比如说 Android60系统中引入了运行时
权限这个功能,如果你将 targetsdkversion指定成23或者更高,那么系统就会为你的程序启
用运行时权限功能,而如果你将 targetsdkversion指定成22,那么就说明你的程序最高只在
Android51系统上做过充分的测试, Android60系统中引入的新功能自然就不会启用了。剩下的
两个属性都比较简单, version code用于指定项目的版本号,vers1 onname用于指定项目的版
本名,这两个属性在生成安装文件的时候非常重要,我们在后面都会学到。
        分析完了 defaultConfig闭包,接下来我们亻看一下 buildTypes闭包。 build Types闭包中用于指
定生成安装文件的相关配置,通常只会有两个子闭包,一个是 debug,一个是 release debug闭
包用于指定生成测试版安装文件的配置, release闭包用于指定生成正式版安装文件的配置。另外
debug闭包是可以忽略不写的,因此我们亻看到上面的代码中就只有一个 release闭包。下面来看
下 release闭包中的具体内容吧, minifyEnabled用于指定是否对项目的代码进行混淆,true表
示混淆, false表示不混淆。 proguardFiles用于指定混淆时使用的规则文件,这里指定了两
个文件,第一个 proguard- android.txt是在 Android sdk目录下的,里面是所有项目通用的
混淆规则,第二个 proguard- rules,pro是在当前项目的根目录下的,里面可以编写当前项目
特有的混淆规则。需要注意的是,通过 Android studio直接运行项目生成的都是测试版安装文件,
这样整个 android闭包中的内容就都分析完了,接下来还剩一个 dependencies闭包。这个闭
包的功能非常强大,它可以指定当前项目所有的依赖关系。通常 Android studio项目一共有3种依
赖方式:本地依赖、库依赖和远程依赖。本地依赖可以对本地的Jar包或目录添加依赖关系,库依
赖可以对项目中的库模块添加依赖关系,远程依赖则可以对 center库上的开源项目添加依赖关系。
观察一下 dependencies闭包中的配置,第一行的 compile filetree就是一个本地依赖声明,它
表示将ibs目录下所有jar后缀的文件都添加到项目的构建路径当中。而第二行的 compile则是
远程依赖声明,com, android. support: appcompat-V7:24.2.1就是一个标准的远程依赖库格式
其中com. android. support是域名部分,用于和其他公司的库做区分; appcompat-V7是组名称
用于和同一个公司中不同的库做区分;24.2.1是版本号,用于和同一个库不同的版本做区分。加
上这句声明后, Gradle在构建项目时会首先检查一下本地是否已经有这个库的缓存,如果没有的话
则会去自动联网下载,然后再添加到项目的构建路径当中。至于库依赖声明这里没有用到,它的
基本格式是 compile pro]ect后面加上要依赖的库名称,比如说有一个库模块的名字叫 helper,
那么添加这个库的依赖关系只需要加入 compile project(": helper)这句声明即可。

猜你喜欢

转载自blog.csdn.net/u014331717/article/details/81030349