APP开发语言

App开发主要有两大技术路线,分别是原生开发混合开发

Android的官方编程语言包括 JavaKotlin

Kotlin

定位:Google 官方推荐的首选 Android 开发语言(2019 年起)。
优势:
简洁高效:语法糖减少样板代码(如 data class 自动生成 equals()/hashCode())。
空安全:编译时检查空指针(变量默认不可为 null,需显式声明 var str: String?)。
协程支持:简化异步任务处理(替代 AsyncTask 和回调地狱)。
完全兼容 Java:可调用 Java 代码,适合逐步迁移旧项目。
使用场景:
新项目首选,尤其适合快速迭代和复杂业务逻辑。
结合 Jetpack Compose 实现声明式 UI(现代化 UI 开发)。

Java

定位:Android 早期官方语言,仍广泛用于旧项目维护。
优势:
生态成熟:海量开源库和教程资源(如 Retrofit、Glide)。
跨平台性:代码可复用于后端或其他 Java 平台。
劣势:
冗长语法(如匿名内部类、getter/setter)。
缺乏现代语言特性(需手动处理空指针)。
使用场景:
维护遗留 Java 项目。
开发者已有 Java 基础,过渡到 Android 开发。

C/C++

涉及图像与音视频等复杂运算的场合使用

优势:执行效率比解释性语言高,JAVA允许调用C/C++编写的语言

XML

可扩展标记语言 (XML) 是一组以机器可读形式对文档进行编码时需遵从的规则。它是一组在互联网上共享数据的普遍格式。

经常更新内容的网站(例如新闻网站或博客)通常会提供 XML Feed,以便外部程序及时了解内容更改。上传和解析 XML 数据是联网应用的常见任务。每个XML都是独立的控件对象,标签内的属性以"android:"打头

1
2
3
4
5
6
7
<TextView
android:id="@+id/tv_hello"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello world!"
android:textSize="16sp"
android:textColor="#FF0000" />

安卓使用的数据库

SQLite,是一款轻型的数据库,它的设计目标是嵌入式的,而且已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,同样比起Mysql、PostgreSQL这两款开源的世界著名数据库管理系统来讲,它的处理速度比他们都快。

1、简单,无需安装。
SQLite 没有复杂的安装配置过程,不需要另外配置、安装或管理。不需要启动、停止或配置的服务器进程,无需创建新的数据库实例或为用户分配访问权限的“设置”过程。

2、资源占用少。
SQLite占用空间非常小,是轻量级的,完全配置时小于600KiB,省略可选功能配置时小于250KiB,占用的电脑资源少,真正做到绿色、轻盈!

3、处理速度快
SQLite比一些流行的数据库在大部分普通数据库操作要快!

APP工程目录结构

App工程分为两个层次,第一个层次是项目,另一个层次是模块

模块依赖于项目,每一个项目至少有一个模块,也能拥有多个模块

一般所言的“编译运行APP”,指的是运行某个模块,而非某个项目,因为模块才对应实际的App

1. Android 视图(简化视图)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
项目名称/
├── app/
│ ├── manifests/
│ │ └── AndroidManifest.xml //APP运行配置文件
│ ├── java/
│ │ ├── com.example..myapp //当前模块的Java源代码
│ │ ├── com.example..myapp(androidTest) //后面两个测试都是Java源代码
│ │ └── com.example..myapp
│ ├── res/
│ │ ├── drawable //存放图形描述与图片文件
│ │ ├── layout //存放App页面布局
│ │ ├── mipmap //存放App的启动图标
│ │ └──values //存放一些常量定义文件
│ └── Gradle Scripts/
├── Gradle Scripts/
└── 其他模块/

2. Project 视图(完整物理结构)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
项目名称/
├── .gradle/ // Gradle 构建系统生成的文件
├── .idea/ // IDE 配置文件
├── app/ // 主模块
│ ├── build/ // 构建输出
│ ├── libs/ // 本地库文件
│ ├── src/ // 源代码和资源
│ │ ├── androidTest // 仪器测试
│ │ ├── main/ // 主源代码
│ │ │ ├── assets/ // 原始资源文件
│ │ │ ├── java/ // Java/Kotlin 源代码
│ │ │ ├── res/ // 应用资源
│ │ │ └── AndroidManifest.xml
│ │ └── test/ // 单元测试
│ └── build.gradle // 模块级构建配置
├── gradle/ // Gradle 包装器文件
├── build/ // 项目级构建输出
└── settings.gradle // 项目设置文件

3. Gradle Scripts

主要是工程的编译配置文件,是一个项目的自动化构建工具

一个典型的 Android Studio 项目包含多个 Gradle 脚本文件,每个文件都有其特定的作用和配置。以下是一些主要的 Gradle 脚本文件及其功能:

  • build.gradle (Project): 这个文件包含了整个项目的构建配置,如 Gradle 插件的版本和项目的仓库设置。这是顶层的构建文件,通常包含适用于所有子项目/模块的配置选项。

  • build.gradle (Module): 每个模块(如 app 模块)都有自己的 build.gradle 文件,用于配置特定于该模块的构建设置,例如编译 SDK 版本、应用 ID 和依赖项。

  • gradle-wrapper.properties: 这个文件定义了 Gradle 包装器的属性,包括 Gradle 分发的 URL 和版本。这确保了所有开发者和 CI 系统使用相同版本的 Gradle。

  • proguard-rules.pro: 该文件允许开发者添加自定义的代码混淆规则,以保护应用的代码不被轻易反编译。

  • gradle.properties: 用于配置构建属性,如 JVM 参数和 Gradle 的其他设置。

  • settings.gradle: 定义项目中包含的模块。例如,如果项目只有一个 app 模块,它将包含 include ':app'

  • local.properties: 存储本地机器特定的配置,如 SDK 和 NDK 的路径。这个文件不应该被版本控制系统跟踪。

清单文件

每个应用底下都必须要有一个 AndroidMannifest.xml,并且文件名必须一模一样。

这个文件中包含了App的配置文件,系统需要根据里面的内容运行APP的代码,显示界面

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.myapp" <!-- 应用包名唯一标识应用 -->
android:versionCode="1" <!-- 应用的内部版本号,每次更新时需要增加 -->
android:versionName="1.0" <!-- 应用的外部版本号,给用户展示的版本信息 -->

android:installLocation="auto" <!-- 安装位置,auto表示系统决定安装位置 -->

<!-- 定义应用所需的权限 -->
<uses-permission android:name="android.permission.INTERNET" /> <!-- 允许访问网络 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <!-- 允许写入外部存储 -->

<!-- 声明支持的硬件特性 -->
<uses-feature android:name="android.hardware.camera" android:required="true" /> <!-- 应用需要相机硬件 -->
<uses-feature android:name="android.hardware.screen.portrait" android:required="false" /> <!-- 应用支持竖屏,非必需 -->

<!-- 支持的屏幕配置 -->
<supports-screens
android:smallScreens="true" <!-- 支持小屏幕 -->
android:normalScreens="true" <!-- 支持普通屏幕 -->
android:largeScreens="true" <!-- 支持大屏幕 -->
android:xlargeScreens="true" <!-- 支持超大屏幕 -->
android:resizeable="true" <!-- 支持窗口调整 -->
android:anyDensity="true" /> <!-- 支持所有屏幕密度 -->

<!-- 应用组件声明 -->
<application
android:icon="@mipmap/ic_launcher" <!-- 应用图标 -->
android:label="@string/app_name" <!-- 应用名称 -->
android:theme="@style/AppTheme" <!-- 应用的全局主题 -->
android:allowBackup="true" <!-- 是否允许备份应用数据 -->
android:hardwareAccelerated="true" <!-- 是否启用硬件加速 -->
android:debuggable="false"> <!-- 发布版本设置为false,避免调试漏洞 -->

<!-- Main Activity,应用启动时打开的第一个屏幕 -->
<activity
android:name=".MainActivity" <!-- Activity 类名 -->
android:label="@string/app_name"
android:icon="@mipmap/ic_launcher"
android:theme="@style/AppTheme"
android:configChanges="orientation|keyboardHidden" <!-- 配置变化时,Activity的响应方式 -->
android:launchMode="singleTop"> <!-- 启动模式,当栈顶已经存在该Activity时,不重新创建实例 -->

<!-- Intent Filter,表示该Activity响应的Intent -->
<intent-filter>
<action android:name="android.intent.action.MAIN" /> <!-- 启动应用时的主动作 -->
<category android:name="android.intent.category.LAUNCHER" /> <!-- 标记为Launcher -->
</intent-filter>
</activity>

<!-- 第二个 Activity -->
<activity
android:name=".SecondActivity"
android:label="Second Activity"
android:theme="@style/AppTheme" />

<!-- 需要在后台运行的服务 -->
<service android:name=".MyService"
android:enabled="true" <!-- 是否启用服务 -->
android:permission="android.permission.BIND_JOB_SERVICE"> <!-- 启动服务需要的权限 -->
</service>

<!-- 广播接收器 -->
<receiver android:name=".MyBroadcastReceiver"
android:enabled="true">
<intent-filter>
<action android:name="com.example.myapp.ACTION_RECEIVE" /> <!-- 监听特定的广播 -->
</intent-filter>
</receiver>

<!-- 内容提供者 -->
<provider
android:name=".MyContentProvider"
android:authorities="com.example.myapp.provider"
android:exported="false" <!-- 是否允许其他应用访问 -->
android:readPermission="android.permission.READ_EXTERNAL_STORAGE"
android:writePermission="android.permission.WRITE_EXTERNAL_STORAGE">
</provider>

</application>
</manifest>