【问题标题】:Application crashes only in release version应用程序仅在发布版本中崩溃
【发布时间】:2017-03-15 00:49:24
【问题描述】:

当您在 debug 模式下运行应用程序时,应用程序不会崩溃。但是当生成 .apk 文件 release 应用程序崩溃。 并非所有手机都会出现此错误,只有少数装有 android 6 的手机会出现此错误。

logcat 显示问题是类中的 NullPointerException (android.support.v4.widget.drawerlayout)。 NullPointerException 如何仅在发布 apk 上启动?

我们已经禁用了 proguard、minify 和 shrinkResources。没有解决这个错误。

这里有一些日志:

Attempt to invoke virtual method 'int android.view.WindowInsets.getSystemWindowInsetLeft()' on a null object reference
  at android.support.v4.widget.i.a(Unknown Source)
  at android.support.v4.widget.DrawerLayout$d.a(Unknown Source)
  at android.support.v4.widget.DrawerLayout.onMeasure(Unknown Source)
  at android.view.View.measure(View.java:18799)
  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5951)
  at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)    
  at android.support.v7.widget.ContentFrameLayout.onMeasure(Unknown Source)
  at android.view.View.measure(View.java:18799)
  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5951)

【问题讨论】:

  • 你能放一些抽屉布局的代码
  • 你确定,你禁用缩小发布版本?看起来您仍然启用了 proguard:在 android.support.v4.widget.i.a i.a 它是混淆代码
  • 发布您的 build.gradel 文件 android.support.v4.widget.i.a 表明 prorogue 应用于您的 apk。
  • 请发布抽屉代码。
  • 请提供构建工具版本,支持库的版本号。

标签: java android apk release android-6.0-marshmallow


【解决方案1】:
android{
  buildTypes{
     release{
        minifyEnabled false
     }
  }
}

在你的 build.grade 中试试这个。

或者

尝试重新启动您的 Android Studio 以及您的计算机。众所周知,Android Studio 有时可能会执行愚蠢的操作。

【讨论】:

  • 尝试重新启动您的 Android Studio 以及您的计算机?
  • 是的。有时确实有道理。
【解决方案2】:

如果您在发布时使用 proguard, 将您的 gradle 版本降低到 2.1.2

classpath 'com.android.tools.build:gradle:2.1.2'

【讨论】:

    【解决方案3】:
    buildTypes {
        release {
            minifyEnabled false
            shrinkResources false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    
        }
    }
    lintOptions {
        abortOnError false
        checkReleaseBuilds false
        disable 'MissingTranslation'
    }
    

    试试这个或只是清理项目并重新启动项目。 或使缓存无效/从文件选项重新启动。 文件>>使缓存无效/重新启动

    【讨论】:

      【解决方案4】:

      您将通过 android.support.v4.widget.drawerlayout

      收到 NullPointerException

      当应用程序尝试使用 具有 null 值的对象引用。

      NullPointerException 如何仅在发布 apk 时启动?

      当您准备发布应用程序时,您需要配置、构建、 并测试您的应用程序的发布版本。配置 任务很简单,涉及基本的代码清理和代码 有助于优化您的应用程序的修改任务。

      1. 阅读Prepare for Release

      2. 设置minifyEnabled false

      你可以像这样自定义你的build.gradle

       buildTypes {
      
      
          debug {
              minifyEnabled false
              proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
      
          }
      
          release {
              minifyEnabled false
              proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
              debuggable false
              zipAlignEnabled true
              jniDebuggable false
              renderscriptDebuggable false
      
          }
      }
      

      确保使用稳定的支持库和构建工具

          compileSdkVersion 24
          buildToolsVersion "24.0.2"
      
           compile 'com.android.support:appcompat-v7:24.2.0'
           compile 'com.android.support:design:24.2.0'
      

      项目级别

       classpath 'com.android.tools.build:gradle:2.1.2' // or 2.2.2
      

      那么

      在主菜单上,选择文件 |使缓存无效/重新启动。这 出现无效缓存消息,通知您缓存将 在下次启动时失效并重建。使用按钮 使缓存无效的对话框,重新启动 Android Studio。

      注意:您可以向我们提供您的build.gradle。禁用"instant run" 设施。

      .

      【讨论】:

        【解决方案5】:

        您可以采取以下步骤来修复这些类型的错误,并确保您的应用不会在未来的平台更新中崩溃:

        • 如果您的应用使用私有平台库,您应该更新它以包含这些库的自己的副本或使用公共 NDK API。

        • 如果您的应用使用访问私有符号的第三方库,请联系库作者以更新库。

        • 确保将所有非 NDK 库与 APK 打包在一起。

        • 使用标准 JNI 函数,而不是 libandroid_runtime.so 中的 getJavaVM 和 getJNIEnv:

         AndroidRuntime::getJavaVM -> GetJavaVM from <jni.h>
            AndroidRuntime::getJNIEnv -> JavaVM::GetEnv or
            JavaVM::AttachCurrentThread from <jni.h>.
        

        使用 __system_property_get 代替私有 property_get 符号 来自 libcutils.so。为此,请将 __system_property_get 与 以下包括:

        包括

        注意:系统属性的可用性和内容未通过 CTS 测试。更好的解决方法是完全避免使用这些属性。 使用 libcrypto.so 中 SSL_ctrl 符号的本地版本。例如,您应该在 .so 文件中静态链接 libcyrpto.a,或者 包括 libcrypto.so 的动态链接版本 BoringSSL/OpenSSL 并将其打包到您的 APK 中。

        【讨论】:

          【解决方案6】:

          根据android api参考-Android Developer Api Reference

          如果您的布局为窗口的每个垂直边缘配置了多个抽屉视图,则会在运行时引发异常。我怀疑您的抽屉布局不正确。还要检查抽屉的布局重力是否设置为“开始”

          android:layout_gravity="start"
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2021-12-17
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-01-27
            • 2017-01-08
            相关资源
            最近更新 更多