Xamarin Android java.lang.ClassNotFoundException 仅适用于 Android 4.3 (api 17)
Xamarin Android java.lang.ClassNotFoundException only on Android 4.3 (api 17)
我有一个项目在 Android 5.0 或更高版本上运行良好。
但我尝试在 Android 4.3 上 运行 它,但它在开始第一个 activity 之前崩溃了。
完整错误:
05-18 23:44:57.309 E/AndroidRuntime(27114): Caused by: java.lang.ClassNotFoundException: Didn't find class "mapsproject.ApplicationStartup" on path: /data/app/MapsProject.MapsProject-1.apk
他没找到的class是一个Application。我在我的项目中使用 Android 支持库,是否有 SupportApplication 或类似的东西?
下面是我的清单:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="MapsProject.MapsProject" android:versionCode="2" android:versionName="1.0.1" android:installLocation="auto">
<uses-sdk android:minSdkVersion="17" />
<uses-feature android:glEsVersion="0x00020000" android:required="true" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />
<uses-permission android:name="com.xamarin.docs.android.mapsproject.permission.MAPS_RECEIVE" />
<permission android:name="com.xamarin.docs.android.mapsproject.permission.MAPS_RECEIVE" android:protectionLevel="signature" />
<!--Location permissions-->
<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" />
<!--Location permissions end-->
<application android:label="MobileMapsProject" android:name="mapsproject.ApplicationStartup" android:allowBackup="true" android:debuggable="true">
<meta-data android:name="com.google.android.geo.API_KEY" android:value="AIzaSyATpV7pH8ti6rJrnN01H4dbVeaMX2vJdvE" />
<meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" />
<!--Facebook SDK-->
<meta-data android:name="com.facebook.sdk.ApplicationId" android:value="@string/facebook_app_id"></meta-data>
<activity android:name="com.facebook.FacebookActivity" android:configChanges="keyboard|keyboardHidden|screenLayout|screenSize|orientation" android:theme="@android:style/Theme.Translucent.NoTitleBar" android:label="@string/ApplicationName" android:screenOrientation="portrait" />
<activity android:icon="@drawable/icon" android:label="MapsProject" android:theme="@style/MobileMapsTheme" android:name="md53f4bea8a426a59bffa9695091cc3f865.MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:theme="@style/MobileMapsTheme" android:name="md53f4bea8a426a59bffa9695091cc3f865.MainMapActivity" />
<activity android:configChanges="keyboardHidden|orientation|screenSize" android:name="com.facebook.ads.InterstitialAdActivity" />
<service android:name="md59f70a99687498e7ba187118950981d26.KeepAliveService" />
<provider android:name="mono.MonoRuntimeProvider" android:exported="false" android:initOrder="2147483647" android:authorities="MapsProject.MapsProject.mono.MonoRuntimeProvider.__mono_init__" />
<receiver android:name="mono.android.Seppuku">
<intent-filter>
<action android:name="mono.android.intent.action.SEPPUKU" />
<category android:name="mono.android.intent.category.SEPPUKU.MapsProject.MapsProject" />
</intent-filter>
</receiver>
<activity android:name="com.facebook.FacebookActivity" android:configChanges="keyboard|keyboardHidden|screenLayout|screenSize|orientation" android:theme="@style/com_facebook_activity_theme" />
<activity android:name="com.facebook.CustomTabActivity" android:exported="true"></activity>
<activity android:name="com.facebook.CustomTabMainActivity" />
<activity android:name="com.facebook.FacebookActivity" android:configChanges="keyboard|keyboardHidden|screenLayout|screenSize|orientation" android:theme="@style/com_facebook_activity_theme" />
<activity android:name="com.facebook.CustomTabActivity" android:exported="true"></activity>
<activity android:name="com.facebook.CustomTabMainActivity" />
<!--Include the AdActivity and InAppPurchaseActivity configChanges and themes. -->
<activity android:name="com.google.android.gms.ads.AdActivity" android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize" android:theme="@android:style/Theme.Translucent" />
<activity android:name="com.google.android.gms.ads.purchase.InAppPurchaseActivity" android:theme="@style/Theme.IAPTheme" />
<activity android:name="com.google.android.gms.common.api.GoogleApiActivity" android:theme="@android:style/Theme.Translucent.NoTitleBar" android:exported="false" />
<meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" />
</application>
</manifest>
下面是我的 class 抛出异常:
[Application(Name ="mapsproject.ApplicationStartup")]
public class ApplicationStartup : Application
{
public static ApplicationStartup Current { get; private set; }
public SqliteManager Manager { get; set; }
SQLiteConnection conn;
public ApplicationStartup(IntPtr handle, global::Android.Runtime.JniHandleOwnership transfer)
: base(handle, transfer) {
Current = this;
}
public override void OnCreate()
{
base.OnCreate();
var sqliteFilename = "MapsDB.db3";
string libraryPath = Environment.GetFolderPath(Environment.SpecialFolder.Personal);
var path = Path.Combine(libraryPath, sqliteFilename);
conn = new SQLiteConnection(path);
Manager = new SqliteManager(conn);
}
}
我在其他线程上尝试了一些技巧,但没有解决问题。
提前致谢!
编辑 1:
添加了完整的 apk 清单。
感谢 Xamarin Fo运行s 上的 JonDouglas,我找到了解决方案。
原来是启用 Multidex 的问题。
Android 5 或以上版本自己处理 multidex,但以下版本不处理。所以,我发现我的应用程序活动是在 classes2.dex 上生成的,它应该在 classes.dex 上生成,这样 Android 就可以找到应用程序并启动应用程序。
要查看 classes.dex,我使用了 ClassyShark:https://github.com/google/android-classyshark
知道这个问题后,我发现我的multidex.keep(发现于obj/Debug/multidex.keep
)是空的,所以这是一个问题。为了解决这个问题,我需要继续 android sdk build tools (androidsdk\build-tools.0.3
),并打开编辑 mainDexClasses.bat.
所以,我找到了这段代码:
if DEFINED output goto redirect
call "%java_exe%" -Djava.ext.dirs="%frameworkdir%" com.android.multidex.MainDexListBuilder "%disableKeepAnnotated%" "%tmpJar%" "%params%"
goto afterClassReferenceListBuilder
:redirect
call "%java_exe%" -Djava.ext.dirs="%frameworkdir%" com.android.multidex.MainDexListBuilder "%disableKeepAnnotated%" "%tmpJar%" "%params%" 1>"%output%"
:afterClassReferenceListBuilder
并更改为:
SET params=%params:'=%
if DEFINED output goto redirect
call "%java_exe%" -Djava.ext.dirs="%frameworkdir%" com.android.multidex.MainDexListBuilder %disableKeepAnnotated% "%tmpJar%" %params%
goto afterClassReferenceListBuilder
:redirect
call "%java_exe%" -Djava.ext.dirs="%frameworkdir%" com.android.multidex.MainDexListBuilder %disableKeepAnnotated% "%tmpJar%" %params% 1>"%output%"
:afterClassReferenceListBuilder
这样,构建工具可以正确处理 multidex.keep 文件。
在此之后,我重建了项目,并正确生成了 multidex.keep。所以,我复制了文件中的文本并在解决方案上创建了我自己的 multidex.keep 文件。
为此,我在 android 项目中添加了一个文本文件,并将其命名为 multidex.keep。我已将生成的 multidex.keep 的值粘贴到新文件中,并将我的活动移至顶部。
所以,我打开了 multidex.keep 文件属性,并将 Build Action 设置为 MultiDexMainDexList.
在此之后,我重建了项目,并且 classes.dex 已正确生成,这样我就可以 运行 我的应用程序在 android 4.4!
以下是我找到解决方案的链接:
http://www.jon-douglas.com/2016/09/05/xamarin-android-multidex/
我有一个项目在 Android 5.0 或更高版本上运行良好。
但我尝试在 Android 4.3 上 运行 它,但它在开始第一个 activity 之前崩溃了。
完整错误:
05-18 23:44:57.309 E/AndroidRuntime(27114): Caused by: java.lang.ClassNotFoundException: Didn't find class "mapsproject.ApplicationStartup" on path: /data/app/MapsProject.MapsProject-1.apk
他没找到的class是一个Application。我在我的项目中使用 Android 支持库,是否有 SupportApplication 或类似的东西?
下面是我的清单:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="MapsProject.MapsProject" android:versionCode="2" android:versionName="1.0.1" android:installLocation="auto">
<uses-sdk android:minSdkVersion="17" />
<uses-feature android:glEsVersion="0x00020000" android:required="true" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />
<uses-permission android:name="com.xamarin.docs.android.mapsproject.permission.MAPS_RECEIVE" />
<permission android:name="com.xamarin.docs.android.mapsproject.permission.MAPS_RECEIVE" android:protectionLevel="signature" />
<!--Location permissions-->
<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" />
<!--Location permissions end-->
<application android:label="MobileMapsProject" android:name="mapsproject.ApplicationStartup" android:allowBackup="true" android:debuggable="true">
<meta-data android:name="com.google.android.geo.API_KEY" android:value="AIzaSyATpV7pH8ti6rJrnN01H4dbVeaMX2vJdvE" />
<meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" />
<!--Facebook SDK-->
<meta-data android:name="com.facebook.sdk.ApplicationId" android:value="@string/facebook_app_id"></meta-data>
<activity android:name="com.facebook.FacebookActivity" android:configChanges="keyboard|keyboardHidden|screenLayout|screenSize|orientation" android:theme="@android:style/Theme.Translucent.NoTitleBar" android:label="@string/ApplicationName" android:screenOrientation="portrait" />
<activity android:icon="@drawable/icon" android:label="MapsProject" android:theme="@style/MobileMapsTheme" android:name="md53f4bea8a426a59bffa9695091cc3f865.MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:theme="@style/MobileMapsTheme" android:name="md53f4bea8a426a59bffa9695091cc3f865.MainMapActivity" />
<activity android:configChanges="keyboardHidden|orientation|screenSize" android:name="com.facebook.ads.InterstitialAdActivity" />
<service android:name="md59f70a99687498e7ba187118950981d26.KeepAliveService" />
<provider android:name="mono.MonoRuntimeProvider" android:exported="false" android:initOrder="2147483647" android:authorities="MapsProject.MapsProject.mono.MonoRuntimeProvider.__mono_init__" />
<receiver android:name="mono.android.Seppuku">
<intent-filter>
<action android:name="mono.android.intent.action.SEPPUKU" />
<category android:name="mono.android.intent.category.SEPPUKU.MapsProject.MapsProject" />
</intent-filter>
</receiver>
<activity android:name="com.facebook.FacebookActivity" android:configChanges="keyboard|keyboardHidden|screenLayout|screenSize|orientation" android:theme="@style/com_facebook_activity_theme" />
<activity android:name="com.facebook.CustomTabActivity" android:exported="true"></activity>
<activity android:name="com.facebook.CustomTabMainActivity" />
<activity android:name="com.facebook.FacebookActivity" android:configChanges="keyboard|keyboardHidden|screenLayout|screenSize|orientation" android:theme="@style/com_facebook_activity_theme" />
<activity android:name="com.facebook.CustomTabActivity" android:exported="true"></activity>
<activity android:name="com.facebook.CustomTabMainActivity" />
<!--Include the AdActivity and InAppPurchaseActivity configChanges and themes. -->
<activity android:name="com.google.android.gms.ads.AdActivity" android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize" android:theme="@android:style/Theme.Translucent" />
<activity android:name="com.google.android.gms.ads.purchase.InAppPurchaseActivity" android:theme="@style/Theme.IAPTheme" />
<activity android:name="com.google.android.gms.common.api.GoogleApiActivity" android:theme="@android:style/Theme.Translucent.NoTitleBar" android:exported="false" />
<meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" />
</application>
</manifest>
下面是我的 class 抛出异常:
[Application(Name ="mapsproject.ApplicationStartup")]
public class ApplicationStartup : Application
{
public static ApplicationStartup Current { get; private set; }
public SqliteManager Manager { get; set; }
SQLiteConnection conn;
public ApplicationStartup(IntPtr handle, global::Android.Runtime.JniHandleOwnership transfer)
: base(handle, transfer) {
Current = this;
}
public override void OnCreate()
{
base.OnCreate();
var sqliteFilename = "MapsDB.db3";
string libraryPath = Environment.GetFolderPath(Environment.SpecialFolder.Personal);
var path = Path.Combine(libraryPath, sqliteFilename);
conn = new SQLiteConnection(path);
Manager = new SqliteManager(conn);
}
}
我在其他线程上尝试了一些技巧,但没有解决问题。
提前致谢!
编辑 1:
添加了完整的 apk 清单。
感谢 Xamarin Fo运行s 上的 JonDouglas,我找到了解决方案。
原来是启用 Multidex 的问题。
Android 5 或以上版本自己处理 multidex,但以下版本不处理。所以,我发现我的应用程序活动是在 classes2.dex 上生成的,它应该在 classes.dex 上生成,这样 Android 就可以找到应用程序并启动应用程序。 要查看 classes.dex,我使用了 ClassyShark:https://github.com/google/android-classyshark
知道这个问题后,我发现我的multidex.keep(发现于obj/Debug/multidex.keep
)是空的,所以这是一个问题。为了解决这个问题,我需要继续 android sdk build tools (androidsdk\build-tools.0.3
),并打开编辑 mainDexClasses.bat.
所以,我找到了这段代码:
if DEFINED output goto redirect
call "%java_exe%" -Djava.ext.dirs="%frameworkdir%" com.android.multidex.MainDexListBuilder "%disableKeepAnnotated%" "%tmpJar%" "%params%"
goto afterClassReferenceListBuilder
:redirect
call "%java_exe%" -Djava.ext.dirs="%frameworkdir%" com.android.multidex.MainDexListBuilder "%disableKeepAnnotated%" "%tmpJar%" "%params%" 1>"%output%"
:afterClassReferenceListBuilder
并更改为:
SET params=%params:'=%
if DEFINED output goto redirect
call "%java_exe%" -Djava.ext.dirs="%frameworkdir%" com.android.multidex.MainDexListBuilder %disableKeepAnnotated% "%tmpJar%" %params%
goto afterClassReferenceListBuilder
:redirect
call "%java_exe%" -Djava.ext.dirs="%frameworkdir%" com.android.multidex.MainDexListBuilder %disableKeepAnnotated% "%tmpJar%" %params% 1>"%output%"
:afterClassReferenceListBuilder
这样,构建工具可以正确处理 multidex.keep 文件。
在此之后,我重建了项目,并正确生成了 multidex.keep。所以,我复制了文件中的文本并在解决方案上创建了我自己的 multidex.keep 文件。
为此,我在 android 项目中添加了一个文本文件,并将其命名为 multidex.keep。我已将生成的 multidex.keep 的值粘贴到新文件中,并将我的活动移至顶部。 所以,我打开了 multidex.keep 文件属性,并将 Build Action 设置为 MultiDexMainDexList.
在此之后,我重建了项目,并且 classes.dex 已正确生成,这样我就可以 运行 我的应用程序在 android 4.4!
以下是我找到解决方案的链接: http://www.jon-douglas.com/2016/09/05/xamarin-android-multidex/