跳转至

附录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版本不匹配

错误信息:

Text Only
Could not open init generic class cache for initialization script

解决方案: 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"问题

解决方案:

Bash
# 接受Android licenses
flutter doctor --android-licenses

# 更新Android SDK
sdkmanager --update

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图片格式

Kotlin
android {
    buildTypes {
        release {
            isMinifyEnabled = true
            isShrinkResources = true
        }
    }
}

Q18: 如何调试Release版本?

Kotlin
android {
    buildTypes {
        release {
            isDebuggable = true
            signingConfig = signingConfigs.debug
        }
    }
}

7. 获取更多帮助