Java.lang.ClassNotFoundException: 在路径上未找到类".MainActivity",DexPathList反应原生。

17

我正在使用react-native编写移动应用程序。尽管我没有接触任何本地代码,但应用程序在运行后就停止了。我对react native组件进行了一些更改,但没有使用任何新内容。我在Android Studio中进行了调试,以下是错误信息:

E/AndroidRuntime: FATAL EXCEPTION: main
                  Process: tedu.edu.tr, PID: 23741
                  java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{tedu.edu.tr/tedu.edu.tr.MainActivity}: java.lang.ClassNotFoundException: Didn't find class "tedu.edu.tr.MainActivity" on path: DexPathList[[zip file "/data/app/tedu.edu.tr-Q-Z69MlFdgprlVraa6TSjg==/base.apk"],nativeLibraryDirectories=[/data/app/tedu.edu.tr-Q-Z69MlFdgprlVraa6TSjg==/lib/arm, /data/app/tedu.edu.tr-Q-Z69MlFdgprlVraa6TSjg==/base.apk!/lib/armeabi-v7a, /system/lib, /vendor/lib]]
                      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2721)
                      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2895)
                      at android.app.ActivityThread.-wrap11(Unknown Source:0)
                      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1596)
                      at android.os.Handler.dispatchMessage(Handler.java:105)
                      at android.os.Looper.loop(Looper.java:164)
                      at android.app.ActivityThread.main(ActivityThread.java:6565)
                      at java.lang.reflect.Method.invoke(Native Method)
                      at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
                   Caused by: java.lang.ClassNotFoundException: Didn't find class "tedu.edu.tr.MainActivity" on path: DexPathList[[zip file "/data/app/tedu.edu.tr-Q-Z69MlFdgprlVraa6TSjg==/base.apk"],nativeLibraryDirectories=[/data/app/tedu.edu.tr-Q-Z69MlFdgprlVraa6TSjg==/lib/arm, /data/app/tedu.edu.tr-Q-Z69MlFdgprlVraa6TSjg==/base.apk!/lib/armeabi-v7a, /system/lib, /vendor/lib]]
                      at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:93)
                      at java.lang.ClassLoader.loadClass(ClassLoader.java:379)
                      at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
                      at android.app.Instrumentation.newActivity(Instrumentation.java:1174)
                      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2711)
                      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2895) 
                      at android.app.ActivityThread.-wrap11(Unknown Source:0) 
                      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1596) 
                      at android.os.Handler.dispatchMessage(Handler.java:105) 
                      at android.os.Looper.loop(Looper.java:164) 
                      at android.app.ActivityThread.main(ActivityThread.java:6565) 
                      at java.lang.reflect.Method.invoke(Native Method) 
                      at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240) 
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767

问题最糟糕的部分是每个人都建议清理项目或启用multidex,这些都是我做过的,但没有效果。

这是我的应用程序级别的build.gradle

android {
compileSdkVersion rootProject.ext.compileSdkVersion

defaultConfig {
    applicationId "tedu.edu.tr"
    minSdkVersion rootProject.ext.minSdkVersion
    targetSdkVersion rootProject.ext.targetSdkVersion
    versionCode 15
    versionName "2.0.1"
    multiDexEnabled true
    ndk {
        abiFilters "armeabi-v7a", "x86"
    }
}

splits {
    abi {
        reset()
        enable enableSeparateBuildPerCPUArchitecture
        universalApk false  // If true, also generate a universal APK
        include "armeabi-v7a", "x86"
    }
}
buildTypes {
    release {
        minifyEnabled enableProguardInReleaseBuilds
        proguardFiles getDefaultProguardFile("proguard-android.txt"), 
"proguard-rules.pro"
        // signingConfig signingConfigs.release
    }
}
// applicationVariants are e.g. debug, release
applicationVariants.all { variant ->
    variant.outputs.each { output ->
        // For each separate APK per architecture, set a unique version code as described here:
        // http://tools.android.com/tech-docs/new-build-system/user-guide/apk-splits
        def versionCodes = ["armeabi-v7a":1, "x86":2]
        def abi = output.getFilter(OutputFile.ABI)
        if (abi != null) {  // null for the universal-debug, universal-release variants
            output.versionCodeOverride =
                    versionCodes.get(abi) * 1048576 + defaultConfig.versionCode
        }
    }
}
buildToolsVersion '27.0.3'
}

dependencies {
compile project(':react-native-file-viewer')
compile project(':rn-fetch-blob')
compile project(':react-native-vector-icons')
compile project(':react-native-randombytes')
compile project(':react-native-firebase')
implementation project(':react-native-firebase')
implementation project(':react-native-vector-icons')
implementation fileTree(dir: "libs", include: ["*.jar"])
implementation "com.android.support:appcompat-v7:${rootProject.ext.supportLibVersion}"
implementation "com.facebook.react:react-native:+"  // From node_modules
implementation "com.google.android.gms:play-services-base:15.0.1"
implementation 'com.google.firebase:firebase-core:16.0.1'
implementation "com.google.firebase:firebase-messaging:17.1.0"
implementation 'me.leolin:ShortcutBadger:1.1.21@aar' // <-- Add this line if you wish to use badge on Android
implementation 'com.android.support:multidex:1.0.3'
}

// Run this once to be able to run the application with BUCK
// puts all compile dependencies into folder libs for BUCK to use
task copyDownloadableDepsToLibs(type: Copy) {
from configurations.compile
into 'libs'
}
apply plugin: 'com.google.gms.google-services'

还有其他的build.gradle文件:

buildscript {
repositories {
    google()
    jcenter()
    maven {
        url 'https://maven.google.com/'
        name 'Google'
    }
}
dependencies {
    classpath 'com.android.tools.build:gradle:3.1.3'
    classpath 'com.google.gms:google-services:4.0.1'

    // NOTE: Do not place your application dependencies here; they 
belong
    // in the individual module build.gradle files
}
}

allprojects {
repositories {
    google()
    mavenLocal()
    jcenter()
    maven {
        // All of React Native (JS, Obj-C sources, Android binaries) is installed from npm
        url "$rootDir/../node_modules/react-native/android"
    }
    maven {
        url 'https://maven.google.com/'
        name 'Google'
    }
}
}

ext {
buildToolsVersion = "26.0.3"
minSdkVersion = 16
compileSdkVersion = 26
targetSdkVersion = 26
supportLibVersion = "26.1.0"
}

最后,这是我的MainApplication.java文件(我添加了attachBaseContext()方法以便使用MultiDex):
package tedu.edu.tr;

import android.app.Application;
import android.content.Context;
import android.support.multidex.MultiDex;

import com.facebook.react.ReactApplication;
import com.vinzscam.reactnativefileviewer.RNFileViewerPackage;
import com.RNFetchBlob.RNFetchBlobPackage;
import com.bitgo.randombytes.RandomBytesPackage;
import io.invertase.firebase.RNFirebasePackage;
import com.oblador.vectoricons.VectorIconsPackage;
import com.facebook.react.ReactNativeHost;
import com.facebook.react.ReactPackage;
import com.facebook.react.shell.MainReactPackage;
import com.facebook.soloader.SoLoader;
import io.invertase.firebase.messaging.RNFirebaseMessagingPackage;
import 
 io.invertase.firebase.notifications.RNFirebaseNotificationsPackage; 
  // <-- Add this line
 import java.util.Arrays;
 import java.util.List;

public class MainApplication extends Application implements 
    ReactApplication {

private final ReactNativeHost mReactNativeHost = new ReactNativeHost(this) {
    @Override
    public boolean getUseDeveloperSupport() {
        return BuildConfig.DEBUG;
    }

    @Override
    protected List<ReactPackage> getPackages() {
        return Arrays.<ReactPackage>asList(new MainReactPackage(), new RNFileViewerPackage(),
                new RNFetchBlobPackage(), new VectorIconsPackage(), new RandomBytesPackage(),
                new RNFirebasePackage(), new RNFirebaseMessagingPackage(), new RNFirebaseNotificationsPackage());
    }

    @Override
    protected String getJSMainModuleName() {
        return "index";
    }
};

@Override
public ReactNativeHost getReactNativeHost() {
    return mReactNativeHost;
}

@Override
public void onCreate() {
    super.onCreate();
    SoLoader.init(this, /* native exopackage */ false);
}

@Override
protected void attachBaseContext(Context base) {
    super.attachBaseContext(base);
    MultiDex.install(this);
}
}

很抱歉如果这里有错误。由于与这个问题斗争了两天,我感到筋疲力尽。 编辑:我尝试了所有可能重复的问题,但没有一个能帮助我。这是我的AndroidManifest.xml文件:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="tedu.edu.tr">

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />                                               
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />                                              
<uses-permission android:name="android.permission.DOWNLOAD_WITHOUT_NOTIFICATION" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.VIBRATE" />
<application
  android:name=".MainApplication"
  android:label="@string/app_name"
  android:icon="@mipmap/ic_launcher"
  android:allowBackup="false"
  android:theme="@style/AppTheme">
  <meta-data
android:name="com.google.firebase.messaging.default_notification_icon"
android:resource="@drawable/ic_stat_tedu" />
  <meta-data
    android:name="com.google.firebase.messaging.default_notification_color"
    android:resource="@color/bluelight" />
  <activity
    android:name=".MainActivity"
    android:label="@string/app_name"
    android:launchMode="singleTop"
    android:configChanges="keyboard|keyboardHidden|orientation|screenSize"
   android:windowSoftInputMode="stateAlwaysHidden|adjustPan">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
 <action android:name="android.intent.action.DOWNLOAD_COMPLETE"/>
    </intent-filter>
  </activity>
  <activity android:name="com.facebook.react.devsupport.DevSettingsActivity" />
   <service android:name="io.invertase.firebase.messaging.RNFirebaseMessagingService">
 <intent-filter>
  <action android:name="com.google.firebase.MESSAGING_EVENT" />
 </intent-filter>
 </service>
 <service android:name="io.invertase.firebase.messaging.RNFirebaseInstanceIdService">
 <intent-filter>
  <action android:name="com.google.firebase.INSTANCE_ID_EVENT"/>
 </intent-filter>
 </service>
 <service android:name="io.invertase.firebase.messaging.RNFirebaseBackgroundMessagingService" />
</application>

</manifest>

不好意思,我已经尝试了所有的方法,但都没有成功。 - hayridurmaz
你找到解决方法了吗?我遇到了完全相同的问题。如果我清除Android缓存,它可以在第一次运行时工作,但是之后如果我再次尝试react-native run-android,构建就会失败。每次我想运行Android都必须清除缓存。 - Eric Ahn
@hyuklee 是的,我用下面的答案解决了。 - hayridurmaz
2个回答

13

大家好,我的一个项目的合作者在MainActivity.java类中删除了包名,这真是太糟糕了。千万不要删除包名,重新添加解决了问题。


3
我无法给你点赞的次数足够多。 - esr
MainActivity.java 中确切删除了哪个包名? - Lucky_girl
1
类文件顶部写的包名为@Lucky_girl。 - hayridurmaz
我的情况需要一个绝对的答案。谢谢。 - oliverbytes
1
我也遇到了类似的问题。我创建了一个应用程序,起初使用一个名称,后来更改了应用程序包名称,但没有更改java文件夹下(java/com/oldpackage/name)的文件夹名称。我现在已经添加了几个包,但直到我添加rn-fetch-blob时才出现了问题。通过这个答案的提示,我将java目录下的文件夹名称更改为java/com/newpackage/name。现在它可以正常工作了。谢谢朋友 :)。 - Ravi

1

那不是这样的。我正在使用React Native框架。它会创建两个类,一个是MainApplication,另一个是MainActivity。我将分享androidManifest文件。 - hayridurmaz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接