Android Studio 项目适用于 Lollipop,但不适用于 Kitkat

Posted

技术标签:

【中文标题】Android Studio 项目适用于 Lollipop,但不适用于 Kitkat【英文标题】:Android Studio project works on Lollipop but does not work on Kitkat 【发布时间】:2016-01-24 11:19:22 【问题描述】:

我有一个 android Studio 项目,该项目在具有 Android 构建版本 Lollipop 的设备上运行良好,但在尝试在具有 Android 构建版本 Kitkat 的设备上运行它时抛出异常。这是我项目的 build.gradle 文件:

android 
    compileSdkVersion 21
    buildToolsVersion "21.1.2"

    defaultConfig 
        minSdkVersion 16
        targetSdkVersion 21
        versionCode 1
        versionName "1.0"
        multiDexEnabled true

            renderscriptTargetApi 22
            renderscriptSupportModeEnabled true

    


dependencies 
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile files('libs/org.apache.commons.io.jar')
    compile files('libs/commons-codec-1.10.jar')
    compile('com.twitter.sdk.android:twitter:1.6.0@aar') 
        transitive = true;
    
    compile files('libs/pinit-sdk-1.0.jar')
    compile project(':bounceScroller')
    compile 'com.ogaclejapan.smarttablayout:library:1.2.1@aar'
    compile 'com.facebook.android:facebook-android-sdk:4.1.0'
    compile 'com.android.support:appcompat-v7:21.2.0'
    compile 'com.github.navasmdc:MaterialDesign:1.5@aar'
    compile 'com.nineoldandroids:library:2.4.+'
    compile 'com.esri.arcgis.android:arcgis-android:10.2.6-2'
    compile 'com.github.clans:fab:1.5.3'
    compile 'com.github.pedrovgs:draggablepanel:1.8'
    compile 'com.android.support:support-v4:21.2.0'
    compile 'com.ogaclejapan.smarttablayout:utils-v4:1.2.1@aar'
    compile 'com.github.bumptech.glide:glide:3.6.0'
    compile project(':rangeseekbar')
    compile 'com.android.support:recyclerview-v7:22.2.0'
    compile 'com.android.support:cardview-v7:22.2.0'
    compile project(':blurry')
    compile 'com.google.android.gms:play-services:7.8.0'

这是我在 Kitkat 设备上运行应用程序时遇到的错误:

java.lang.RuntimeException: Unable to start activity: android.view.InflateException: Binary XML file line #14: Error inflating class android.support.v4.view.ViewPager
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2305)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2363)
            at android.app.ActivityThread.access$900(ActivityThread.java:161)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1265)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:157)
            at android.app.ActivityThread.main(ActivityThread.java:5356)
            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:1265)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081)
            at dalvik.system.NativeStart.main(Native Method)
     Caused by: android.view.InflateException: Binary XML file line #14: Error inflating class android.support.v4.view.ViewPager
            at android.view.LayoutInflater.createView(LayoutInflater.java:626)
            at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:702)
            at android.view.LayoutInflater.rInflate(LayoutInflater.java:761)
            at android.view.LayoutInflater.inflate(LayoutInflater.java:498)
            at android.view.LayoutInflater.inflate(LayoutInflater.java:398)
            at android.view.LayoutInflater.inflate(LayoutInflater.java:354)
            at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:359)
            at android.app.Activity.setContentView(Activity.java:2010)
            at android.visitabudhabi.com.vad.Walkthrough.onCreate(Walkthrough.java:32)
            at android.app.Activity.performCreate(Activity.java:5426)
            at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105)
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2269)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2363)
            at android.app.ActivityThread.access$900(ActivityThread.java:161)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1265)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:157)
            at android.app.ActivityThread.main(ActivityThread.java:5356)
            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:1265)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081)
            at dalvik.system.NativeStart.main(Native Method)
     Caused by: java.lang.reflect.InvocationTargetException
            at java.lang.reflect.Constructor.constructNative(Native Method)
            at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
            at android.view.LayoutInflater.createView(LayoutInflater.java:600)
            at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:702)
            at android.view.LayoutInflater.rInflate(LayoutInflater.java:761)
            at android.view.LayoutInflater.inflate(LayoutInflater.java:498)
            at android.view.LayoutInflater.inflate(LayoutInflater.java:398)
            at android.view.LayoutInflater.inflate(LayoutInflater.java:354)
            at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:359)
            at android.app.Activity.setContentView(Activity.java:2010)
            at android.visitabudhabi.com.vad.Walkthrough.onCreate(Walkthrough.java:32)
            at android.app.Activity.performCreate(Activity.java:5426)
            at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105)
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2269)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2363)
            at android.app.ActivityThread.access$900(ActivityThread.java:161)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1265)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:157)
            at android.app.ActivityThread.main(ActivityThread.java:5356)
            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:1265)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081)
            at dalvik.system.NativeStart.main(Native Method)
     Caused by: java.lang.NoClassDefFoundError: android.support.v4.view.ViewConfigurationCompatFroyo
            at android.support.v4.view.ViewConfigurationCompat$FroyoViewConfigurationVersionImpl.getScaledPagingTouchSlop(ViewConfigurationCompat.java:56)
            at android.support.v4.view.ViewConfigurationCompat.getScaledPagingTouchSlop(ViewConfigurationCompat.java:105)
            at android.support.v4.view.ViewPager.initViewPager(ViewPager.java:368)
            at android.support.v4.view.ViewPager.<init>(ViewPager.java:356)
            at java.lang.reflect.Constructor.constructNative(Native Method)
            at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
            at android.view.LayoutInflater.createView(LayoutInflater.java:600)
            at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:702)
            at android.view.LayoutInflater.rInflate(LayoutInflater.java:761)
            at android.view.LayoutInflater.inflate(LayoutInflater.java:498)
            at android.view.LayoutInflater.inflate(LayoutInflater.java:398)
            at android.view.LayoutInflater.inflate(LayoutInflater.java:354)
            at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:359)
            at android.app.Activity.setContentView(Activity.java:2010)
            at android.visitabudhabi.com.vad.Walkthrough.onCreate(Walkthrough.java:32)
            at android.app.Activity.performCreate(Activity.java:5426)
            at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105)
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2269)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2363)
            at android.app.ActivityThread.access$900(ActivityThread.java:161)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1265)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:157)
            at android.app.ActivityThread.main(ActivityThread.java:5356)
            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:1265)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081)
            at dalvik.system.NativeStart.main(Native Method)

这是我的带有 ViewPager 的 XML:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_
    android:layout_
    android:orientation="vertical"
>

    <android.support.v4.view.ViewPager
        android:id="@+id/pager"
        android:layout_
        android:layout_
        android:overScrollMode="never" />

    <LinearLayout
        android:layout_
        android:layout_
        android:layout_below="@+id/pager"
        android:layout_gravity="bottom"
        android:orientation="horizontal">

        <ImageView
            android:id="@+id/first"
            android:layout_
            android:layout_
            android:layout_weight="3.3"
            android:background="#c7333f" />

        <ImageView
            android:id="@+id/second"
            android:layout_
            android:layout_
            android:layout_weight="3.3"
            android:background="#FFF" />

        <ImageView
            android:id="@+id/third"
            android:layout_
            android:layout_
            android:layout_weight="3.3"
            android:background="#fff" />
    </LinearLayout>


</FrameLayout>

有人知道怎么解决吗?

【问题讨论】:

请添加有viewpager的布局 @HosseinGerami 我会立即更新我的问题。 ***.com/questions/10780413/… @IntelliJAmiya 我所有的库都使用 Gradle 安装在项目中。 @Lefteris no 实际上我正在为 API 21 构建,请参阅我在问题中发布的 build.gradle 中的默认配置。 【参考方案1】:

如果有人来,我就是这样解决问题的。

在我深入研究了这个问题之后,我发现这不是一个膨胀的异常,虽然这是 logcat 所说的,真正的异常是臭名昭著的 65K 问题click here for more information about the problem 引起的 OutOfMemory 异常,它被 inflate excpetion 包裹.

为了解决这个问题,我首先在我的 build.gradle 文件中添加了 multidex 支持库:

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

然后我按照这三个简单的步骤使其工作:

    如果您自己没有实现 Application 类,您可以在 Android 清单文件中的 application 标签下简单地定义库的 MultiDexApplication:

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

    如果您要实现自己的 Application 类,您可以简单地覆盖 MultiDexApplication 文件:

    公共类 MyAwesomeApplication 扩展 MultiDexApplication

    或者,如果您的应用程序类已经在扩展另一个类,您可以重写 attachBaseContext 方法并为其添加以下调用:

    @覆盖 受保护的无效 attachBaseContext(上下文基础) super.attachBaseContext(context); Multidex.install(this);

我已经有自己的应用程序类,它从“应用程序”类扩展而来,所以我直接跳到第 3 步,瞧,它在 Kitkat 和 Lollipop 上工作。

希望这对任何人都有帮助。快乐编码。

【讨论】:

很高兴看到。很好的解释。快乐的编码 它对我不起作用。我设置了 minSdkVersion 17 targetSdkVersion 26 renderScriptTargetApi 19 这是在我集成了 Realm 数据库之后发生的。请建议我一个解决方案。提前致谢 你的答案太奇怪了,如果你创建你的应用程序类,它当然会扩展Application,所以第 2 点永远不会起作用,而第 3 点的上下文发生了什么:@Override protected void attachBaseContext(Context base) super.attachBaseContext(context); Multidex.install(this); 你有base 变量,但你试图不使用现有的 context 而只是 this,太奇怪了 @user924 哇,你是个聪明人吧?我所说的第 2 点的意思是,如果您之前没有创建应用程序类,您可以创建一个并扩展 MultiDexApplication 而不是 Application,如果您在任何其他功能中不需要它,您可以将其留空。在第 3 点中,变量 base 引用了与单词 this 相同的对象,因此使用任何一个都是相同的,但不知何故取决于您的丰富经验,您会发现这很奇怪。非常感谢您指出这一点:) @EyadMhanna 当然,当你在一两行代码中对同一个对象使用三个不同的变量时,这很奇怪,为什么不直接使用 this 三次呢?有谁写过这样的代码?【参考方案2】:

主要问题是您的 compileSdkVersion 与项目中包含的支持库的主要版本不匹配。请遵守以下规则:

将 targetSdkVersion 设置为 22,因为您想在 Lollipop 设备上使用 Lollipop 功能(暂时不关心 Marshmallow)。

将 compileSdkVersion 设置为 23,因为它是最新的。

将 buildToolsVersion 设置为“23.0.1”,因为它是最新的。

将支持库版本设置为最新匹配的compileSdkVersion:

compile 'com.android.support:appcompat-v7:23.1.0'
compile 'com.android.support:support-v4:23.1.0'
compile 'com.android.support:recyclerview-v7:23.1.0'
compile 'com.android.support:cardview-v7:23.1.0'

【讨论】:

【参考方案3】:

好的。第一次打电话fill_parent

<android.support.v4.view.ViewPager
    android:id="@+id/pager"
    android:layout_
    android:layout_
    android:overScrollMode="never" />

用这个代替你的。

compile 'com.android.support:support-v4:21.0.3'

设置targetSdkVersion 19

编辑1

你设置

compileSdkVersion 23
buildToolsVersion "23.0.1"

targetSdkVersion 23

希望对你有帮助。

【讨论】:

测试用例集minSdkVersion 15 @Eyadoos 我不确定。试试这个并提供反馈 我不知道这是否可行,但即使可行,我也无法使用此解决方案,因为应用程序中的许多设计功能需要 API 21

以上是关于Android Studio 项目适用于 Lollipop,但不适用于 Kitkat的主要内容,如果未能解决你的问题,请参考以下文章

适用于Android Studio的十六进制代码颜色库[关闭]

适用于 android 的 Visual Studio (2015) 模拟器无法正常工作 - XDE.exe - 退出代码 3

VSCode 中的 Flutter beta 热重载适用于 Web,但不适用于 iOS 和 Android(适用于 Android Studio)

哪些 Java SE 版本适用于 android studio 3.1?

适用于 Android Studio 的 Team Foundation 插件

适用于 Android 的 Visual Studio 2015 RC 模拟器无法启动