РИТ++ 2017, AppsConf
Зал Касабланка, 6 июня, 15:00
Тезисы:
http://appsconf.ru/2017/abstracts/2819.html
Кодревью – как много в этом слове! Согласитесь, было бы здорово, если бы кодревью было сосредоточено чисто на архитектурных проблемах и потенциальных багах в логике, забыв про всякие небольшие нюансы в духе контрактов определенных классов. И как было бы здорово, если бы про эти нюансы можно было бы намекнуть разработчику ещё в процессе разработки, при этом не стоя у него за плечом и не заглядывая в его монитор.
...
5. 5
Ловим проблемы
Проблема Инструмент Важность
Codestyle Checkstyle 🤔
Потенциальные баги
Тесты, статический
анализ, ... 😵
раньше узнаем ≈ раньше исправим
6. 6
Lint
./gradlew lint
:app:lint
MainActivity.java:22: Error: Call requires API level 21: andro
fab.setTranslationZ(10f);
~~~~~~~~~~~~~~~
Ran lint on variant release: 4 issues found
Ran lint on variant debug: 4 issues found
Wrote HTML report to /app/build/reports/lint-results.html
Wrote XML report to /app/build/reports/lint-results.xml
:app:lint FAILED
./gradlew lintDebug
7. 7
Lint
<?xml version="1.0" encoding="UTF-8"?>
<issues format="4" by="lint 3.0.0-alpha1">
<issue
id="NewApi"
severity="Error"
message="Call requires API level 21: android.view.View#setTranslationZ"
category="Correctness"
priority="6"
summary="Calling new methods on older versions"
explanation="Very long explanation of what you’ve done wrong"
errorLine1=" fab.setTranslationZ(10f);"
errorLine2=" ~~~~~~~~~~~~~~~"
quickfix="studio">
<location
file=".../MainActivity.java"
line="22"
column="13"/>
</issue>
</issues>
11. 11
Baseline
android {
lintOptions {
baseline file("lint-baseline.xml")
}
}
:app:lintDebug
Wrote HTML report to /app/build/reports/lint-results-debug.html
Wrote XML report to/app/build/reports/lint-results-debug.xml
Lint found no new issues (1 error filtered by baseline lint-base
15. 15
Пишем собственные инспекции
public class OkIssueRegistry extends IssueRegistry {
@Override
public List<Issue> getIssues() {
return Arrays.asList(
MissingBatchIdDetector.ISSUE
);
}
}
16. 16
Пишем собственные инспекции
Issue ISSUE = Issue.create(
"MissingBatchId",
"Batch request doesn't have id",
"Every batch request need id due to statistics",
Category.CORRECTNESS,
6,
Severity.FATAL,
new Implementation(MissingBatchIdDetector.class,
Scope.JAVA_FILE_SCOPE)
);
17. 17
Пишем собственные инспекции
public class MissingBatchIdDetector extends Detector
implements JavaPsiScanner {
@Override
public List<String> getApplicableMethodNames() {
return Arrays.asList(BUILD);
}
}
24. 24
Тестируем: особенности
• Можно дебажить во время тестов
• Все используемые классы должны быть в classpath’е
• нужные Android’ные классы – нужен $ANDROID_HOME
• нужны свои классы – начинается веселье
25. 25
Включаем
• Пакуем всё в .aar, прописываем в модуле зависимость
• Нужно явно прописывать зависимость – а если хочется
иметь инспекцию независимо от модуля?
¯_(ツ)_/¯
• Пакуем .jar и кладём в ~/.android/lint
• Каждый разработчик должен сделать это сам – а если
забудет/поменяет компьютер/…?
27. 27
А Kotlin?
• Использует переписанный Lint внутри – вместо Psi внутри uast
• Пока про миграцию на uast ничего не слышно
28. 28
Заключение
• Меньше багов – это всегда хорошо
• Чем раньше мы выявим баг, тем раньше сможем его
исправить
• Lint предоставляет удобные инструменты для раннего
выявления потенциальных проблем, плохую документацию и
хорошую обратную совместимость