Skip to content

Android

https://developer.android.google.cn/

核心特性

系统架构

Android 系统架构分为五个层次,从底层到顶层依次为:

┌─────────────────────────────────────────────────┐
│        应用层 (Applications)                    │
│   联系人、浏览器、相机、设置等系统应用          │
├─────────────────────────────────────────────────┤
│    应用框架层 (Application Framework)           │
│   Activity Manager、Content Providers、        │
│   View System、Package Manager 等              │
├─────────────────────────────────────────────────┤
│    Android 运行时层 (Android Runtime)           │
│   Core Libraries + Dalvik/ART 虚拟机            │
├─────────────────────────────────────────────────┤
│    原生库层 (Native Libraries)                 │
│   OpenGL ES、SQLite、WebKit、libc 等           │
├─────────────────────────────────────────────────┤
│    硬件抽象层 (HAL)                             │
│   Camera、Bluetooth、Sensors 等硬件接口         │
├─────────────────────────────────────────────────┤
│      Linux 内核层 (Linux Kernel)               │
│   内存管理、进程管理、驱动程序、安全机制        │
└─────────────────────────────────────────────────┘

主要特性

  • 开放性:开源移动操作系统,支持自由定制和分发
  • 应用生态:Google Play 商店拥有数百万款应用
  • 多任务处理:支持后台应用运行和快速切换
  • 通知系统:统一的通知管理机制
  • Google 服务集成:Google Play Services、GCM/FCM 推送
  • 设备多样性:手机、平板、手表、电视、汽车等多种设备类型

版本演进

版本代号API 级别发布时间主要特性
Android 15Vanilla Ice Cream352024私密空间、预测返回、健康连接
Android 14Upside Down Cake342023分区存储改进、PhotoPicker
Android 13Tiramisu332022通知权限、照片选择器
Android 12Snow Cone312021Material You 设计语言
Android 11Red Velvet Cake302020气泡对话、屏幕录制
Android 10Quince Tart292019暗黑模式、隐私增强

系统配置与管理

系统设置

bash
# 通过 adb 查看系统属性
adb shell getprop ro.build.version.sdk        # 获取 SDK 版本
adb shell getprop ro.product.model            # 获取设备型号
adb shell getprop ro.build.version.release    # 获取 Android 版本
adb shell getprop ro.build.fingerprint        # 获取系统指纹

# 通过 adb 设置属性(需要 root)
adb shell setprop debug.myapp.enabled 1

开发者选项

bash
# 启用开发者选项
adb shell settings put global development_settings_enabled 1

# 开启 USB 调试
adb shell settings put global usb_debugging_enabled 1

# 开启动画缩放
adb shell settings put global window_animation_scale 0.75
adb shell settings put global transition_animation_scale 0.75
adb shell settings put global animator_duration_scale 0.75

# 显示触摸操作
adb shell settings put system show_touches 1
adb shell settings put system pointer_location 1

# 开启 GPU 渲染分析
adb shell settings put global hw_ui_layer_mode 1

应用管理

bash
# 列出所有已安装应用
adb shell pm list packages                          # 所有应用
adb shell pm list packages -s                       # 系统应用
adb shell pm list packages -3                       # 第三方应用
adb shell pm list packages -i                       # 包含安装信息

# 安装/卸载应用
adb install -r app.apk          # 覆盖安装
adb install --bundle AAB        # 通过 App Bundle 安装
adb install -g app.apk          # 授予所有权限
adb uninstall com.example.app   # 卸载应用
adb uninstall -k com.example.app # 卸载但保留数据

# 清除应用数据
adb shell pm clear com.example.app

# 查看应用信息
adb shell dumpsys package com.example.app
adb shell dumpsys package com.example.app | grep version

权限管理

bash
# 查看应用权限
adb shell dumpsys package com.example.app | grep permission

# 授予权限
adb shell pm grant com.example.app android.permission.CAMERA
adb shell pm grant com.example.app android.permission.READ_CONTACTS

# 撤销权限
adb shell pm revoke com.example.app android.permission.CAMERA

# 查看运行时权限状态
adb shell dumpsys package com.example.app | grep -A 5 "runtime permissions"

命令行工具

ADB 常用命令

bash
# 设备连接
adb devices                          # 列出设备
adb devices -l                       # 详细列表
adb connect 192.168.1.100:5555       # 通过 WiFi 连接
adb usb                              # USB 模式

# 文件传输
adb push local/path /sdcard/         # 推送文件到设备
adb pull /sdcard/file local/         # 从设备拉取文件

# 应用安装
adb install app.apk
adb install-multiple base.apk split_config.xx.apk  # 分包安装

# 端口转发
adb forward tcp:8080 tcp:8080        # 本地端口转发
adb reverse tcp:8080 tcp:8080        # 设备端口转发

# 日志管理
adb logcat                          # 查看日志
adb logcat -d                       # 打印当前日志并退出
adb logcat -c                       # 清除日志缓存
adb logcat -s MainActivity          # 过滤标签
adb logcat *:E                       # 只显示 Error 级别
adb logcat -f /sdcard/log.txt       # 输出到文件

# 截图和录屏
adb shell screencap /sdcard/screen.png
adb pull /sdcard/screen.png
adb shell screenrecord /sdcard/video.mp4
adb shell screenrecord --time-limit 30 --size 720x1280

# 模拟按键
adb shell input keyevent 26         # 电源键
adb shell input keyevent 4          # 返回键
adb shell input keyevent 3          # Home 键
adb shell input text "Hello World"  # 输入文本

# 模拟触摸
adb shell input tap 500 500         # 点击坐标
adb shell input swipe 100 500 400 500  # 滑动

Fastboot 命令

bash
# 进入 fastboot 模式
adb reboot bootloader

# 设备管理
fastboot devices                    # 列出设备
fastboot oem unlock                 # 解锁 bootloader
fastboot oem lock                   # 锁定 bootloader

# 刷机操作
fastboot flash boot boot.img        # 刷入 boot 分区
fastboot flash system system.img    # 刷入 system 分区
fastboot flash userdata userdata.img # 刷入 userdata 分区
fastboot flash recovery recovery.img # 刷入 recovery 分区
fastboot update update.zip          # 通过 OTA 包更新

# 擦除分区
fastboot erase cache
fastboot erase userdata

# 重启
fastboot reboot
fastboot reboot recovery
fastboot reboot bootloader

Shell 交互

bash
# 进入设备 shell
adb shell

# 常用 Linux 命令
adb shell ls -la /sdcard/
adb shell cd /data/data && ls
adb shell cat /proc/meminfo
adb shell top -m 5                 # 查看进程
adb shell ps -A | grep com.example
adb shell kill -9 <pid>            # 杀死进程

# 文件操作
adb shell mkdir -p /sdcard/newdir
adb shell cp /sdcard/source /sdcard/dest
adb shell mv /sdcard/source /sdcard/dest
adb shell rm -rf /sdcard/temp
adb shell chmod 755 /data/local/tmp/script.sh

# 系统服务
adb shell service list              # 列出所有服务
adb shell service call phone 1 s16 "12345678901"  # 拨打电话
adb shell service call alarm 2 i32 300  # 设置闹钟

# dumpsys 系统诊断
adb shell dumpsys                  # 所有系统服务信息
adb shell dumpsys activity         # Activity 管理器
adb shell dumpsys meminfo          # 内存信息
adb shell dumpsys battery          # 电池状态
adb shell dumpsys wifi             # WiFi 状态
adb shell dumpsys input            # 输入系统
adb shell dumpsys power            # 电源管理

开发环境配置

Java 环境

bash
# 查看 Java 版本
java -version
javac -version

# 设置 JAVA_HOME(Windows)
[Environment]::SetEnvironmentVariable("JAVA_HOME", "C:\Program Files\Java\jdk-17", "Machine")
$env:PATH = "$env:JAVA_HOME\bin;$env:PATH"

# Android Studio 使用特定 JDK
# File -> Project Structure -> JDK Location
# 推荐使用 JDK 17 (LTS)

Android SDK 管理

bash
# 查看 SDK 管理器
sdkmanager --list                   # 列出可用包
sdkmanager --list_installed         # 已安装包
sdkmanager --list_updates           # 可更新包

# 安装组件
sdkmanager "platforms;android-34"
sdkmanager "build-tools;34.0.0"
sdkmanager "platform-tools"

# 安装命令行工具
sdkmanager "cmdline-tools;latest"

# 接受许可证
sdkmanager --licenses
yes | sdkmanager --licenses

# 更新 SDK
sdkmanager --update

Gradle 配置

groovy
// build.gradle (Project)
plugins {
    id 'com.android.application' version '8.2.0' apply false
    id 'org.jetbrains.kotlin.android' version '1.9.20' apply false
}

tasks.register('clean', Delete) {
    delete rootProject.buildDir
}

// build.gradle (Module)
android {
    namespace 'com.example.myapp'
    compileSdk 34

    defaultConfig {
        applicationId "com.example.myapp"
        minSdk 24
        targetSdk 34
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }

    buildTypes {
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
        debug {
            debuggable true
            applicationIdSuffix ".debug"
        }
    }

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_17
        targetCompatibility JavaVersion.VERSION_17
    }

    kotlinOptions {
        jvmTarget = '17'
    }

    buildFeatures {
        viewBinding true
        buildConfig true
    }

    lint {
        abortOnError false
        warningsAsErrors false
        checkDependencies true
    }
}

dependencies {
    implementation 'androidx.core:core-ktx:1.12.0'
    implementation 'androidx.appcompat:appcompat:1.6.1'
    implementation 'com.google.android.material:material:1.11.0'
    implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
    testImplementation 'junit:junit:4.13.2'
    androidTestImplementation 'androidx.test.ext:junit:1.1.5'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'
}
properties
# gradle.properties
org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8
android.useAndroidX=true
kotlin.code.style=official
android.nonTransitiveRClass=true
org.gradle.parallel=true
org.gradle.caching=true
properties
# gradle/wrapper/gradle-wrapper.properties
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.2-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists

环境变量配置

bash
# Windows (PowerShell)
# 设置 ANDROID_HOME
[Environment]::SetEnvironmentVariable("ANDROID_HOME", "C:\Users\$env:USERNAME\AppData\Local\Android\Sdk", "Machine")
[Environment]::SetEnvironmentVariable("ANDROID_SDK_ROOT", "C:\Users\$env:USERNAME\AppData\Local\Android\Sdk", "Machine")
$env:PATH = "$env:ANDROID_HOME\platform-tools;$env:ANDROID_HOME\cmdline-tools\latest\bin;$env:PATH"

# Linux/macOS (bash/zsh)
export ANDROID_HOME="$HOME/Android/Sdk"
export ANDROID_SDK_ROOT="$HOME/Android/Sdk"
export PATH="$PATH:$ANDROID_HOME/platform-tools"
export PATH="$PATH:$ANDROID_HOME/cmdline-tools/latest/bin"

构建命令

bash
# Debug 构建
./gradlew assembleDebug

# Release 构建
./gradlew assembleRelease

# 运行测试
./gradlew test
./gradlew connectedAndroidTest

# 代码检查
./gradlew lint
./gradlew ktlintCheck

# 清理构建
./gradlew clean

# 构建所有变体
./gradlew build

# 查看依赖树
./gradlew app:dependencies

# 构建报告
./gradlew build --info
./gradlew build --stacktrace

常见操作与技巧

性能优化

bash
# 分析应用启动时间
adb shell am start -W -n com.example/.MainActivity
# 输出:
# Starting: Intent { cmp=com.example/.MainActivity }
# Status: ok
# LaunchState: COLD
# Activity: com.example/.MainActivity
# TotalTime: 523
# WaitTime: 536

# 分析布局性能
adb shell dumpsys activity activities | grep -E "mResumedActivity|mFocusedActivity"
adb shell dumpsys gfxinfo com.example

# 重置 gfxinfo 数据
adb shell dumpsys gfxinfo com.example reset

# 分析内存使用
adb shell dumpsys meminfo com.example
adb shell dumpsys meminfo --package com.example

# 获取内存快照
adb shell am dumpheap com.example /sdcard/heap.hprof
adb pull /sdcard/heap.hprof

# 分析电池使用
adb shell dumpsys batterystats > batterystats.txt
adb shell bugreport > bugreport.zip

调试技巧

bash
# 查看布局层次结构
adb shell dumpsys activity activities

# 调试布局
adb shell setprop debug.layout true
adb shell settings put global force_debuggable 1

# 网络调试
adb shell settings put global http_proxy 192.168.1.100:8888

# 数据库检查
adb shell sqlite3 /data/data/com.example/databases/app.db
# .tables
# .schema
# SELECT * FROM users;

# SharedPreferences 检查
adb shell dumpsys package com.example | grep -A 10 "Preference"
adb shell cat /data/data/com.example/shared_prefs/settings.xml

# 捕获 ANR
adb pull /data/anr/traces.txt

# 获取应用崩溃日志
adb logcat | grep -E "FATAL|AndroidRuntime|CRASH"

设备管理

bash
# 模拟各种状态
adb shell settings put global airplane_mode_on 1
adb shell am broadcast -a android.intent.action.AIRPLANE_MODE

# 模拟位置
adb shell gps set 37.7749 -122.4194

# 模拟网络条件
adb shell settings put global network_scoring_ui_enabled 1
adb shell cmd netpolicy add restrict-background uid 10086

# 模拟电池状态
adb shell dumpsys battery unplug
adb shell dumpsys battery reset

# 设置电池电量
adb shell dumpsys battery set level 50
adb shell dumpsys battery set status charging

备份与恢复

bash
# 使用 adb backup
adb backup -f backup.ab -apk -system com.example

# 恢复备份
adb restore backup.ab

# 使用 Android Backup Service
# 需要实现 BackupAgent
public class MyBackupAgent extends BackupAgent {
    @Override
    public void onBackup(ParcelFileDescriptor oldState,
                         BackupDataOutput data,
                         ParcelFileDescriptor newState) throws IOException {
        // 备份逻辑
    }

    @Override
    public void onRestore(BackupDataInput data,
                          int appVersionCode,
                          ParcelFileDescriptor newState) throws IOException {
        // 恢复逻辑
    }
}

最佳实践

应用架构推荐

kotlin
// 遵循 Clean Architecture 原则
// Presentation Layer
@Composable
fun MainScreen(viewModel: MainViewModel = hiltViewModel()) {
    val state by viewModel.uiState.collectAsState()
    // UI 实现
}

// Domain Layer
class GetUserUseCase(private val repository: UserRepository) {
    suspend operator fun invoke(userId: String): Result<User> {
        return repository.getUser(userId)
    }
}

// Data Layer
class UserRepositoryImpl(
    private val localDataSource: UserLocalDataSource,
    private val remoteDataSource: UserRemoteDataSource
) : UserRepository {
    override suspend fun getUser(userId: String): Result<User> {
        return try {
            val user = remoteDataSource.fetchUser(userId)
            localDataSource.cacheUser(user)
            Result.success(user)
        } catch (e: Exception) {
            val cached = localDataSource.getCachedUser(userId)
            cached?.let { Result.success(it) } ?: Result.failure(e)
        }
    }
}

性能优化技巧

kotlin
// 1. 使用协程处理异步操作
viewModelScope.launch {
    val data = withContext(Dispatchers.IO) {
        repository.fetchData()
    }
    _uiState.value = data
}

// 2. 避免内存泄漏
class MyFragment : Fragment() {
    private var binding: FragmentBinding? = null

    override fun onDestroyView() {
        super.onDestroyView()
        binding = null  // 防止内存泄漏
    }
}

// 3. 使用懒加载
private val viewModel: MainViewModel by viewModels()

// 4. 优化列表加载
RecyclerView.Adapter<VH>().apply {
    setHasStableIds(true)
}

// 5. 资源优化
// 使用 vector drawable
// 实现图片加载库(如 Coil、Glide)
// 压缩资源文件

安全性最佳实践

kotlin
// 1. 使用加密存储
val sharedPrefs = EncryptedSharedPreferences.create(
    context,
    "secure_prefs",
    MasterKey.Builder(context)
        .setKeyScheme(MasterKey.KeyScheme.AES256_GCM)
        .build(),
    EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,
    EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM
)

// 2. 网络安全配置
// res/xml/network_security_config.xml
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config cleartextTrafficPermitted="false">
        <trust-anchors>
            <certificates src="system" />
        </trust-anchors>
    </base-config>
    <domain-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">10.0.2.2</domain>
    </domain-config>
</network-security-config>

// 3. ProGuard 规则
-keepattributes Signature
-keepattributes *Annotation*
-keep class com.example.model.** { *; }
-keepclassmembers class com.example.model.** { *; }

发布流程

bash
# 1. 版本管理
# 更新 versionName 和 versionCode
# AndroidManifest.xml 或 build.gradle

# 2. 构建 Release APK
./gradlew assembleRelease

# 3. 生成签名
keytool -genkey -v -keystore my-release-key.keystore \
    -alias alias_name -keyalg RSA -keysize 2048 -validity 10000

# 4. 对齐优化
zipalign -v 4 app-release-unaligned.apk app-release.apk

# 5. 生成 AAB (Android App Bundle)
./gradlew bundleRelease

# 6. 使用 App Signing
# 上传 .keystore 到 Google Play Console
# Google Play 会自动优化 APK

常见问题解决

ADB 连接问题

bash
# 设备未识别
adb kill-server
adb start-server
adb devices

# 授权问题
# 在设备上撤销 USB 调试授权
# 重新连接并接受调试授权

# USB 驱动问题
# 安装 Google USB Driver 或 OEM 驱动

# WiFi 连接
adb tcpip 5555
adb connect <device_ip>:5555

构建问题

bash
# 清理 Gradle 缓存
rm -rf ~/.gradle/caches/
rm -rf build/ app/build/

# 同步项目
./gradlew --refresh-dependencies

# 查看详细错误
./gradlew build --stacktrace --info

# 内存不足
# 修改 gradle.properties
org.gradle.jvmargs=-Xmx4096m -XX:+HeapDumpOnOutOfMemoryError

性能问题排查

bash
# 布局渲染慢
adb shell dumpsys gfxinfo com.example framestats

# 内存泄漏
# 使用 Android Studio Profiler
# MAT (Memory Analyzer Tool) 分析 hprof 文件

# 卡顿问题
# 开启 GPU 渲染分析
adb shell setprop debug.hwui.profile true
adb shell setprop debug.hwui.profile visual_bars

# 启动慢
# 使用 Android App Startup Library
# 延迟初始化非必要组件