前言
笔者是一名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.xcodeproj或xxx.xcworkspace文件来打开项目。而是需要打开Android Studio,点击Open an existing Android Studio project 或 Improt 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>
这里表示注册了活动MainActivity
,intent-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
继承自活动AppCompatActivity
,MainActivity
在被创建的回调onCreate
里,加载了布局文件activity_main
。
结语
现在,Android项目的大致结构我们已经初步了解。接下来,我们要学习一个Android中的日志工具类Log(android.until.Log)。这将有助于我们以后的开发调试。
网友评论