应用程序仅在发布版本中崩溃

时间:2016-11-01 19:48:38

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

当您在调试模式下运行应用程序时,应用程序无法崩溃。但是当生成.apk文件发布时,应用程序崩溃。 所有手机上都不会发生此错误,只有少数拥有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)

6 个答案:

答案 0 :(得分:4)

NullPointerException

android.support.v4.widget.drawerlayout
  

当应用程序尝试使用时抛出NullPointerException   具有空值的对象引用。

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

  

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

  1. 阅读 Prepare for Release

  2. 设置 minifyEnabled false

  3. 您可以像这样自定义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
    

    然后

      

    在主菜单上,选择“文件”|使高速缓存/重新启动无效。该   将显示Invalidate Caches消息,通知您缓存将   在下次开始时失效并重建。使用中的按钮   对话框使缓存无效,重新启动Android Studio。

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

buildTypes {
    release {
        minifyEnabled false
        shrinkResources false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'

    }
}
lintOptions {
    abortOnError false
    checkReleaseBuilds false
    disable 'MissingTranslation'
}

尝试此操作或只清理项目并重新启动项目。 或者从文件选项中无效缓存/重新启动。 文件>>无效缓存/重新启动

答案 3 :(得分:0)

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

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

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

  • 确保使用APK打包所有非NDK库。

  • 使用标准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中。

答案 4 :(得分:0)

根据android api参考 - Android Developer Api Reference

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

android:layout_gravity="start"

答案 5 :(得分:-2)

android{
  buildTypes{
     release{
        minifyEnabled false
     }
  }
}

在build.grade中尝试此操作。

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