iOS开发者入门Android开发笔记(二)-项目结构

前言

笔者是一名iOS开发者,最近在学习Android开发。作为移动平台的两大阵营,iOS和Android开发既有想通之处,也有各自不同的特性。本系列文章,主要是从iOS开发者的角度,类比地去学习Android开发,记录下自己的一些心得体会。如果你也对Android开发感兴趣,并想入门学习。建议可以去看郭霖《第一行代码》。笔者也是通过这本书来入门学习Android开发的,因此,本文的大部分知识,你都可以在这本书中看到。

这里需要说明的是,笔者手中的《第一行代码》是第二版。目前此书共有三版,第一版是在2014年出版,时间相对较早,书中使用的开发工具还是Eclipse,内容很多已过时。第二版是2016年出版,在第一版的基础上基于Android7.0进行全面更新,开发工具也跟新为Android Studio,不过目前来看,也有部分过时的API。第三版是2020年出版,更新了部分内容的同时,全书改用Google推荐的Kotlin作为开发语言。作为初学者,笔者不建议直接从Kotlin学起,毕竟目前大量的项目还是基于Java开发。就好像虽然苹果主推Swift,但目前大量的项目还是基于Objective-C开发。我们可以入门后,进一步学习Kotlin。

一、项目结构

我们上一篇成功创建了第一个Android项目,接下来我们以这个项目为例,分析它的项目结构。

首先,我们需要打开项目HelloWorld。这里需要说明的是,我们不能像iOS项目一样,直接双击xxx.xcodeprojxxx.xcworkspace文件来打开项目。而是需要打开Android Studio,点击Open an existing Android Studio projectImprot project 来导入项目。当然,因为我们之前打开过HelloWorld项目,所以直接从左侧的历史记录打开就可以。

打开项目

接下来,我们来看左侧的项目文件目录

简化后的文件结构

这里并不是项目正式的文件目录结构,而是被Android Studio 转换过的。作为初学者,我们首先切换项目结构模式为Project,来认识真实的目录结构。

切换项目结构模式
Project模式的项目结构

二、重点关注的目录-APP

APP目录是需我们重点关注的,以后的开发基本都是在这个目录操作。其中包含了项目的代码、资源等文件。

1、build

编辑自动生成的文件,无需过多关注和修改

2、libs

放置第三方jar包,会被自动添加到构建路径里

3、src

我们日常开发的编写的文件都在此目录:

->androidTest:编写Android Instrument Test 测试用例

->test:编写Android Unit Test 测试用例

-> main:项目主文件目录

  • java 我们编写的Java文件
  • res 资源文件,类似于iOS的Assets.xcassets文件,包含内容较多,后面会有详解
  • AndroidManifest.xml,项目配置文件,类似iOS的Info.plist文件

4、.gitignore

将app模块内的指定文件或目录排除在版本控制之外。

5、app.iml

IntelliJ IDEA 项目自动生成的文件,无需修改。

6、build.gradle

app模块的gradle构建脚本,用于指定很多项目构建相关的配置。

/*
应用了一个插件,一般两个可选值:
“com.android.application”-表示当前为应用程序模块,可直接运行;
“com.android.library”-表示当前为库模块,只能作为代码库,依附于其它应用程序模块运行。
*/
apply plugin: 'com.android.application'

android {
    //指定项目的编译版本
    compileSdkVersion 29
    //项目细节配置
    defaultConfig {
        //项目包名,区分应用的唯一标识
        applicationId "com.example.helloworld"
        //最低兼容的Android系统版本
        minSdkVersion 21
        //已充分适配该系统版本新特性
        targetSdkVersion 29
        //项目版本号
        versionCode 1
        //项目版本名
        versionName "1.0"

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }
    //指定生成安装包文件的相关配置
    buildTypes {
        //debug{} 指定测试版安装包配置,一般可以忽略不写
        //指定正式版安装包文件配置
        release {
            //是否对项目进行代码混淆
            minifyEnabled false
            //指定混淆使用的规则文件,
           //proguard-android-optimize.txt 是在Android SDK目录下,所有项目的通用混淆规则
          //proguard-rules.pro 是当前项目根目录下,可自行编写当前项目特有混淆规则
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
}
//指定当前项目依赖关系1、本地依赖;2、库依赖;3、远程jcenter库依赖。
dependencies {
    //本地依赖,表示将libs目录下.jar后缀的文件添加到项目的构建目录
    implementation fileTree(dir: "libs", include: ["*.jar"])
    //远程依赖
    implementation 'androidx.appcompat:appcompat:1.2.0'
    //远程依赖
    implementation 'androidx.constraintlayout:constraintlayout:2.0.1'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'androidx.test.ext:junit:1.1.2'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'

}

7、proguard-rules.pro

用于指定项目代码混淆规则,防止代码被破解。

三、其它目录

除app目录外的其他目录,多是自动生成的,且一般不需要我们去修改的。因此,只需简单了解,或暂时略过。
1、.gradle和.idea
Android Studio自动生成文件,无需手动编辑。
2、build
编译是自动生成的文件,无需手动编辑。
3、gradle
此目录包含gradle wrapper的配置文件。
4、.gitignore
指定目录或文件排除在版本控制之外。
5、build.gradle
项目全局的gradle构建脚本,通常这个文件不需要修改。
6、gradle.properties
全局gradle配置文件,这里配置的属性将影响到项目中所有的gradle编译脚本。
7、gradlew和gradlew.bat
用于命令行界面执行gradle命令,gradlew用于Linux或Mac系统,gradlew.bat用于Windows系统。
8、local.properties
用于指定本机Android SKD路径,通常自动生成无需修改,除非本地Android SKD路径路径变化。

四、res 资源文件详解

1、资源类型

res 资源文件
  • drawable 开头的文件,用于放图片
  • layout 放布局文件
  • mipmap 开头的文件,用于放应用图标
  • values开头的文件,放字符串、样式、颜色等

mipmap开头的多个文件,用于适配的分辨率的设备,类似于iOS中@2x、@3x。同理,drawable文件虽然没有自动生成,但是需要我们自己创建drawable-hdpi、drawable-xhdpi、drawable-xxhdpi、drawable-xxxhdpi。

这里的布局文件是.xml,类似于iOS的.xib文件。支持可视化编辑,也可以代码编写。


布局文件

2、资源引用

以下是res/values.strings.xml文件内容:

 
    HelloWorld
 

想引用app_name有两种方式:

  • 在代码中通过R.string.app_name来获取内容
  • 在XML文件中通过@string/app_name来获取内容
    例如在AndroidManifest.xml文件中:

        ...
 

五、HelloWorld项目是怎么运行起来的?

我们知道,iOS项目运行,首先是在main.m文件注册Appdelegate

int main(int argc, char * argv[]) {
    @autoreleasepool {
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
    }
}

然后在Appdelegate- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions回到中设置window及其rootViewController

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    self.window.rootViewController = [[UIViewController alloc] init];
    [self.window makeKeyAndVisible];

    return YES;
}

而安卓项目的运行,首先需要在AndroidManifest.xml中注册活动,这里的活动,就是APP启动后展示的页面。

//AndroidManifest.xml



    
            
                
                
            
        
    


这里表示注册了活动MainActivityintent-filter中的action android:name="android.intent.action.MAIN"category android:name="android.intent.category.LAUNCHER"表示将MainActivity设置为项目启动的主页面。

我们来看下MainActivity文件

package com.example.helloworld;

import androidx.appcompat.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 继承自活动AppCompatActivityMainActivity在被创建的回调onCreate里,加载了布局文件activity_main

结语

现在,Android项目的大致结构我们已经初步了解。接下来,我们要学习一个Android中的日志工具类Log(android.until.Log)。这将有助于我们以后的开发调试。

你可能感兴趣的:(iOS开发者入门Android开发笔记(二)-项目结构)