【发布时间】: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