美文网首页
iOS开发者入门Android开发笔记(二)-项目结构

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

作者: 赵梦楠 | 来源:发表于2020-09-08 18:05 被阅读0次

    前言

    笔者是一名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)。这将有助于我们以后的开发调试。

    相关文章

      网友评论

          本文标题:iOS开发者入门Android开发笔记(二)-项目结构

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