应用程序因花式按钮导致的API级别低于21而崩溃

时间:2016-02-26 04:45:50

标签: android libraries

我正在一堆不同的API级别上测试我的应用程序,只是为了仔细检查它是否按预期工作,但在任何级别低于21它崩溃并转储我放在下面的异常。我已经尝试移动依赖项的顺序,我已经确保库在我的libs文件夹中。当我将google服务添加到我的依赖项并启用multidex

时,就会发生这种情况
Caused by: android.view.InflateException: Binary XML file line #10: Error inflating class mehdi.sakout.fancybuttons.FancyButton
            at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:707)
            at android.view.LayoutInflater.rInflate(LayoutInflater.java:755)
            at android.view.LayoutInflater.inflate(LayoutInflater.java:492)
            at android.view.LayoutInflater.inflate(LayoutInflater.java:397)
            at com.schweigert.will.tweettunes.TwitterLoginFragment.onCreateView(TwitterLoginFragment.java:46)
            at android.app.Fragment.performCreateView(Fragment.java:1700)
            at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:890)
            at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1062)
            at android.app.BackStackRecord.run(BackStackRecord.java:684)
            at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1447)
            at android.app.Activity.performStart(Activity.java:5240)
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2157)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2233)
            at android.app.ActivityThread.access$800(ActivityThread.java:135)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:136)
            at android.app.ActivityThread.main(ActivityThread.java:5001)
            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:785)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
            at dalvik.system.NativeStart.main(Native Method)
     Caused by: java.lang.ClassNotFoundException: Didn't find class "mehdi.sakout.fancybuttons.FancyButton" on path: DexPathList[[zip file "/data/app/com.schweigert.will.tweettunes-2.apk"],nativeLibraryDirectories=[/data/app-lib/com.schweigert.will.tweettunes-2, /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)
            at android.view.LayoutInflater.createView(LayoutInflater.java:559)
            at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:696)
            at android.view.LayoutInflater.rInflate(LayoutInflater.java:755)
            at android.view.LayoutInflater.inflate(LayoutInflater.java:492)
            at android.view.LayoutInflater.inflate(LayoutInflater.java:397)
            at com.schweigert.will.tweettunes.TwitterLoginFragment.onCreateView(TwitterLoginFragment.java:46)
            at android.app.Fragment.performCreateView(Fragment.java:1700)
            at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:890)
            at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1062)
            at android.app.BackStackRecord.run(BackStackRecord.java:684)
            at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1447)
            at android.app.Activity.performStart(Activity.java:5240)
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2157)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2233)
            at android.app.ActivityThread.access$800(ActivityThread.java:135)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:136)
            at android.app.ActivityThread.main(ActivityThread.java:5001)
            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:785)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
            at dalvik.system.NativeStart.main(Native Method)

这是引发异常的行

View view = inflater.inflate(R.layout.twitter_login_fragment, container, false);

1 个答案:

答案 0 :(得分:3)

针对Android 5.0及更高版本的Multidex支持

  

Android 5.0及更高版本本身使用名为ART的运行时   支持从应用程序APK文件加载多个dex文件。艺术   在扫描的应用程序安装时执行预编译   classes(.. N).dex文件并将它们编译成单个.oat文件   由Android设备执行。有关Android的更多信息   5.0运行时,请参阅ART简介。

这意味着您的应用可以在API级别21或更高级别上正常运行。

Android 5.0之前的Multidex支持

  

Android 5.0之前的平台版本使用Dalvik运行时   用于执行应用程序代码默认情况下,Dalvik将应用程序限制为单个   每个APK的classes.dex字节码文件。为了解决这个问题   限制,你可以使用multidex支持库,它成为   应用程序的主要DEX文件的一部分,然后管理对其的访问   附加的DEX文件及其包含的代码。

所以,首先要确保你已经导入了正确的依赖,这似乎是你做的。

dependencies {
  compile 'com.android.support:multidex:1.0.1'
}

在清单中,将multidex支持库中的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>

替代方案,如果您的应用扩展了Application课程,则可以覆盖attachBaseContext()方法并致电MultiDex.install(this)以启用multidex

public void onCreate(Bundle arguments) {
    MultiDex.install(getTargetContext());
    super.onCreate(arguments);
    ...
}

最后,您需要通过添加multiDexEnabled true来更新build.gradle文件,如下所示:

defaultConfig {  
        applicationId '{Project Name}'  
        minSdkVersion 15  
        targetSdkVersion 23  
        versionCode 1  
        versionName "1.0"  
        multiDexEnabled true  
    }  

我希望它会帮助你。