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:"打头

<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 视图(简化视图)

项目名称/
├── 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 视图(完整物理结构)

项目名称/
├── .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的代码,显示界面

<?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>