【问题标题】:java.lang.ClassNotFoundException on Android4.4 without Multi-Dex没有 Multi-Dex 的 Android4.4 上的 java.lang.ClassNotFoundException
【发布时间】:2017-09-11 22:09:51
【问题描述】:

我有一个针对 Android 6.0 且最低版本为 4.4 的 Xamarin Android 应用。 在 6.0 及更高版本上它运行没有任何问题。但是在我的 Android 4.4 测试设备上,它在应用程序中的 SetupWizard 之后崩溃,它应该使用以下消息注册作业:java.lang.ClassNotFoundException

整个例外:

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.postkca.friendsappdate/connectContacts.droid.activities.MainActivity}: java.lang.ClassNotFoundException: md5e63ccdb150b7ea0bbd5c3cb0d08710a0.FetchContactupdatesJob
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2263)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2313)
    at android.app.ActivityThread.access$800(ActivityThread.java:144)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1246)
    at android.os.Handler.dispatchMessage(Handler.java:106)
    at android.os.Looper.loop(Looper.java:136)
    at android.app.ActivityThread.main(ActivityThread.java:5212)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:515)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:602)
    at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.ClassNotFoundException: md5e63ccdb150b7ea0bbd5c3cb0d08710a0.FetchContactupdatesJob
    at java.lang.Class.classForName(Native Method)
    at java.lang.Class.forName(Class.java:251)
    at connectContacts.droid.activities.MainActivity.n_onCreate(Native Method)
    at connectContacts.droid.activities.MainActivity.onCreate(MainActivity.java:30)
    at android.app.Activity.performCreate(Activity.java:5240)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1088)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2227)
    ... 11 more
Caused by: java.lang.NoClassDefFoundError: md5e63ccdb150b7ea0bbd5c3cb0d08710a0/FetchContactupdatesJob
    ... 18 more
Caused by: java.lang.ClassNotFoundException: Didn't find class "md5e63ccdb150b7ea0bbd5c3cb0d08710a0.FetchContactupdatesJob" on path: DexPathList[[zip file "/data/app/com.postkca.friendsappdate-1.apk"],nativeLibraryDirectories=[/data/app-lib/com.postkca.friendsappdate-1, /vendor/lib, /system/lib]]
    at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:497)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:457)
    ... 18 more

我看到很多帖子都有类似的问题,但他们都启用了 MultiDex,而我没有。 Xamarin 链接也设置为 None 并且有或没有 ProGuard 的例外情况相同。 这会导致什么?

EDIT1:添加构建配置截图

FetchContactUpdatesJob:

[Service(Exported = true, Permission = "android.permission.BIND_JOB_SERVICE")]
    public class FetchContactupdatesJob : JobService
    {
        private const int JOB_ID = 10;

        public override bool OnStartJob(JobParameters args)
        {
            Task.Run(async () => await FetchContactupdates(args));
            return true;
        }

        /// <inheritdoc />
        public override bool OnStopJob(JobParameters args)
        {
            return true;
        }

        /// <inheritdoc />
        public override StartCommandResult OnStartCommand(Intent intent, Android.App.StartCommandFlags flags, int startId)
        {
            var messenger = (Messenger)intent.GetParcelableExtra("messenger");

            SendMessage(MainActivity.MESSAGE_SERVICE_FETCH_CONTACTUPDATES, messenger);

            return StartCommandResult.NotSticky;
        }

        private void SendMessage(int what, Messenger messenger)
        {
            var message = Message.Obtain();

            message.What = what;
            message.Obj = this;

            try
            {
                messenger.Send(message);
            }
            catch (RemoteException e)
            {
                Debug.WriteLine(e);
            }
        }

        private async Task FetchContactupdates(JobParameters args)
        {
           // Service Code

            JobFinished(args, false);
        }

        /// <summary>
        ///     Schedules the task for execution.
        /// </summary>
        public void ScheduleTask()
        {
            var builder = new JobInfo.Builder(JOB_ID,
                                              new ComponentName(this, Java.Lang.Class.FromType(typeof(FetchContactupdatesJob))));
            // Execute all 15 Minutes
            builder.SetPeriodic(15 * 60 * 1000);
            builder.SetPersisted(true);
            builder.SetRequiredNetworkType(NetworkType.None);
            builder.SetRequiresDeviceIdle(false);
            builder.SetRequiresCharging(false);

            var tm = (JobSchedulerType)GetSystemService(JobSchedulerService);
            var status = tm.Schedule(builder.Build());
        }
    }

【问题讨论】:

  • FetchContactupdatesJob构造函数中放置一个断点。我记得在构造函数出现问题时看到ClassNotFoundException
  • md5e63ccdb150b7ea0bbd5c3cb0d08710a0.FetchContactupdatesJob 在你的主 dex 列表中吗? classes.dex 或在您的 obj/{configuration}/android/bin 文件夹中填满 classes{n}.dex
  • @JonDouglas 我只有一个 classes.dex。但是我还没弄明白怎么打开
  • 在我的博客上查看“classyshark”:jon-douglas.com/2017/03/15/apk-tools
  • 如果您有一个最小的可行复制,我认为这是您的下一步,假设链接器已关闭并且这可以在您的 dex 列表中找到。我们想知道这是什么类型的类,因为它可能没有在您的应用程序中正确声明。

标签: android xamarin xamarin.android


【解决方案1】:

JobService 被添加到API 21

回复:https://developer.android.com/reference/android/app/job/JobService.html

Android 4.4/KitKat 是 API 19,因此该错误是有意义的,因为该设备不支持 JobService

有一些基于 Java 的库,例如 Evernote 的 OSS android-job,可以绑定在 Xamarin.Android 库中,该库抽象了用于调度作业的 API 级别...否则您可能需要查看代码看看他们如何处理不同的 API 并在您的应用中做同样的事情。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多