美文网首页
Android:解析目录结构

Android:解析目录结构

作者: 时光啊混蛋_97boy | 来源:发表于2023-01-31 11:08 被阅读0次

原创:有趣知识点摸索型文章
创作不易,请珍惜,之后会持续更新,不断完善
个人比较喜欢做笔记和写总结,毕竟好记性不如烂笔头哈哈,这些文章记录了我的IOS成长历程,希望能与大家一起进步
温馨提示:由于简书不支持目录跳转,大家可通过command + F 输入目录标题后迅速寻找到你所需要的内容

目录

  • 一、运行项目
  • 二、工程的目录结构
  • 三、解析默认 Demo

一、运行项目

打开 Android Studio 创建一个新的 Empty Activity 项目,命名为 BoostTestIOS

进入开发界面后,我们发现没有可以运行的模拟器。

于是在Tools工具栏中选择 Device Manager打开设备管理器,并在其中点击Create Device按钮来打开创建新设备面板。

选择一个设备型号,按需选择,然后点击 Next 进行安装。

在自己需要的版本后面点击下载。

现在就可以在 Device Manager 上看到我们的模拟器了。

点击运行。就可以看到项目顺利运行起来了。


二、工程的目录结构

Android 结构模式

任何一个新建的项目都会默认使用Android模式的项目结构,但这并不是项目真实的目录结构,而是被Android Studio转换过的。这种项目结构简洁明了,适合进行快速开发。

项目结构模式下的目录分析

点击上图当中的Android区域可以切换项目结构模式。

  • .gradle 和 .idea:这两个目录下放置的都是 Android Studio 自动生成的一些文件,我们无需关心,也不要手动编辑。
  • app:项目中的代码、资源等内容都是放置在这个目录下,我们后面的开发工作也基本是在这个目录下进行。
  • build:这个目录主要包含了一些在编译时自动生成的文件,无需过多关心。
  • gradle:目录下包含了gradle wrapper的配置文件,使用gradle wrapper的方式不需要提前将gradle下载好,而是会自动根据本地的缓存情况决定是否需要联网下载gradleAndroid Studio默认就是启动gradle wrapper方式的,如果需要更改成离线模式,可以点击Android Studio导航栏—FileSettingsBuildExecutionDeploymentGradle进行配置更改。
  • gitignore:这个文件是用来指定的目录或文件排除在版本控制之外的。
  • build.gradle:项目全局的 gradle 构建脚本,通常这个文件内容不需要修改。
  • gradle.properties: 这个文件是全局的gradle配置文件,在这里配置的属性将会影响到项目中所有的gradle编译脚本。
  • gradlew 和 gradlew.bat:这两个文件是用来在命令行界面中执行gradle命令的,其中gradlew是在Linux或Mac系统中使用的,gradlew.bat是在Windows系统中使用的。
  • local.properties:这个文件用于指定本机中的Android SDK路径,通常是自动生产的,我们并不需要修改。除非你本机中的Android SDK位置发生了变化,那么就将这个文件中的路径修改成新的位置即可。
  • settings.gradle: 这个文件用于制定项目中所有引入的模块。由于Hello World项目中只有一个app模块,因此该文件中也就只引入了app这一个模块。通常下,模块的引入是自动完成的,需要我们手动修改这个文件的场景可能比较少。
app 目录下的内容分析

app目录外其他都是自动生成。app目录下内容是重点。

  • build: 和外层build目录类似,也包含了一些在编译时自动生成的文件,不过它里面内容更复杂,不需过多关心。
  • libs: 如项目使用了第三方jar包,就需要存放在该目录下。目录下的jar包会被自动添加到项目的构建路径里。
  • androidTest: 用来编写AndroidTest测试用例,可以对项目进行自动化测试。
  • java: 存放所有Java代码(包括Kotlin),展开该目录,将看到系统帮我们自动生成了一个MainActivity文件。
  • AndroidManifest.xml: 整个Android项目的配置文件,可在程序中定义所有四大组件都需要在这个文件里注册,还可以在这个文件里给应用程序添加权限声明。会经常用到。
  • text: 用来编写UnitTest测试用例的,是对项目进行自动化测试的另一种方式。
  • gitignore:app模块内指定的目录或文件排除在版本控制之外,作用和外层的.gitignore文件类似。
  • build.gradle: app模块的gradle构建脚本,会指定很多项目构建相关的配置。
  • proguard-rules.pro: 用于指定项目代码的混淆规则,当代码开发完成打包成安装包文件,如不希望代码被破解,通常会将代码进行混淆,从而让破解者难以阅读。
  • res: 项目中所使用到的所有图片,布局,字符串等资源。该文件下还有很多子目录。 图片 drawable、布局layout、字符串values
res 目录下的内容分析

展开res目录如下。之所以有这么多mipmap开头的文件夹,其实主要是为了让程序能够更好地兼容各种设备。在制作程序的时候最好能够给同一张图片提供几个不同分辨率的版本,分别放在这些文件夹下,然后当程序运行的时候,会自动根据当前运行设备分辨率的高低选择加载哪个文件夹下的图片。

  • 所有以drawable开头的文件夹都是用来放图片的
  • 所有以mipmap开头的文件夹都是用来放应用图标的
  • 所有以values开头的文件夹都是用来放字符串、样式、颜色等配置的
  • layout文件夹是用来放布局文件的

打开res/values/strings.xml文件,内容如下所示:

<resources>
    <string name="app_name">BoostTestAndroid</string>
</resources>

可以看到,这里定义了一个应用程序名的字符串,我们有以下两种方式来引用它。

  • 在代码中通过R.string.app_name 可以获得该字符串的引用。
  • 在XML中通过@string/app_name 可以获得该字符串的引用。

修改应用程序的名称及图标。打开AndroidManifest.xml文件,找到如下代码:

// 图标
android:icon="@mipmap/ic_launcher"
// 应用名称
android:label="@string/app_name"
build.gradle文件

Android Studio是采用Gradle来构建项目的。Gradle是一个非常先进的项目构建工具,它使用了一种基于Groovy的领域特定语言(DSL)来声明项目设置,摒弃了传统基于XML(如AntMaven)的各种烦琐配置。项目中有两个build.gradle文件,一个是在最外层目录下的,一个是在app目录下的。这两个文件对构建Android Studio项目都起到了至关重要的作用。

app目录下的build.gradle文件。这些代码都是自动生成的,虽然语法结构看上去可能有点难以理解,但是如果我们忽略语法结构,只看最关键的部分,其实还是很好懂的。第一行应用了一个插件。一般可以选择:1、com.android.application表示这是一个应用程序模块,2、com.android.library 表示这是一个库模块。两者的最大区别是:一个是可以直接运行的;一个只能作为代码库依赖于别的应用程序来运行。

plugins {
    id 'com.android.application'
    id 'org.jetbrains.kotlin.android'
}

下面是一个Android包,用于配置项目构建的各种属性。

android {
    namespace 'com.example.boosttestandroid'
    compileSdk 32 // 用于指定项目的编译版本

    defaultConfig {// 对项目的更多细节进行配置
        applicationId "com.example.boosttestandroid" // 用于指定项目的包名
        minSdk 21 // 用于指定项目最低兼容的Android系统版本
        targetSdk 32 // 指定的值表示你在该目标版本上已经做过了充分的测试,系统将会为你的应用程序启用一些最新的功能和特性
        versionCode 1 // 指定项目的版本号
        versionName "1.0" // 指定项目的版本名

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }

    buildTypes {// 用于指定生成安装文件的相关配置
        release {// 用于指定生成正式版安装文件的配置
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
    kotlinOptions {
        jvmTarget = '1.8'
    }
}

指定当前项目所有的依赖关系.一般有三种依赖:本地依赖、库依赖和远程依赖。

  • 本地依赖可以对本地的Jar包或目录添加依赖关系
  • 库依赖可以对项目中的库模块添加依赖关系
  • 远程依赖则可以对jcenter库上的开源项目添加依赖关系
dependencies {
    implementation 'androidx.core:core-ktx:1.7.0'
    implementation 'androidx.appcompat:appcompat:1.4.1'
    implementation 'com.google.android.material:material:1.5.0'
    implementation 'androidx.constraintlayout:constraintlayout:2.1.3'
    testImplementation 'junit:junit:4.13.2'
    androidTestImplementation 'androidx.test.ext:junit:1.1.3'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
}

三、解析默认 Demo

首先我们可以看到,MainActivity 是继承自 AppCompatActivity 的。AppCompatActivityAndroidX提供的一种向下兼容的Activity,可以使Activity在不同系统版本中的功能保持一致性。ActivityAndroid系统提供的一个活动基类,我们项目中所有的活动都必须继承它或者它的子类才能拥有活动的特性。(AppCompatActivityActivity的子类)。

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
    }
}

然后可以看到MainActivity中有一个onCreate()方法,这个方法是一个活动被创建时必定要执行的方法,其中只有两行代码,并且没有Hello World!的字样。那么之前app中显示的Hello World!是在哪里定义的呢?

其实Android程序的设计讲究逻辑和视图分离,因此是不推荐在活动中直接编写界面的,更加通用的一种做法是,在布局文件中编写界面,然后在活动中引入进来。可以看到,在onCreate()方法的第二行调用了setContentView()方法,就是这个方法给当前的活动引入了一个activity_main布局,那Hello World!一定就是在这里定义的了!我们快打开这个文件看一看。

切换到text视图:

终于找到hello world的定义了。

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

相关文章

网友评论

      本文标题:Android:解析目录结构

      本文链接:https://www.haomeiwen.com/subject/mdyvhdtx.html