附录B 常见问题解答¶
Android开发常见问题及解决方案
1. 环境配置问题¶
Q1: Gradle同步失败,提示"Could not resolve all dependencies"¶
解决方案:
Kotlin
// 在build.gradle.kts (Project)中添加阿里云镜像
pluginManagement {
repositories {
maven { url = uri("https://maven.aliyun.com/repository/public") }
maven { url = uri("https://maven.aliyun.com/repository/google") }
google()
mavenCentral()
}
}
dependencyResolutionManagement {
repositories {
maven { url = uri("https://maven.aliyun.com/repository/public") }
maven { url = uri("https://maven.aliyun.com/repository/google") }
google()
mavenCentral()
}
}
Q2: JDK版本不匹配¶
错误信息:
解决方案: 1. 检查JDK版本:java -version 2. 确保使用JDK 17 3. 在IDE中配置JDK路径 4. 设置JAVA_HOME环境变量
Q3: Android SDK未找到¶
解决方案:
Bash
# 设置ANDROID_HOME环境变量
# Windows
setx ANDROID_HOME "C:\Users\<用户名>\AppData\Local\Android\Sdk"
# macOS/Linux
export ANDROID_HOME=$HOME/Android/Sdk
export PATH=$PATH:$ANDROID_HOME/tools:$ANDROID_HOME/platform-tools
2. 编译问题¶
Q4: 编译时出现"Duplicate class found"¶
解决方案:
Kotlin
// 在build.gradle.kts中排除重复依赖
dependencies {
implementation("some.library") {
exclude(group = "com.duplicate", module = "duplicate-module")
}
}
Q5: OutOfMemoryError during build¶
解决方案:
Properties
# 在gradle.properties中增加内存
org.gradle.jvmargs=-Xmx8192m -XX:MaxMetaspaceSize=512m
org.gradle.parallel=true
org.gradle.caching=true
Q6: Compose编译错误"Unresolved reference"¶
解决方案:
Kotlin
// 确保使用正确的BOM版本
val composeBom = platform("androidx.compose:compose-bom:2024.10.01")
implementation(composeBom)
androidTestImplementation(composeBom)
// 不要指定版本号
implementation("androidx.compose.ui:ui") // ✅
implementation("androidx.compose.ui:ui:1.5.0") // ❌
3. 运行时问题¶
Q7: App启动崩溃,日志显示"ClassNotFoundException"¶
可能原因: 1. ProGuard/R8混淆了需要的类 2. multidex配置问题
解决方案:
Text Only
# 保留类
-keep public class com.example.** { *; }
# 保留序列化类
-keepclassmembers class * implements java.io.Serializable {
*;
}
Q8: 网络请求失败,提示"Cleartext HTTP traffic not permitted"¶
解决方案:
XML
<!-- res/xml/network_security_config.xml -->
<network-security-config>
<base-config cleartextTrafficPermitted="true">
<trust-anchors>
<certificates src="system"/>
</trust-anchors>
</base-config>
</network-security-config>
XML
<!-- AndroidManifest.xml -->
<application
android:networkSecurityConfig="@xml/network_security_config">
</application>
Q9: Room数据库迁移失败¶
解决方案:
Kotlin
// 添加迁移策略
val MIGRATION_1_2 = object : Migration(1, 2) {
override fun migrate(database: SupportSQLiteDatabase) {
database.execSQL("ALTER TABLE users ADD COLUMN age INTEGER DEFAULT 0")
}
}
Room.databaseBuilder(context, AppDatabase::class.java, "database")
.addMigrations(MIGRATION_1_2)
.build()
4. 性能问题¶
Q10: 应用启动速度慢¶
优化方案: 1. 延迟初始化非必要组件 2. 使用SplashScreen API 3. 减少Application.onCreate中的工作 4. 使用Profile Installer分析启动过程
Kotlin
class MyApplication : Application() {
override fun onCreate() {
super.onCreate()
// 延迟初始化
lifecycleScope.launch {
initThirdPartySDKs()
}
}
}
Q11: 内存泄漏检测¶
解决方案:
Kotlin
// 使用LeakCanary
dependencies {
debugImplementation("com.squareup.leakcanary:leakcanary-android:2.14")
}
Q12: 列表滚动卡顿¶
优化方案:
Kotlin
// 使用LazyColumn代替Column
LazyColumn {
items(data, key = { it.id }) { item ->
ListItem(item)
}
}
// 避免在item中创建对象
@Composable
fun ListItem(item: Item) {
// ❌ 每次重组都创建
val formatter = remember { SimpleDateFormat("yyyy-MM-dd", Locale.getDefault()) }
// ✅ 使用remember
val formatter = remember { SimpleDateFormat() }
}
5. Flutter相关问题¶
Q13: Flutter doctor提示"Android toolchain"问题¶
解决方案:
Q14: Flutter热重载不工作¶
解决方案: 1. 确保使用flutter run启动,不是flutter build 2. 检查文件是否保存 3. 尝试热重启(R键)
Q15: Flutter与原生通信失败¶
解决方案:
Kotlin
// 确保Channel名称一致
const val CHANNEL = "com.example/channel"
// Flutter端
const platform = MethodChannel('com.example/channel');
// Android端
MethodChannel(flutterEngine.dartExecutor.binaryMessenger, "com.example/channel")
6. 其他问题¶
Q16: 如何查看应用签名信息?¶
Bash
# 查看APK签名
keytool -list -printcert -jarfile app.apk
# 查看Keystore
keytool -list -v -keystore my-key.jks
Q17: 如何降低APK体积?¶
方案: 1. 启用ProGuard/R8 2. 使用Android App Bundle 3. 移除无用资源 4. 使用WebP图片格式
Q18: 如何调试Release版本?¶
Kotlin
android {
buildTypes {
release {
isDebuggable = true
signingConfig = signingConfigs.debug
}
}
}