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文件内容:

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

想引用app_name有两种方式:

  • 在代码中通过R.string.app_name来获取内容
  • 在XML文件中通过@string/app_name来获取内容
    例如在AndroidManifest.xml文件中:
<application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        ...
 </application>

五、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
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.helloworld">

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

</manifest>

这里表示注册了活动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)。这将有助于我们以后的开发调试。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 162,825评论 4 377
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,887评论 2 308
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 112,425评论 0 255
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,801评论 0 224
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 53,252评论 3 299
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 41,089评论 1 226
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,216评论 2 322
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 31,005评论 0 215
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,747评论 1 250
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,883评论 2 255
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,354评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,694评论 3 265
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,406评论 3 246
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,222评论 0 9
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,996评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,242评论 2 287
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 36,017评论 2 281

推荐阅读更多精彩内容