Android应用程序构建在发布时抛出错误,调试不';T
我正在尝试构建一个我一直在开发的Android应用程序(这是我采用的一个项目,所以大部分代码不是我的——这对我没有帮助:p),我遇到了一个问题 该应用程序在调试模式下构建良好(在设备上构建并安装以进行测试)。但是,当我尝试构建一个版本时,它失败了 这是gradle控制台中的错误: 任务“:app:lintVitalRelease”的执行失败 Lint在组装发布目标时发现了致命错误 这是Gradle Build中的信息: 错误:错误:此片段类应该是公共的([com.company.appname].fragments.create\u difficle.CreateDilemmaFragment1\u 2.UploadDialogFragment)[ValidFragment] 这是一条令人不快的线:Android应用程序构建在发布时抛出错误,调试不';T,android,Android,我正在尝试构建一个我一直在开发的Android应用程序(这是我采用的一个项目,所以大部分代码不是我的——这对我没有帮助:p),我遇到了一个问题 该应用程序在调试模式下构建良好(在设备上构建并安装以进行测试)。但是,当我尝试构建一个版本时,它失败了 这是gradle控制台中的错误: 任务“:app:lintVitalRelease”的执行失败 Lint在组装发布目标时发现了致命错误 这是Gradle Build中的信息: 错误:错误:此片段类应该是公共的([com.company.appname]
private class UploadDialogFragment extends DialogFragment implements View.OnClickListener
@SuppressLint("ValidFragment")
private class UploadDialogFragment extends DialogFragment implements View.OnClickListener
{
// ..
}
所以我将private改为public,然后它抱怨它应该是一个静态类。问题是,这个类看起来不应该是静态的,因为只要我将它设置为静态,AS就对几乎所有的代码都不满意
我还有几个问题要问:
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所指出的: 片段需要是公共的,因为系统重新启动