关于安卓Android studio Didn't find class "com.xx.MainActivity" on path: DexPathList[[zip……的解决

本文详细介绍了在Android应用开发中遇到的MultiDex问题及其解决方案。主要针对Android 4.4版本以下设备上出现的ClassNotFoundException,通过调整Build.gradle配置及自定义Application实现multiDex分包编译。

关于安卓Android studio Didn’t find class “com.xx.MainActivity” on path: DexPathList[[zip……的解决

本文参考自简书:multiDexEnabled遇坑简记,感谢作者大大!!!

1、我的问题

首先说一下我的问题,我写的项目在安卓5.0以上的手机上运行的时候没有任何问题,但是在安卓4.4的手机上确直接闪退,报错Didn’t find class “com.xx.MainActivity” on path: DexPathList[[zip……,找不到MainActivity?什么鬼?然后查百度的时候有的人说是没有注册Activity,有的人说把build文件夹删去,clean project然后rebuild就好了,但是本人经过试验都不是这些错误,最后灵光乍现怀疑是不是因为在build gradle中配置了multiDexEnabled true的原因,顺着这个思路去查找,真的找到了答案,十分幸运在一天之内解决了这个恶心的问题。

//在build.grudle中我配置了:
defaultConfig {
    /**添加多 dex分包支持*/
    multiDexEnabled true
}

2、出错原因

先来说一下为什么要配置multiDexEnabled true,因为我们代码的总的方法数超过了goole规定的65535个方法,导致了jvm不能编译通过我们的代码,这是后就需要使用multiDexEnabled true来进行分包编译打包(不知道是什么名字,瞎叫的),就是我们把项目打成多个编译包(dex文件),而不是一个dex文件,这在安卓5.0以上没有问题,因为5.0系统上使用art 支持多dex,但是低版本dalvik默认先加载主dex,如果启动时需要的类不在主dex内就会报错ClassNotFoundException,所以会报这个错。

如何进行multiDex分包编译打包?

这里多写一些关于如何使用multiDex的内容,不需要使用multiDexEnabled true的朋友请自行略过:

(1)在 build.gradle(app或其他需要的模块)中配置支持multiDex:
//在build.grudle中配置:
defaultConfig {
    /**添加多 dex分包支持*/
    multiDexEnabled true
}
(2)在 build.gradle添加multiDex打包需要的依赖库:
dependencies {
    //新版本使用implementation关键字,旧版本请使用compile 'com.android.support:multidex:1.0.1'
    implementation 'com.android.support:multidex:1.0.1'
}
(3)自定义Application:

我们需要使用自定义的Application,没有自定义的小伙伴们需要自己自定义一个类继承android.support.multidex.MultiDexApplication,自定义了Application的小伙伴们也需要把继承的父类改成这个类,另外还需要在AndroidManifest.xml中把Application的name改成自己定义的Application:

<application
        android:name=".MyApplication"
        #其他属性………
</application>
(4)还需要最后一步,重写自定义的Application的attachBaseContext()方法:
@Override
protected void attachBaseContext(android.content.Context base) {
    super.attachBaseContext(base);
    android.support.multidex.MultiDex.install(this);
}

到此,multidex的配置就大功告成了!

3、解决方法

经过解压apk得知,发现里面有32个dex文件,一般不会拆分如此多,对于dex 的–multi-dex 选项设置与预编译的library工程有冲突,如果你的应用中包含引用的lirary工程,需要将预编译设置为false,即在 build.gradle中添加:

defaultConfig {
    /**添加多 dex分包支持*/
    multiDexEnabled true
    dexOptions{
        preDexLibraries = false
    }
}

再次编译打包后(建议还是先clean project一下并卸载原来的APP,以免出问题),apk内部只有2个dex文件,测试在4.4系统上完美运行!
最后再次感谢multiDexEnabled遇坑简记 的作者大大,撒花支持!

安卓java 2025-12-18 17:12:23.103 10095-10095/com.example.demo251216 E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.demo251216, PID: 10095 java.lang.NoClassDefFoundError: Failed resolution of: Lkotlin/jvm/internal/Intrinsics; at com.skydroid.rcsdk.RCSDKManager.initSDK(Unknown Source:2) at com.example.demo251216.MainActivity.openData(MainActivity.java:293) at com.example.demo251216.MainActivity.onCreate(MainActivity.java:154) at android.app.Activity.performCreate(Activity.java:7023) at android.app.Activity.performCreate(Activity.java:7014) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1215) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2734) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2859) at android.app.ActivityThread.-wrap11(Unknown Source:0) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1592) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loop(Looper.java:164) at android.app.ActivityThread.main(ActivityThread.java:6518) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807) Caused by: java.lang.ClassNotFoundException: Didn’t find class “kotlin.jvm.internal.Intrinsics” on path: DexPathList[[zip file “/data/app/com.example.demo251216-9FQl5OevwxmaNwhMwMtxdw==/base.apk”],nativeLibraryDirectories=[/data/app/com.example.demo251216-9FQl5OevwxmaNwhMwMtxdw==/lib/arm64, /data/app/com.example.demo251216-9FQl5OevwxmaNwhMwMtxdw==/base.apk!/lib/arm64-v8a, /system/lib64, /vendor/lib64]] at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:125) at java.lang.ClassLoader.loadClass(ClassLoader.java:379) at java.lang.ClassLoader.loadClass(ClassLoader.java:312) at com.skydroid.rcsdk.RCSDKManager.initSDK(Unknown Source:2) at com.example.demo251216.MainActivity.openData(MainActivity.java:293) at com.example.demo251216.MainActivity.onCreate(MainActivity.java:154) at android.app.Activity.performCreate(Activity.java:7023) at android.app.Activity.performCreate(Activity.java:7014) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1215) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2734) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2859) at android.app.ActivityThread.-wrap11(Unknown Source:0) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1592) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loop(Looper.java:164) at android.app.ActivityThread.main(ActivityThread.java:6518) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
最新发布
12-19
<think> 这个错误通常发生在Android应用中,表示系统无法找到指定的Activity类。可能的原因和解决方案如下: ### 可能原因: 1. **Activity未在AndroidManifest.xml中声明**:如果Activity没有在清单文件中正确声明,系统将无法识别它。 2. **包名或类名拼写错误**:清单文件中声明的Activity类名与实际的类名不匹配。 3. **ProGuard/R8混淆问题**:如果启用了代码压缩和混淆,可能会移除或重命名某些类。 4. **构建问题**:可能是构建过程中出现了问题,导致某些类没有被正确打包进APK。 5. **多DEX文件问题**:如果应用启用了multidex,并且方法数超过65536,而主DEX文件中没有包含启动Activity,也可能导致这个问题。 ### 解决方案: #### 1. 检查AndroidManifest.xml 确保Activity已在清单文件中正确声明,并且包名和类名正确。 ```xml <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.screenrecord111"> <application ...> <activity android:name=".MainActivity" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest> ``` 如果Activity不在默认包(即`com.example.screenrecord111`)内,则需要使用完整类名,例如: ```xml <activity android:name="com.example.screenrecord111.ui.MainActivity" ... /> ``` #### 2. 检查类名和包名 确保`MainActivity`类的包名与清单文件中声明的包名一致。如果应用包是`com.example.screenrecord111`,则`MainActivity`应该位于`com.example.screenrecord111`包下。 #### 3. 检查构建配置 如果启用了ProGuard或R8,确保在混淆规则中保留了Activity类。在`proguard-rules.pro`文件中添加: ``` -keep public class com.example.screenrecord111.MainActivity ``` #### 4. 清理并重新构建项目 有时候构建过程中可能出现问题,尝试清理并重新构建项目: - 在Android Studio中,选择菜单栏的`Build -> Clean Project`,然后`Build -> Rebuild Project`。 #### 5. 检查multidex配置 如果应用启用了multidex,确保主DEX文件中包含了启动Activity。在`build.gradle`文件中,添加以下配置: ```groovy android { defaultConfig { multiDexEnabled true } } dependencies { implementation 'androidx.multidex:multidex:2.0.1' } ``` 同时,在`Application`类中初始化multidex: ```java public class MyApplication extends Application { @Override protected void attachBaseContext(Context base) { super.attachBaseContext(base); MultiDex.install(this); } } ``` 并在清单文件中指定这个Application类: ```xml <application android:name=".MyApplication" ... > </application> ``` #### 6. 检查依赖冲突 有时候依赖冲突可能导致类加载失败。可以尝试检查依赖树,解决冲突: ``` ./gradlew app:dependencies ``` #### 7. 检查安装的APK 如果问题仍然存在,可以检查生成的APK中是否包含`MainActivity`类: - 使用Android Studio的`Build -> Analyze APK...`,打开生成的APK文件,查看dex文件中是否存在`MainActivity`类。 ### 代码示例:一个简单的MainActivity 确保你的`MainActivity`类存在且继承自`AppCompatActivity`(或`Activity`): ```kotlin package com.example.screenrecord111 import androidx.appcompat.app.AppCompatActivity import android.os.Bundle class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) } } ``` ### 其他可能的解决方案: - **检查是否安装了最新版本的Android Support库**:在`build.gradle`中确保使用了最新的依赖。 - **检查IDE缓存**:尝试使缓存无效并重启Android Studio:`File -> Invalidate Caches / Restart`。 §§相关问题§§: 1. 如何解决Android中的ClassNotFoundException? 2. Android中如何正确配置multidex? 3. ProGuard和R8有什么区别?如何配置混淆规则? 4. 如何分析APK文件的内容? </think># Android ClassNotFoundException 解决方案 这个错误表示 Android 系统无法找到并实例化 `MainActivity` 类。这通常是由构建或配置问题引起的。以下是完整的解决方案: ## 根本原因分析 ```mermaid graph TD A[ClassNotFoundException] --> B[类路径问题] A --> C[构建系统问题] A --> D[配置问题] B --> B1[类未正确打包] B --> B2[多DEX配置错误] C --> C1[构建缓存问题] C --> C2[Gradle配置错误] D --> D1[AndroidManifest声明错误] D --> D2[包名不匹配] ``` ## 完整解决方案 ### 1. 清理并重建项目 ```bash # 在项目根目录执行 ./gradlew clean ./gradlew assembleDebug ``` 在 Android Studio 中: - **Build > Clean Project** - **Build > Rebuild Project** ### 2. 检查 MainActivity 声明 在 `AndroidManifest.xml` 中确保正确声明: ```xml <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.screenrecord111"> <application> <activity android:name=".MainActivity" <!-- 确保使用点号前缀 --> android:exported="true"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest> ``` ### 3. 验证包名一致性 检查以下位置的包名是否一致: 1. `build.gradle` 中的 `applicationId` 2. `AndroidManifest.xml` 中的 `package` 3. 实际 Java/Kotlin 文件中的包声明 **build.gradle**: ```groovy android { defaultConfig { applicationId "com.example.screenrecord111" // 必须一致 minSdk 24 targetSdk 34 versionCode 1 versionName "1.0" } } ``` ### 4. 多DEX配置 如果方法数超过 64K,在 `build.gradle` 中启用 multidex: ```groovy android { defaultConfig { multiDexEnabled true } } dependencies { implementation 'androidx.multidex:multidex:2.0.1' } ``` 在 `Application` 类中初始化: ```java public class MyApplication extends Application { @Override protected void attachBaseContext(Context base) { super.attachBaseContext(base); MultiDex.install(this); } } ``` ### 5. 验证构建变体 在 Android Studio 中: 1. 查看 **Build Variants** 窗口 2. 确保选择了正确的构建变体(通常是 `debug`) 3. 确保模块选择正确(通常是 `app`) ### 6. 检查依赖冲突 在终端运行: ```bash ./gradlew :app:dependencies ``` 查看是否有冲突的依赖版本,并解决冲突: ```groovy configurations.all { resolutionStrategy { force 'com.android.support:appcompat-v7:28.0.0' force 'com.android.support:support-v4:28.0.0' } } ``` ### 7. 清除缓存并重启 在 Android Studio 中: 1. **File > Invalidate Caches / Restart...** 2. 选择 **Invalidate and Restart** ### 8. 检查 ProGuard/R8 配置 在 `proguard-rules.pro` 中添加: ``` -keep public class com.example.screenrecord111.MainActivity { *; } ``` 在 `build.gradle` 中禁用混淆进行测试: ```groovy buildTypes { debug { minifyEnabled false shrinkResources false } } ``` ### 9. 完整的 build.gradle 示例 ```groovy plugins { id 'com.android.application' id 'org.jetbrains.kotlin.android' } android { namespace 'com.example.screenrecord111' compileSdk 34 defaultConfig { applicationId "com.example.screenrecord111" minSdk 24 targetSdk 34 versionCode 1 versionName "1.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" multiDexEnabled true // 启用 multidex } buildTypes { release { minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } debug { minifyEnabled false } } compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } kotlinOptions { jvmTarget = '1.8' } buildFeatures { viewBinding 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' // Multidex 支持 implementation 'androidx.multidex:multidex:2.0.1' testImplementation 'junit:junit:4.13.2' androidTestImplementation 'androidx.test.ext:junit:1.1.5' androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1' } ``` ### 10. 验证安装的 APK 1. 使用 Android Studio 的 **Build > Analyze APK...** 2. 选择生成的 APK 文件 3. 检查 `classes.dex` 文件中是否包含 `MainActivity` 类 ## 调试工具和方法 ### 1. ADB 命令检查 ```bash # 列出已安装包 adb shell pm list packages | grep screenrecord111 # 检查主 Activity adb shell dumpsys package com.example.screenrecord111 | grep -A 1 MAIN ``` ### 2. 日志分析 在 `Application` 类中添加初始化日志: ```java public class MyApplication extends Application { @Override public void onCreate() { super.onCreate(); Log.d("AppInit", "Application created"); } } ``` 在 `AndroidManifest.xml` 中声明: ```xml <application android:name=".MyApplication" ... > </application> ``` ### 3. 类加载调试 在 `MainActivity` 中添加静态初始化块: ```java public class MainActivity extends AppCompatActivity { static { System.loadLibrary("mainactivity"); Log.d("ClassLoad", "MainActivity loaded"); } // ... } ``` ## 预防措施 1. **遵循命名规范**: ```mermaid graph LR A[包名] --> B[com.company.app] C[Activity类] --> D[后缀Activity] E[布局文件] --> F[activity_main.xml] ``` 2. **构建配置检查表**: - [ ] `applicationId` 匹配包名 - [ ] 清单文件中的 Activity 声明正确 - [ ] 启用了 multidex(如果需要) - [ ] 没有过时的依赖 - [ ] ProGuard/R8 配置正确 3. **持续集成配置**: ```yaml # .github/workflows/android.yml name: Android CI on: [push] jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Set up JDK 17 uses: actions/setup-java@v4 with: java-version: '17' distribution: 'temurin' - name: Grant execute permission for gradlew run: chmod +x gradlew - name: Build with Gradle run: ./gradlew clean assembleDebug - name: Analyze APK run: | unzip -l app/build/outputs/apk/debug/app-debug.apk | grep MainActivity ``` ## 替代方案:创建一个新的启动 Activity 如果问题仍然存在,可以尝试创建新的启动 Activity: 1. 创建新的 Activity: ```java // NewMainActivity.java package com.example.screenrecord111; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; public class NewMainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } } ``` 2. 更新 `AndroidManifest.xml`: ```xml <activity android:name=".NewMainActivity" android:exported="true"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> ``` 3. 删除旧的 `MainActivity` 类
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值