应用程序崩溃 Android API 小于 5.0(棒棒糖)

App crashing on Android API less than 5.0(lollipop)

我面临的问题是我的 android 应用程序在具有 API 5.0 及更高版本的设备上运行良好,但在具有 Kitkat(4.4) 及其相应较低版本 versions.I 的设备上崩溃知道它与我的 gradle 文件中的构建工具有某种关系,但仍然无法弄清楚 problem.Could 有人请帮我解决这个问题。

这是我的 gradle 文件,

     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'
apply plugin: 'android'

repositories {
    maven { url 'https://maven.fabric.io/public' }
    maven { url 'http://clinker.47deg.com/nexus/content/groups/public' }
}


android {
    compileSdkVersion 22
    buildToolsVersion '22.0.1'

    defaultConfig {
        applicationId "com.abc.example"
        minSdkVersion 10
        targetSdkVersion 22
        multiDexEnabled true
        versionCode 12
        versionName "1.0"
    }
    buildTypes {
        release {
            multiDexEnabled true
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    android {
        packagingOptions {
            exclude 'META-INF/LICENSE'
        }
    }
    android {
        packagingOptions {
            exclude 'META-INF/NOTICE'
        }
    }
}



dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    compile 'com.android.support:appcompat-v7:22.2.0'
    compile('com.fortysevendeg.swipelistview:swipelistview:1.0-SNAPSHOT@aar') {
        transitive = true
        exclude module: 'httpclient'
        exclude group: 'httpclient'
    }

    compile 'com.squareup.retrofit:retrofit:1.9.0'
    compile 'com.squareup.okhttp:mockwebserver:2.3.0'
    compile 'de.hdodenhof:circleimageview:1.2.2'
    compile 'com.android.support:multidex:1.0.1'
    compile 'com.google.android.gms:play-services-maps:7.5.0'
    compile files('libs/bitlyj-2.0.0.jar')

}

构建项目时也出现此错误,

Caused by: java.lang.NoClassDefFoundError: com.package.R$styleable
            at com.package.widgets.StyleableTextView.<init>(StyleableTextView.java:23)

这是 StyleableTextView class,

public class StyleableTextView extends TextView {

    public StyleableTextView(Context context) {
        super(context);
    }

    public StyleableTextView(Context context, AttributeSet attrs) {
        super(context.getApplicationContext(), attrs);
        UiUtil.setCustomFont(StyleableTextView.this, context, attrs,
                R.styleable.com_eywa_wonk_widgets_StyleableTextView,
                R.styleable.com_eywa_wonk_widgets_StyleableTextView_font);
    }

    public StyleableTextView(Context context, AttributeSet attrs, int defStyle) {
        super(context.getApplicationContext(), attrs, defStyle);
        UiUtil.setCustomFont(StyleableTextView.this, context, attrs,
                R.styleable.com_eywa_wonk_widgets_StyleableTextView,
                R.styleable.com_eywa_wonk_widgets_StyleableTextView_font);
    }

}

这是 attrs 中的样式,

<resources>

    <attr name="font" format="string" />

<declare-styleable name="com.package.widgets.StyleableTextView">
        <attr name="font" />

    </declare-styleable>

</resources>

您可能面临的一个问题就是这个问题,因为 explained in the documentation:

multiDexEnabled true

Applications that use multidex may not start on devices that run versions of the platform earlier than Android 4.0 (API level 14) due to a Dalvik linearAlloc bug (Issue 22586). If you are targeting API levels earlier than 14, make sure to perform testing with these versions of the platform as your application can have issues at startup or when particular groups of classes are loaded. Code shrinking can reduce or possibly eliminate these potential issues.

当您使用 multidex 时,请尝试使用 MultiDexAppication 而不是 Application 扩展您的应用程序 class 并重写 [=23= 所需的以下方法] 5.0以下(因为5.0以上支持multidex)

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

并在依赖项中添加这个

编译'com.android.support:multidex:1.0.1'

我刚遇到这个问题,通过将以下行添加到应用程序 AndroidManifest.xml 作为应用程序标签上的属性解决了这个问题:

android:name="android.support.multidex.MultiDexApplication"

我有两个共享相同资源和库的应用程序。唯一的区别在于暴露的接口。我为两者都添加了 multidex,但忘记将上述属性放入其中一个的清单中。 NoClassDefFoundError 一点帮助也没有。

您还可以查看以下内容: http://developer.android.com/tools/building/multidex.html

这可能与特定场景无关,但因为问题的标题与我遇到的问题以及我遇到这个问题的原因有关。所以我在这里回答。 我遇到了与此类似的问题,但在我的例子中,扩展 multidexapplication 和启用 multidex 并没有完成这项工作。我最终使用了一个 plugin for counting methods in my project. By using that I realised that I am no way near the 65K limit and the bug is related to something else. I found this 页面,其中有人讨论过从“设置”中禁用 instant-run,这实际上为我完成了这项工作。现在我没有使用 multi-dex 库,构建速度也更快。如果我再遇到这个问题,我会相应地更新答案。