Android应用程序构建在发布时抛出错误,调试不';T

Android应用程序构建在发布时抛出错误,调试不';T,android,Android,我正在尝试构建一个我一直在开发的Android应用程序(这是我采用的一个项目,所以大部分代码不是我的——这对我没有帮助:p),我遇到了一个问题 该应用程序在调试模式下构建良好(在设备上构建并安装以进行测试)。但是,当我尝试构建一个版本时,它失败了 这是gradle控制台中的错误: 任务“:app:lintVitalRelease”的执行失败 Lint在组装发布目标时发现了致命错误 这是Gradle Build中的信息: 错误:错误:此片段类应该是公共的([com.company.appname]

我正在尝试构建一个我一直在开发的Android应用程序(这是我采用的一个项目,所以大部分代码不是我的——这对我没有帮助:p),我遇到了一个问题

该应用程序在调试模式下构建良好(在设备上构建并安装以进行测试)。但是,当我尝试构建一个版本时,它失败了

这是gradle控制台中的错误:

任务“:app:lintVitalRelease”的执行失败

Lint在组装发布目标时发现了致命错误

这是Gradle Build中的信息:

错误:错误:此片段类应该是公共的([com.company.appname].fragments.create\u difficle.CreateDilemmaFragment1\u 2.UploadDialogFragment)[ValidFragment]

这是一条令人不快的线:

private class UploadDialogFragment extends DialogFragment implements View.OnClickListener
@SuppressLint("ValidFragment")
private class UploadDialogFragment extends DialogFragment implements View.OnClickListener
{ 
  // ..
}
所以我将private改为public,然后它抱怨它应该是一个静态类。问题是,这个类看起来不应该是静态的,因为只要我将它设置为静态,AS就对几乎所有的代码都不满意

我还有几个问题要问:

  • 这怎么只是发布版本的问题而不是调试的问题

  • 在构建发布时,有没有办法忽略此“错误”

  • 这个错误一定有原因,对吗?为什么在调试时忽略它而不是在发布时忽略它?修复此问题有哪些好处/坏处?因为据我所知,这个应用程序运行得很好,所以我真的看不出问题所在

  • PS:我的java技能非常好。我对这门语言很熟悉,但是当我要知道什么是静态类,什么是允许的,什么是不允许的,为什么是(不允许的),等等的时候,我有很多东西要学。所以请温柔一点,我正在努力学习这些东西:)

    更新:根据要求,这里是我的构建的相关部分。gradle:

    android {
        compileSdkVersion 24
        buildToolsVersion '24.0.1'
        useLibrary 'org.apache.http.legacy'
        defaultConfig {
            applicationId "[com.pany.appname]"
            minSdkVersion 15
            targetSdkVersion 22
            multiDexEnabled true
        }
        buildTypes {
            release {
                minifyEnabled false
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
            }
        }
        productFlavors {
        }
    }
    

    您可以将此选项放在build.gradle部分的android块中

            lintOptions {
              checkReleaseBuilds false
            }
    

    您可以将此选项放在build.gradle部分的android块中

            lintOptions {
              checkReleaseBuilds false
            }
    

    单杰伦的答案应该有效。但更好地理解问题所在。片段需要是公共的,因为系统会在方向更改时重新创建它们。另一个警告是因为非静态内部类持有对其outter类的引用,因此它会创建memmory泄漏。
    最好的办法是把碎片移到他自己的班级。或者将其公开,忽略lint警告(这可能会造成内存泄漏,但保密可能会使应用程序崩溃)

    杰伊·珊恩的答案应该有效。但更好地理解问题所在。片段需要是公共的,因为系统会在方向更改时重新创建它们。另一个警告是因为非静态内部类持有对其outter类的引用,因此它会创建memmory泄漏。
    最好的办法是把碎片移到他自己的班级。或者将其公开,忽略lint警告(这可能会造成memmory泄漏,但保持隐私可能会使应用程序崩溃)

    我总结了本文中给出的一些答案,并将其收集在一篇文章中。也更容易接受:)

    --为什么快速修复不是真正的修复--

    有可能让这个项目成功地构建一个发布apk(见下文)。但是仅仅这样做而不去想可能不是一个好主意

    正如X3Btel所指出的:

    片段需要是公共的,因为系统会在方向更改时重新创建它们。另一个警告是因为非静态内部类持有对其outter类的引用,因此它会创建memmory泄漏。最好的办法是把碎片移到他自己的班级。或者将其公开并忽略lint警告(这可能会造成memmory泄漏,但将其保密可能会使应用程序崩溃)

    在我的例子中,我可以通过确保在片段的父活动完成时完成该片段,使其保持非静态并避免内存泄漏。这并不漂亮,但它可以修复内存泄漏,而且我不必重构很多我没有编写的代码。也就是说:由于Android生命周期的工作方式,拥有一个活动或片段并将另一个活动/片段声明为内部类显然是一种不好的做法

    下面是一些关于这个主题的更多阅读,我发现它们很有用(只有在我发布这个问题后才发现):

    --快速解决方案--

    1)在构建过程中不要检查lint错误(正如Jay Shan所指出的)

    将lintOptions->checkReleaseBuilds选项添加到build.gradle

    android {
      // ..
      lintOptions {
        checkReleaseBuilds false
      }
    }
    
    android {
      // ..
      lintOptions {
        abortOnError false
      }
    }
    
    2)检查错误,但即使发现错误也要继续构建

    这可能比根本不检查错误要安全一点,因为至少在日志输出的某个地方会得到警告

    将lintOptions->abortOnError选项添加到build.gradle

    android {
      // ..
      lintOptions {
        checkReleaseBuilds false
      }
    }
    
    android {
      // ..
      lintOptions {
        abortOnError false
      }
    }
    
    3)在错误发生的地方抑制错误

    我发现这是首选的方法,因为您仍然可以使用lint查找其他问题,并在出现问题时将其中止,但同时可以忽略已检查的内容

    在我的例子中,我必须在违规行之前添加@SuppressLint(“ValidFragment”):

    private class UploadDialogFragment extends DialogFragment implements View.OnClickListener
    
    @SuppressLint("ValidFragment")
    private class UploadDialogFragment extends DialogFragment implements View.OnClickListener
    { 
      // ..
    }
    
    更新2018/01/04


    如果您使用最新版本的Android支持库(及其片段实现,而不是操作系统),如果您尝试初始化该片段,您的应用程序将崩溃(IllegalStateException)。抑制警告对您没有帮助。您只需修复底层问题,将内部类公开并保持静态,或者将该类移动到单独的文件中。

    我总结了本文中给出的一些答案,以便将它们收集到一个文件中。也更容易接受:)

    --为什么快速修复不是真正的修复--

    有可能让这个项目成功地构建一个发布apk(见下文)。但是仅仅这样做而不去想可能不是一个好主意

    正如X3Btel所指出的:

    片段需要是公共的,因为系统重新启动