Android:在运行时在Lollipop上加载应用程序库,而不是IceCreamSandwich [英] Android : app loading library at runtime on Lollipop but not IceCreamSandwich

本文介绍了Android:在运行时在Lollipop上加载应用程序库,而不是IceCreamSandwich的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我目前正在使用Android Studio开发一个Android应用。目前,该应用可以在Lollipop设备上完美启动,但由于在棒棒糖之前的设备上 ClassNotFoundException (我已经在ICS上进行了测试,但失败了),导致该应用崩溃。 / p>

缺少的类总是在运行时来自外部库。



这是gradle文件:

  buildscript {
存储库{
maven {url'https://maven.fabric.io/public'}
}

依赖项{
classpath'io.fabric.tools:gradle:1.+'
}
}
apply插件:' com.android.application'
应用插件:'io.fabric'

android {
compileSdkVersion 23
buildToolsVersion '23 .0.0'
defaultConfig {
applicationId'com.kappsports.kapp10'
minSdkVersion 18
targetSdkVersion 23
versionCode 1
versionName'1.0.0'
multiDexEnabled true
}
buildTypes {
r elease {
minifyEnabled否
rinkResources true
}
}
lintOptions {
abortOnError false
}
dexOptions {
增量true
javaMaxHeapSize'4g'
}
}

存储库{
mavenCentral()
maven {url https:// oss.sonatype.org/content/repositories/snapshots/}
maven {url'https://maven.fabric.io/public'}
jcenter()
}

依赖项{
编译fileTree(dir:'libs',排除:'android-support-v4.jar',包括:'* .jar')
compile('com.crashlytics .sdk.android:crashlytics:2.5.1@aar'){
transitive = true;
}
编译'com.michaelpardo:activeandroid:3.1.0-SNAPSHOT'
编译'com.github.johnpersano:supertoasts:1.3.4@aar'
编译'com .google.code.gson:gson:2.3'
编译'com.squareup:otto:1.3.5'
编译'com.makeramen:roundedimageview:1.3.0'
编译'com .jakewharton:butterknife:6.0.0'
编译'com.malinskiy:superrecyclerview:1.0.0'
编译'com.android.support:multidex:1.0.1'
编译'com .jpardogo.materialtabstrip:library:1.0.9'
compile'c​​om.nostra13.universalimageloader:universal-image-loader:1.9.3'
compile'c​​om.squareup.okhttp:okhttp:2.4.0 '
编译'org.buraktamturk:loadingview:1.0.0@aar'
编译'com.facebook.android:facebook-android-sdk:4.1.0'
编译'com.github .navasmdc:MaterialDesign:1.5@aar'
编译'net.danlew:android.joda:2.8.2'
// noinspection GradleCompatible
编译'com.android.support:appcompat-v7 :22.2.1'
编译e'com.google.android.gms:play-services:7.5.0'
// noinspection GradleCompatible
编译'com.android.support:recyclerview-v7:22.2.1'

}

这里有一些logcat输出:

 > 09-06 23:25:58.414 27436-27436 /? W / dalvikvm:类
>的链接‘Lio / fabric / sdk / android / InitializationTask;失败09-06 23:25:58.414
> 27436-27436 /? E / dalvikvm:找不到类
> io.fabric.sdk.android.InitializationTask,从方法
>中引用io.fabric.sdk.android.Kit。< init> 09-06 23:25:58.414 27436-27436 /?
> W / dalvikvm:VFY:无法解析新实例8228
> (Lio / fabric / sdk / android / InitializationTask;)在
> Lio / fabric / sdk / android / Kit; 09-06 23:25:58.414 27436-27436 /?
> D / dalvikvm:VFY:在0x0003 09-06替换操作码0x22 23:25:58.414
> 27436-27436 /? W / dalvikvm:无法解析
>的超类。 Lio / fabric / sdk / android / InitializationTask; (8269)09-06 23:25:58.414
> 27436-27436 /? W / dalvikvm:类
>的链接‘Lio / fabric / sdk / android / InitializationTask;失败09-06 23:25:58.414
> 27436-27436 /? W / dalvikvm:无法解析
>的超类。 Lio / fabric / sdk / android / InitializationTask; (8269)09-06 23:25:58.414
> 27436-27436 /? W / dalvikvm:类
>的链接‘Lio / fabric / sdk / android / InitializationTask;失败09-06 23:25:58.414
> 27436-27436 /? I / dalvikvm:找不到方法
> io.fabric.sdk.android.InitializationTask.getDependencies,引用为
>从方法io.fabric.sdk.android.Kit.getDependencies 09-06
> 23:25:58.414 27436-27436 /? W / dalvikvm:VFY:无法解析虚拟
>方法57413:
> Lio / fabric / sdk / android / InitializationTask; .getDependencies
> ()Ljava / util / Collection; 09-06 23:25:58.414 27436-27436 /? D / dalvikvm:
> VFY:在0x0002 09-06 23:25:58.414 27436-27436 /处替换操作码0x6e?
> W / dalvikvm:VFY:找不到签名
>中引用的类(Lio / fabric / sdk / android / services / common / IdManager;)09-06 23:25:58.414
> 27436-27436 /? W / dalvikvm:无法解析
>的超类。 Lio / fabric / sdk / android / InitializationTask; (8269)09-06 23:25:58.414
> 27436-27436 /? W / dalvikvm:类
>的链接‘Lio / fabric / sdk / android / InitializationTask;失败09-06 23:25:58.414
> 27436-27436 /? W / dalvikvm:无法解析
>的超类。 Lio / fabric / sdk / android / InitializationTask; (8269)09-06 23:25:58.414
> 27436-27436 /? W / dalvikvm:类
>的链接‘Lio / fabric / sdk / android / InitializationTask;失败09-06 23:25:58.414
> 27436-27436 /? I / dalvikvm:找不到方法
> io.fabric.sdk.android.InitializationTask.executeOnExecutor,引用为
>从方法io.fabric.sdk.android.Kit.initialize 09-06 23:25:58.414
> 27436-27436 /? W / dalvikvm:VFY:无法解析虚拟方法57412:
> Lio / fabric / sdk / android / InitializationTask; .executeOnExecutor
> (Ljava / util / concurrent / ExecutorService; [Ljava / lang / Object;)V 09-06
> 23:25:58.414 27436-27436 /? D / dalvikvm:VFY:以
>替换操作码0x6e 0x0011 09-06 23:25:58.414 27436-27436 /? W / dalvikvm:VFY:无法
>查找签名
>中引用的类(Lio / fabric / sdk / android / services / common / IdManager;)09-06 23:25:58.419
> 27436-27436 /? W / dalvikvm:无法解析
>的超类。 Lio / fabric / sdk / android / InitializationTask; (8269)09-06 23:25:58.419
> 27436-27436 /? W / dalvikvm:类
>的链接‘Lio / fabric / sdk / android / InitializationTask;失败09-06 23:25:58.419
> 27436-27436 /? D / dalvikvm:DexOpt:无法在
>中选择直接呼叫0xe03e < init>中Lio / fabric / sdk / android / Kit;中的0x05。 09-06 23:25:58.419
> 27436-27436 /? D / AndroidRuntime:关闭VM 09-06 23:25:58.419
> 27436-27436 /? W / dalvikvm:threadid = 1:线程退出且未捕获
>例外(group = 0x41bfb700)09-06 23:25:58.419 27436-27436 /?
> E / AndroidRuntime:致命异常:主要
> java.lang.NoClassDefFoundError:io.fabric.sdk.android.services.common.ExecutorUtils
>在com.crashlytics.android.core.CrashlyticsCore中。< init>(CrashlyticsCore.java:205)
>在com.crashlytics.android.core.CrashlyticsCore $ Builder.build(CrashlyticsCore.java:189)
>在com.kappsports.kapp10.Kapp10Application.onCreate(Kapp10Application.java:53)
>在android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1024)
>在android.app.ActivityThread.handleBindApplication(ActivityThread.java:4684)
>在android.app.ActivityThread.access $ 1400(ActivityThread.java:159)
>在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1376)
>在android.os.Handler.dispatchMessage(Handler.java:99)
>在android.os.Looper.loop(Looper.java:176)
>在android.app.ActivityThread.main(ActivityThread.java:5419)
>在java.lang.reflect.Method.invokeNative(本机方法)
>在java.lang.reflect.Method.invoke(Method.java:525)
>在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:1046)
>在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:862)
> at dalvik.system.NativeStart.main(Native Method)09-06 23:25:58.424 2346-2891 /? I / ActivityManager:通知
> ApplicationCrash

我目前暂时无法解决。



谢谢,
问候。

解决方案

1)为您的应用程序添加多点支持:

  compile'c​​om。 android.support:multidex:1.0.1'

2)作为 MultiDexApplication 的应用程序。选择以下选项之一:



这是android MultiDexApplication 类的源代码:

 公共类MultiDexApplication扩展应用程序{
public MultiDexApplication(){
}

protected void attachBaseContext (上下文基础){
super.attachBaseContext(base);
MultiDex.install(this);
}
}

选项1)您可以从 MultiDexApplication 扩展您的自定义应用程序:

 公共类MyApplication扩展了MultiDexApplication {
//您的应用程序在这里
}

选项2 ),您可以从默认的 Application 类扩展自定义应用程序,然后需要调用 MultiDex.install attachBaseContext(Context base)方法:

 公共类MyApplication扩展了Application {

受保护的void attachBaseContext(Context base){
super.attachBaseContext(base);
MultiDex.install(this);
}

//您的应用程序在这里
}

选项3):如果您没有任何自定义应用程序,并且不想要任何应用程序,只需将您的应用程序名称(在AndroidManifest.xml中)设置为MultiDexApplication:

 <?xml version = 1.0 encoding = utf-8?> 
<清单xmlns:android = http://schemas.android.com/apk/res/android
package = com.example.android.multidex.myapplication>
<应用程序
...
android:name = android.support.multidex.MultiDexApplication>
...
< / application>
< / manifest>

注意:如果您使用的是自定义应用程序类(请参见Option1和选项2),必须已经将 application 标记的 android:name 设置为您的自定义应用程序类。



3) multiDexEnabled true 设置添加到build.gradle文件中:

  defaultConfig {
//这里的其他设置
multiDexEnabled true
}

更多信息。


I'm currently developping an Android app using Android Studio. Currently, the app is launching perfectly on Lollipop devices, but crashes at launch due to a ClassNotFoundException on pre-lollipop devices (i've tested on ICS and it fail).

The missing class is always from an external librairies at runtime.

Here's the gradle file :

    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'

android {
    compileSdkVersion 23
    buildToolsVersion '23.0.0'
    defaultConfig {
        applicationId 'com.kappsports.kapp10'
        minSdkVersion 18
        targetSdkVersion 23
        versionCode 1
        versionName '1.0.0'
        multiDexEnabled true
    }
    buildTypes {
        release {
            minifyEnabled false
            shrinkResources true
        }
    }
    lintOptions {
        abortOnError false
    }
    dexOptions {
        incremental true
        javaMaxHeapSize '4g'
    }
}

repositories {
    mavenCentral()
    maven { url "https://oss.sonatype.org/content/repositories/snapshots/" }
    maven { url 'https://maven.fabric.io/public' }
    jcenter()
}

dependencies {
    compile fileTree(dir: 'libs', exclude: 'android-support-v4.jar', include: '*.jar')
    compile('com.crashlytics.sdk.android:crashlytics:2.5.1@aar') {
        transitive = true;
    }
    compile 'com.michaelpardo:activeandroid:3.1.0-SNAPSHOT'
    compile 'com.github.johnpersano:supertoasts:1.3.4@aar'
    compile 'com.google.code.gson:gson:2.3'
    compile 'com.squareup:otto:1.3.5'
    compile 'com.makeramen:roundedimageview:1.3.0'
    compile 'com.jakewharton:butterknife:6.0.0'
    compile 'com.malinskiy:superrecyclerview:1.0.0'
    compile 'com.android.support:multidex:1.0.1'
    compile 'com.jpardogo.materialtabstrip:library:1.0.9'
    compile 'com.nostra13.universalimageloader:universal-image-loader:1.9.3'
    compile 'com.squareup.okhttp:okhttp:2.4.0'
    compile 'org.buraktamturk:loadingview:1.0.0@aar'
    compile 'com.facebook.android:facebook-android-sdk:4.1.0'
    compile 'com.github.navasmdc:MaterialDesign:1.5@aar'
    compile 'net.danlew:android.joda:2.8.2'
    //noinspection GradleCompatible
    compile 'com.android.support:appcompat-v7:22.2.1'
    compile 'com.google.android.gms:play-services:7.5.0'
    //noinspection GradleCompatible
    compile 'com.android.support:recyclerview-v7:22.2.1'

}

Here is a shunk of logcat output :

> 09-06 23:25:58.414  27436-27436/? W/dalvikvm﹕ Link of class
> 'Lio/fabric/sdk/android/InitializationTask;' failed 09-06 23:25:58.414
> 27436-27436/? E/dalvikvm﹕ Could not find class
> 'io.fabric.sdk.android.InitializationTask', referenced from method
> io.fabric.sdk.android.Kit.<init> 09-06 23:25:58.414  27436-27436/?
> W/dalvikvm﹕ VFY: unable to resolve new-instance 8228
> (Lio/fabric/sdk/android/InitializationTask;) in
> Lio/fabric/sdk/android/Kit; 09-06 23:25:58.414  27436-27436/?
> D/dalvikvm﹕ VFY: replacing opcode 0x22 at 0x0003 09-06 23:25:58.414 
> 27436-27436/? W/dalvikvm﹕ Unable to resolve superclass of
> Lio/fabric/sdk/android/InitializationTask; (8269) 09-06 23:25:58.414 
> 27436-27436/? W/dalvikvm﹕ Link of class
> 'Lio/fabric/sdk/android/InitializationTask;' failed 09-06 23:25:58.414
> 27436-27436/? W/dalvikvm﹕ Unable to resolve superclass of
> Lio/fabric/sdk/android/InitializationTask; (8269) 09-06 23:25:58.414 
> 27436-27436/? W/dalvikvm﹕ Link of class
> 'Lio/fabric/sdk/android/InitializationTask;' failed 09-06 23:25:58.414
> 27436-27436/? I/dalvikvm﹕ Could not find method
> io.fabric.sdk.android.InitializationTask.getDependencies, referenced
> from method io.fabric.sdk.android.Kit.getDependencies 09-06
> 23:25:58.414  27436-27436/? W/dalvikvm﹕ VFY: unable to resolve virtual
> method 57413:
> Lio/fabric/sdk/android/InitializationTask;.getDependencies
> ()Ljava/util/Collection; 09-06 23:25:58.414  27436-27436/? D/dalvikvm﹕
> VFY: replacing opcode 0x6e at 0x0002 09-06 23:25:58.414  27436-27436/?
> W/dalvikvm﹕ VFY: unable to find class referenced in signature
> (Lio/fabric/sdk/android/services/common/IdManager;) 09-06 23:25:58.414
> 27436-27436/? W/dalvikvm﹕ Unable to resolve superclass of
> Lio/fabric/sdk/android/InitializationTask; (8269) 09-06 23:25:58.414 
> 27436-27436/? W/dalvikvm﹕ Link of class
> 'Lio/fabric/sdk/android/InitializationTask;' failed 09-06 23:25:58.414
> 27436-27436/? W/dalvikvm﹕ Unable to resolve superclass of
> Lio/fabric/sdk/android/InitializationTask; (8269) 09-06 23:25:58.414 
> 27436-27436/? W/dalvikvm﹕ Link of class
> 'Lio/fabric/sdk/android/InitializationTask;' failed 09-06 23:25:58.414
> 27436-27436/? I/dalvikvm﹕ Could not find method
> io.fabric.sdk.android.InitializationTask.executeOnExecutor, referenced
> from method io.fabric.sdk.android.Kit.initialize 09-06 23:25:58.414 
> 27436-27436/? W/dalvikvm﹕ VFY: unable to resolve virtual method 57412:
> Lio/fabric/sdk/android/InitializationTask;.executeOnExecutor
> (Ljava/util/concurrent/ExecutorService;[Ljava/lang/Object;)V 09-06
> 23:25:58.414  27436-27436/? D/dalvikvm﹕ VFY: replacing opcode 0x6e at
> 0x0011 09-06 23:25:58.414  27436-27436/? W/dalvikvm﹕ VFY: unable to
> find class referenced in signature
> (Lio/fabric/sdk/android/services/common/IdManager;) 09-06 23:25:58.419
> 27436-27436/? W/dalvikvm﹕ Unable to resolve superclass of
> Lio/fabric/sdk/android/InitializationTask; (8269) 09-06 23:25:58.419 
> 27436-27436/? W/dalvikvm﹕ Link of class
> 'Lio/fabric/sdk/android/InitializationTask;' failed 09-06 23:25:58.419
> 27436-27436/? D/dalvikvm﹕ DexOpt: unable to opt direct call 0xe03e at
> 0x05 in Lio/fabric/sdk/android/Kit;.<init> 09-06 23:25:58.419 
> 27436-27436/? D/AndroidRuntime﹕ Shutting down VM 09-06 23:25:58.419 
> 27436-27436/? W/dalvikvm﹕ threadid=1: thread exiting with uncaught
> exception (group=0x41bfb700) 09-06 23:25:58.419  27436-27436/?
> E/AndroidRuntime﹕ FATAL EXCEPTION: main
>     java.lang.NoClassDefFoundError: io.fabric.sdk.android.services.common.ExecutorUtils
>             at com.crashlytics.android.core.CrashlyticsCore.<init>(CrashlyticsCore.java:205)
>             at com.crashlytics.android.core.CrashlyticsCore$Builder.build(CrashlyticsCore.java:189)
>             at com.kappsports.kapp10.Kapp10Application.onCreate(Kapp10Application.java:53)
>             at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1024)
>             at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4684)
>             at android.app.ActivityThread.access$1400(ActivityThread.java:159)
>             at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1376)
>             at android.os.Handler.dispatchMessage(Handler.java:99)
>             at android.os.Looper.loop(Looper.java:176)
>             at android.app.ActivityThread.main(ActivityThread.java:5419)
>             at java.lang.reflect.Method.invokeNative(Native Method)
>             at java.lang.reflect.Method.invoke(Method.java:525)
>             at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1046)
>             at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:862)
>             at dalvik.system.NativeStart.main(Native Method) 09-06 23:25:58.424    2346-2891/? I/ActivityManager﹕ Notify an
> ApplicationCrash

I'm currently out of solution for now. Any clue about that would be appreciated.

Thanks, Regards.

解决方案

1) Add multidex support to your app:

compile 'com.android.support:multidex:1.0.1'

2) Set your application as a MultiDexApplication. Select one of the options below:

This is the source code of android's MultiDexApplication class:

public class MultiDexApplication extends Application {
    public MultiDexApplication() {
    }

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

Option 1) You can extend your custom application from MultiDexApplication:

public class MyApplication extends MultiDexApplication {
    // Your application implementation here
}

Option 2) You can extend your custom application from default Application class, then you need to call MultiDex.install at attachBaseContext(Context base) method:

public class MyApplication extends Application {

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

    // Your application implementation here
}

Option 3) If you don't have any custom application and you don't want any, simply set your application name (at AndroidManifest.xml) to MultiDexApplication:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.android.multidex.myapplication">
    <application
        ...
        android:name="android.support.multidex.MultiDexApplication">
        ...
    </application>
</manifest>

Note: If you are using a custom application class (see Option1 and Option2), application tag's android:name must already be set to your custom application class.

3) Add multiDexEnabled true setting to your build.gradle file:

defaultConfig {
    // Other settings here
    multiDexEnabled true
}

More information.

这篇关于Android:在运行时在Lollipop上加载应用程序库,而不是IceCreamSandwich的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆