Android开发环境搭建与MVVM架构实战指南
1. Android开发环境搭建与工具链配置1.1 Android Studio安装与汉化Android Studio作为官方推荐的集成开发环境是每个Android开发者必须掌握的工具。最新版本2023.3.1在性能优化和AI辅助编码方面有显著提升。安装时需要注意访问官网下载对应操作系统的安装包Windows/macOS/Linux安装JDK 17或更高版本Android Studio Giraffe开始要求JDK 17运行安装向导时勾选Android Virtual Device选项首次启动时选择Custom安装类型确保勾选所有必要的SDK组件汉化方法官方不提供中文语言包但可通过插件实现安装Chinese (Simplified) Language Pack插件或手动替换resources_zh.jar语言包需注意版本兼容性注意汉化可能导致某些专业术语翻译不准确建议开发者逐步过渡到英文界面1.2 SDK与Gradle配置SDK Manager中必须安装的组件Android SDK Platform对应目标API级别Google Play服务Android EmulatorAndroid SDK Build-ToolsNDK如需开发原生代码Gradle配置优化android { compileSdkVersion 34 buildToolsVersion 34.0.0 defaultConfig { minSdkVersion 23 targetSdkVersion 34 versionCode 1 versionName 1.0 } buildTypes { release { minifyEnabled true proguardFiles getDefaultProguardFile(proguard-android-optimize.txt), proguard-rules.pro } } }2. Android应用基础架构设计2.1 MVVM架构实现现代Android开发推荐使用MVVMModel-View-ViewModel架构结合Jetpack组件实现添加依赖implementation androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.2 implementation androidx.lifecycle:lifecycle-livedata-ktx:2.6.2 implementation androidx.activity:activity-ktx:1.8.0ViewModel基础实现class MainViewModel : ViewModel() { private val _data MutableLiveDataString() val data: LiveDataString _data fun fetchData() { viewModelScope.launch { _data.value Repository.getData() } } }Activity/Fragment中观察数据viewModel.data.observe(this) { data - // 更新UI }2.2 动态图标与主题实现Android 12支持动态图标主题实现步骤创建自适应图标adaptive-icon xmlns:androidhttp://schemas.android.com/apk/res/android background android:drawabledrawable/ic_background/ foreground android:drawabledrawable/ic_foreground/ /adaptive-icon在Manifest中声明主题颜色meta-data android:nameandroid.dynamic_icon_metadata android:resourcexml/dynamic_icon_metadata /动态切换主题when (mode) { DARK - setTheme(R.style.Theme_App_Dark) LIGHT - setTheme(R.style.Theme_App_Light) }3. Android高级功能开发3.1 蓝牙通信实现实现蓝牙设备发现与连接的核心代码权限声明uses-permission android:nameandroid.permission.BLUETOOTH/ uses-permission android:nameandroid.permission.BLUETOOTH_ADMIN/ uses-permission android:nameandroid.permission.ACCESS_FINE_LOCATION/蓝牙设备扫描val bluetoothAdapter: BluetoothAdapter? BluetoothAdapter.getDefaultAdapter() val bluetoothLeScanner bluetoothAdapter?.bluetoothLeScanner val scanCallback object : ScanCallback() { override fun onScanResult(callbackType: Int, result: ScanResult) { // 处理发现的设备 } } bluetoothLeScanner?.startScan(scanCallback)数据传输val socket device.createRfcommSocketToServiceRecord(UUID.fromString(00001101-0000-1000-8000-00805F9B34FB)) socket.connect() val outputStream socket.outputStream outputStream.write(data.toByteArray())3.2 短信与彩信发送使用SmsManager发送短信和彩信发送短信val smsManager SmsManager.getDefault() smsManager.sendTextMessage( phoneNumber, null, message, null, null )发送彩信val smsManager SmsManager.getDefault() val parts smsManager.divideMessage(message) val sentIntents parts.map { PendingIntent.getBroadcast(...) } val deliveryIntents parts.map { PendingIntent.getBroadcast(...) } smsManager.sendMultimediaMessage( context, contentUri, null, null, sentIntent )注意Android 8.0需要动态请求SMS权限且部分运营商可能限制彩信发送4. Android系统集成与优化4.1 ADB高级用法通过ADB Shell执行设备操作推送和执行脚本adb push up.sh /storage/emulated/0/Android/data/com.omarea.vtools/ adb shell sh /storage/emulated/0/Android/data/com.omarea.vtools/up.sh常用ADB命令查看设备日志adb logcat安装APKadb install app.apk卸载应用adb uninstall package.name屏幕截图adb exec-out screencap -p screen.png4.2 性能优化技巧内存优化使用Memory Profiler检测内存泄漏避免在onDraw()中创建对象使用WeakReference持有大对象引用启动优化// Application中初始化耗时操作 class MyApp : Application() { override fun onCreate() { super.onCreate() // 使用后台线程初始化 startInitialization() } private fun startInitialization() { val startupExecutor Executors.newSingleThreadExecutor() startupExecutor.execute { // 初始化代码 } } }布局优化使用ConstraintLayout减少布局层级合并重复布局 标签使用ViewStub延迟加载5. 常见问题解决方案5.1 Android Studio疑难解答Missing JCEF runtime错误下载匹配的jcef版本放置到Android Studio安装目录的jbr目录下或降级到稳定版本Unable to access Android SDK add-on list检查网络连接设置HTTP代理手动下载SDK组件构建速度慢# gradle.properties org.gradle.daemontrue org.gradle.paralleltrue org.gradle.cachingtrue android.enableBuildCachetrue5.2 设备兼容性问题不同API级别适配if (Build.VERSION.SDK_INT Build.VERSION_CODES.O) { // 新API实现 } else { // 兼容实现 }存储访问适配使用MediaStore API替代直接文件路径通过FileProvider共享文件处理Scoped Storage限制权限管理最佳实践val requestPermissionLauncher registerForActivityResult( ActivityResultContracts.RequestPermission() ) { isGranted - if (isGranted) { // 权限已授予 } else { // 解释为什么需要此权限 } } requestPermissionLauncher.launch(Manifest.permission.ACCESS_FINE_LOCATION)6. 项目实战天气预报应用开发6.1 数据层实现Retrofit网络请求配置interface WeatherApi { GET(weather) suspend fun getWeather( Query(q) city: String, Query(appid) apiKey: String ): ResponseWeatherResponse } val retrofit Retrofit.Builder() .baseUrl(https://api.openweathermap.org/data/2.5/) .addConverterFactory(GsonConverterFactory.create()) .build()数据库缓存RoomEntity data class WeatherCache( PrimaryKey val city: String, val data: String, val timestamp: Long ) Dao interface WeatherDao { Insert(onConflict OnConflictStrategy.REPLACE) suspend fun insert(cache: WeatherCache) Query(SELECT * FROM WeatherCache WHERE city :city) suspend fun get(city: String): WeatherCache? }6.2 UI层实现Compose界面Composable fun WeatherScreen(viewModel: WeatherViewModel viewModel()) { val state by viewModel.state.collectAsState() Column(modifier Modifier.padding(16.dp)) { SearchBar(onSearch { viewModel.search(it) }) when { state.isLoading - LoadingIndicator() state.error ! null - ErrorMessage(state.error) else - WeatherInfo(state.weatherData) } } }天气数据显示Composable fun WeatherInfo(data: WeatherData) { Card(elevation 4.dp) { Column(modifier Modifier.padding(16.dp)) { Text(text data.city, style MaterialTheme.typography.h4) Text(text ${data.temperature}°C, style MaterialTheme.typography.h2) Row { Icon(painter painterResource(id data.iconRes), contentDescription null) Text(text data.description) } // 更多天气信息... } } }7. 发布与分发7.1 APK打包与签名生成签名密钥keytool -genkey -v -keystore my-release-key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias my-alias配置build.gradleandroid { signingConfigs { release { storeFile file(my-release-key.jks) storePassword password keyAlias my-alias keyPassword password } } buildTypes { release { signingConfig signingConfigs.release } } }生成APK菜单栏 Build Generate Signed Bundle/APK或命令行./gradlew assembleRelease7.2 应用商店发布Google Play发布流程创建开发者账号需支付25美元费用准备应用元数据标题、描述、截图等上传APK或AAB文件配置定价和分发范围提交审核通常需要1-3天提示发布前务必进行充分的测试包括不同设备、API级别的兼容性测试8. 持续学习与资源推荐8.1 官方学习资源Android开发者官网文档developer.android.com/docsCodelabsdeveloper.android.com/codelabs示例代码github.com/android官方认证课程Android Basics in KotlinAndroid Kotlin FundamentalsAdvanced Android in Kotlin8.2 社区与工具优质开源项目Android Arsenalandroid-arsenal.comAwesome Androidgithub.com/JStumpp/awesome-android开发工具推荐Firebase实时数据库、分析、CrashlyticsLeakCanary内存泄漏检测Chucker网络请求监控调试工具StethoFacebook调试工具Layout Inspector布局检查Profiler性能分析