[英]Android 5.x ClassNotFoundException works fine on 6.0+
我已將項目的minSdkVersion從19更新為21.這導致5.0 / 5.1設備上的問題,我無法運行該應用程序。 我一直在我的Application類上得到一個ClassNotFoundException。 完整日志,應用程序類和gradle文件如下所示。 如果我將我的項目還原為minSdkVersion 19,那么應用程序將在4.4+上運行,沒有任何問題。
我試過了什么
清洗/重建
更新和降級構建工具版本
跨項目的所有支持庫都具有相同的版本號
使我所有的清單類相對而絕對
更新了所有Sdk和構建工具
日志
04-27 14:37:07.152 6278-6278/? E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.package.testapp, PID: 6278
java.lang.RuntimeException: Unable to instantiate application com.package.TestApplication: java.lang.ClassNotFoundException: Didn't find class "com.package.Application" on path: DexPathList[[zip file "/data/app/com.package.testapp-1/base.apk"],nativeLibraryDirectories=[/data/app/com.package.testapp-1/lib/x86_64, /vendor/lib64, /system/lib64]]
at android.app.LoadedApk.makeApplication(LoadedApk.java:563)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4526)
at android.app.ActivityThread.access$1500(ActivityThread.java:151)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1364)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5254)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
Caused by: java.lang.ClassNotFoundException: Didn't find class "com.package.TestApplication" on path: DexPathList[[zip file "/data/app/com.package.testapp-1/base.apk"],nativeLibraryDirectories=[/data/app/com.package.testapp-1/lib/x86_64, /vendor/lib64, /system/lib64]]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
at java.lang.ClassLoader.loadClass(ClassLoader.java:511)
at java.lang.ClassLoader.loadClass(ClassLoader.java:469)
at android.app.Instrumentation.newApplication(Instrumentation.java:980)
at android.app.LoadedApk.makeApplication(LoadedApk.java:558)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4526)
at android.app.ActivityThread.access$1500(ActivityThread.java:151)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1364)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5254)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
Suppressed: java.lang.ClassNotFoundException: com.package.testapp.welcome.TestClaimApplication
at java.lang.Class.classForName(Native Method)
at java.lang.BootClassLoader.findClass(ClassLoader.java:781)
at java.lang.BootClassLoader.loadClass(ClassLoader.java:841)
at java.lang.ClassLoader.loadClass(ClassLoader.java:504)
... 13 more
Caused by: java.lang.NoClassDefFoundError: Class not found using the boot class loader; no stack available
搖籃
buildscript {
repositories {
maven { url 'https://maven.fabric.io/public' }
}
dependencies {
classpath 'io.fabric.tools:gradle:1.+'
}
}
apply plugin: 'com.android.application'
apply plugin: 'io.fabric'
repositories {
maven { url 'https://maven.fabric.io/public' }
}
android {
compileSdkVersion 25
buildToolsVersion '25.0.3'
defaultConfig {
applicationId "com.package.testapp"
minSdkVersion 21
multiDexEnabled = true
targetSdkVersion 25
versionCode 2
versionName "0.7"
renderscriptTargetApi 18 // support mode not supported 21+
renderscriptSupportModeEnabled true
testInstrumentationRunner
"android.support.test.runner.AndroidJUnitRunner"
}
dexOptions {
javaMaxHeapSize "4g"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
lintOptions {
checkReleaseBuilds false
abortOnError false
}
productFlavors {
companylocal
companymaven
}
}
dependencies {
def ext = rootProject.ext;
compile fileTree(include: ['*.jar'], dir: 'libs')
compile "com.android.support:appcompat-v7:${ext.supportLibraryVersion}"
compile "com.android.support:design:${ext.supportLibraryVersion}"
compile 'com.romandanylyk:pageindicatorview:0.0.9'
compile "com.jakewharton:butterknife:${ext.butterknifeLibraryVersion}"
annotationProcessor "com.jakewharton:butterknife-compiler:${ext.butterknifeLibraryVersion}"
compile "uk.co.chrisjenx:calligraphy:2.2.0"
compile 'com.android.support:multidex:1.0.1'
// Crashlytics Kit - for crash handling
compile('com.crashlytics.sdk.android:crashlytics:2.5.2@aar') {
transitive = true
}
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
testCompile 'junit:junit:4.12'
testCompile 'org.robolectric:robolectric:3.0'
testCompile "com.squareup.okhttp3:mockwebserver:${ext.okHttp3LibraryVersion}"
testCompile('com.squareup.assertj:assertj-android:1.1.1') {
exclude module: 'support-annotations'
}
}
應用
public class TestApplication extends Application {
Engine engine;
@Override
public void onCreate() {
super.onCreate();
String privateServerUrlLocal = getString(R.string.server_url);
ProfileLauncher profileLauncher = getProfileLauncher();
LoginLauncher loginLauncher = getLoginLauncher();
// Set up Crash Analytics
final CrashlyticsCore crashlyticsCore = new CrashlyticsCore.Builder().disabled(DEBUG).build();
Fabric.with(this, new Crashlytics.Builder().core(crashlyticsCore).build());
Intent intent = new Intent(this, LogoutService.class);
startService(intent);
CertificatePinner certificatePinner = new CertificatePinner.Builder()
.add("")
.add("")
.build();
engine = new Engine.Builder(privateServerUrlLocal, getString(R.string.other_server_url))
.setCertificatePinner(certificatePinner)
.setSDKPartnerSetupManager(getSdkPartnerManager())
.setLogoutActionHandler(getLogoutActionHandler())
.setVLocationManager(new VLocationManagerImp())
.setDebug(DEBUG)
.addDeepLinkHandler(new ClaimDeepLinkHandler(loginLauncher, profileLauncher))
.addDeepLinkHandler(new LinkGiftCodeDeeplinkHandler(loginLauncher, profileLauncher))
.addDeepLinkHandler(new OpenLinkDeepLinkHandler())
.addDeepLinkHandler(new DetailsDeepLinkHandler())
.addClaimConfig(new ClaimConfig(false, false, false, false, true))
.build();
engine.startup(this);
}
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
MultiDex.install(base);
}
}
表現
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.package.testapp">
<uses-feature
android:name="android.hardware.camera"
android:required="true" />
<uses-feature
android:name="android.hardware.camera.autofocus"
android:required="false" />
<uses-feature
android:name="android.hardware.camera.flash"
android:required="false" />
<!-- Required for g+ login -->
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<application
android:name=".TestApplication"
android:allowBackup="false"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<service
android:name="com.package.companycommon.ui.LogoutService"
android:stopWithTask="true" />
<activity
android:name=".LaunchActivity"
android:screenOrientation="portrait"
android:theme="@style/AppTheme.NoActionBar">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".welcome.WelcomeActivity"
android:screenOrientation="portrait"
android:theme="@style/AppTheme.NoActionBar.ClearStatus" />
<activity
android:name=".RegisterActivity"
android:screenOrientation="portrait"
android:theme="@style/AppTheme.NoActionBar.ClearStatus"
android:windowSoftInputMode="adjustResize" />
<activity
android:name=".LoginActivity"
android:screenOrientation="portrait"
android:theme="@style/AppTheme.NoActionBar.ClearStatus"
android:windowSoftInputMode="adjustResize" />
<activity
android:name=".ActivationActivity"
android:screenOrientation="portrait"
android:theme="@style/AppTheme.NoActionBar.ClearStatus"
android:windowSoftInputMode="adjustResize" />
<activity
android:name=".AddPhoneNumberActivity"
android:screenOrientation="portrait"
android:theme="@style/AppTheme.NoActionBar.ClearStatus"
android:windowSoftInputMode="adjustResize" />
<activity
android:name=".ForgotPasswordActivity"
android:screenOrientation="portrait"
android:theme="@style/AppTheme.NoActionBar.ClearStatus"
android:windowSoftInputMode="adjustResize" />
<activity
android:name=".GiftHistoryActivity"
android:screenOrientation="portrait"
android:theme="@style/AppTheme.NoActionBar.ClearStatus" />
<activity
android:name="com.package.PartnerLoginHiddenActivity"
android:screenOrientation="portrait"
android:theme="@style/AppTheme.NoActionBar.ClearStatus" />
<activity
android:name=".tutorial.TutorialActivity"
android:screenOrientation="portrait"
android:theme="@style/AppTheme.NoActionBar.ClearStatus" />
<activity
android:name=".CreateNewPasswordActivity"
android:screenOrientation="portrait"
android:theme="@style/AppTheme.NoActionBar.ClearStatus" />
<activity
android:name=".settings.SettingsActivity"
android:screenOrientation="portrait">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value=".GiftHistoryActivity" />
</activity>
<activity
android:name=".settings.ExtraSettingsActivity"
android:label="@string/settings"
android:screenOrientation="portrait">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value=".settings.SettingsActivity" />
</activity>
<activity
android:name="companyapp.company.NewsActivity"
android:label="@string/notifications"
android:screenOrientation="portrait"
android:theme="@style/AppTheme" />
<activity
android:name=".termsandconditions.CompanyTermsAndConditionsActivity"
android:screenOrientation="portrait"
android:theme="@style/AppTheme" />
<activity
android:name="com.package.companycommon.ui.PhotoViewerActivity"
android:screenOrientation="portrait"
android:theme="@style/AppTheme" />
<activity
android:name="com.package.company.details.CompanyDetailActivity"
android:screenOrientation="portrait"
android:theme="@style/AppTheme" />
<activity
android:name="com.package.company.details.CompanyDetailActivityLocation"
android:screenOrientation="portrait"
android:theme="@style/AppTheme">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="com.package.company.details.CompanyDetailActivity" />
</activity>
<activity
android:name="com.package.company.ClaimActivity"
android:theme="@style/AppTheme.NoActionBar"
tools:replace="android:theme" />
</application>
</manifest>
當針對api 21時,編譯器將讀取100個dex文件的限制。 因此,我發現一個簡單的解決方案是將其添加到gradle文件中的dexOptions中。 這會將所有dex文件合並到盡可能低的數量。
在build.gradle文件中添加以下內容
android {
...
dexOptions {
preDexLibraries = false
}
}
這意味着您的multiDex無法正常工作,因此缺少某些文件。 我認為android 5.0有不同的方式來使用multiDex。 你是否覆蓋了Aplication類中的某些內容?
嘗試刪除compile 'com.android.support:multidex:1.0.1'
。 谷歌醫生說
因此,如果您的minSdkVersion為21或更高,則不需要multidex支持庫。
我不確定這是否有幫助,但它可能值得嘗試。
由於某種原因,這個課不再是你的主要dex了。
使用multiDexKeepFile (在gradle中列出類)或multiDexKeepProguard (指向主類的特定proguard文件) 在main-classes列表中聲明類。
嘗試啟用Progaud並禁用multidex。
你不僅可以修復這個問題,而且你會有一個更小的apk,安裝和運行時間更快。
注意,如果您需要幫助,請發表評論,我們可以解決。
錯誤是缺少com.package.Application。 您發布的代碼(或清單)都沒有包含對該類的引用。 你在哪里定義com.package.Application? 如果你不是在你的項目中被引用的地方? (我會在項目范圍內搜索“com.package.Application”來解開這個。)
嘗試在清單中給出完整的路徑
<application
android:name=".TestApplication"
同時手動刪除構建文件夾 - 有時干凈不起作用。也可以手動卸載應用程序並啟動。
我已經從你的代碼和配置中進行了演示 ,並在marshmallow下面進行了工作
下載並檢查它並與您的代碼進行比較。 還有一件事是你如何使用包名com.package.testapp創建項目。 我無法使用相同的包名創建項目
創建multidex-config.txt以將此類保留在主DEX文件中:
com/package/Application.class
com/package/TestApplication.class
com/package/testapp/welcome/TestClaimApplication.class
添加multiDexKeepFile您的build.gradle這樣的android.buildTypes.release部分:
android {
buildTypes {
release {
multiDexKeepFile file 'multidex-config.txt'
}
}
}
你需要啟用multidex嗎? 我一直遇到問題。 如果您仍然達到65k方法限制,我總是理解multidex用作最后的手段。 如果您沒有遇到此方法限制,則不需要multidex。 如果你遇到這個限制,我建議先使用progaurd來解決這個問題。 如果使用proguard后仍然高於方法限制,則使用multidex。
你需要添加你的android:name這樣的完整路徑。
android:name="android.support.multidex.MultiDexApplication"
並且您的TestApplication應該擴展MultiDexApplication。
根據文檔,如果需要更多細節,請參考。 MultiDex文檔
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.