Проблема заключалась в том, что я не мог заставить Android Studio уважать @ParametersAreNonnullByDefault во всех подпакетов (т.е. рекурсивно для всех файлов Java в com.company.name)
Я написал aсценарий градации, однако, чтобы проверить, package-info.java файлы генерируются внутри ea ch папок подпакета и создать его, если необходимо. Скрипт выполняется непосредственно перед assembleDebug задача.
Таким образом, получается, что можно направить @ParametersAreNonnullByDefault аннотация на все классы java в вашем проекте.
Загрузить источник here. Не забудьте заменить строку 19 на ваше имя пакета.
Использование:
apply plugin: 'com.android.application'
apply from: 'nonnull.gradle'
android {
compileSdkVersion 24
buildToolsVersion "24.0.2"
[...]
}
Не забудьте включить package-info.java файлы в .gitignore
//File: .gitignore
package-info.java
Checkstyle правило:
<module name="JavadocPackage"/>
проверяет, является ли пакет- info.java включен в каждый подпакет.
Источник:
/**
* File: nonnull.gradle
*
* Generates package-info.java for appropriate packages
* inside src/main/java folder.
*
* This is a workaround to define @ParametersAreNonnullByDefault for all Java classes in a package
* i.e. including all subpackages (note: edit package name in line no. 19).
*/
task generateNonNullJavaFiles(dependsOn: "assembleDebug", type: Copy) {
group = "Copying"
description = "Generate package-info.java classes"
def infoFileContentHeader = getFileContentHeader();
def infoFileContentFooter = getFileContentFooter();
def sourceDir = file("${projectDir}" + File.separatorChar + "src" + File.separatorChar +
"main" + File.separatorChar + "java" + File.separatorChar +
"com" + File.separatorChar + "company" + File.separatorChar + "name")
sourceDir.eachDirRecurse { dir ->
def infoFilePath = dir.getAbsolutePath() + File.separatorChar + "package-info.java"
if (!file(infoFilePath).exists()) {
def infoFileContentPackage = getFileContentPackage(dir.getAbsolutePath());
new File(infoFilePath).write(infoFileContentHeader +
infoFileContentPackage + infoFileContentFooter)
println "[dir] " + infoFilePath + " created";
}
}
println "[SUCCESS] NonNull generator: package-info.java files checked"
}
def getFileContentPackage(path) {
def mainSrcPhrase = "src" + File.separatorChar + "main" + File.separatorChar +
"java" + File.separatorChar
def mainSrcPhraseIndex = path.indexOf(mainSrcPhrase)
def output = path.substring(mainSrcPhraseIndex)
// Win hotfix
if (System.properties['os.name'].toLowerCase().contains('windows')) {
output = output.replace("\\", "/")
mainSrcPhrase = mainSrcPhrase.replace("\\", "/")
}
return "package " + output.replaceAll(mainSrcPhrase, "").replaceAll(
"/", ".") + ";\n"
}
def getFileContentHeader() {
return "/** javadoc goes here \n */\n" +
"@ParametersAreNonnullByDefault\n" +
"@ReturnValuesAreNonnullByDefault\n"
}
def getFileContentFooter() {
return "\n" +
"import javax.annotation.ParametersAreNonnullByDefault;\n" +
"\n" +
"import edu.umd.cs.findbugs.annotations.ReturnValuesAreNonnullByDefault;"
}
Расширенная версия, которая генерирует пакет информационных файлов для Src магистралью, тест & androidTest папки могут быть найдены here.
FindBugs & Lint:
Это работает с FindBugs & пуха.