Комментарии 9
Отличный материал, спасибо за продолжение!
От себя добавлю, что с появлением partialResult методы beforeCheckRootProject и afterCheckRootProject теперь вызываются на каждый модуль (аналогично beforeCheckEachProject/afterCheckEachProject), поэтому при обновлении Lint стоит быть осторожнее.
Из неочевидного: хоть и можно создать Incident без указания Location, в отчёте он не отобразится, если Location не указать. Или, возможно, я что‑то делал не так 🤷♂️
У меня была задача, найти действительно ли существует класс в проекте при использовании рефлексии Class.forName("com.example.AnyClass"). С помощью линта не получилось это сделать, так как линт не позволяет хранить глобальные данные, все данные хранятся в скоупе каждого изолированного модули. И даже checkDependencies=true не помогает, так как прикол именно в том, чтоб находить классы не в модулях, от которых не зависим. Сталкивались с таким?
из-за того что checkDependencies=false, не получится собрать, checkPartialsResults будет срабатывать после прогона каждого модуля по отдельности, а не в самом конце
Я не очень глубоко погружался, свои хотелки в проекте получилось решить более простыми путями, но насколько копал, после каждого модуля триггерится afterCheckEachProject, а вот checkPartialsResults один раз при формировании финального отчёта. В любом случае, первоисточник этого механизма можно попробовать поискать в UnusedResourceDetector. А я правильно понял, вы хотите подсвечивать линтом, что при использовании рефлексии класса с таким именем/пакетом не существует?
да все верно, просто хотел указать на существование класса при рефлексии. Чтобы воспроизвести эту проблему, достаточно отключить проверки зависимых модулей и попытаться запустить проверки, и увидите что checkPartialResults вызывается после afterCheckEachProject. А детекторы типа UnusedResourceDetector вызывают повторную фазу для проверок, но опять же непонятно как именно это работает внутри
Как будто вашу задачу проще сделать, например, написав свой gradle плагин, где пройтись поиском по файлам проекта (учесть, что класс может лежать в jar каком-нибудь, короче заморочек с ходу много). Линтом даже без упомянутой проблемы как будто нормально не сделать, да и анализировать весь проект, даже если без библиотек, очень накладно будет.
Погружение в мир Lint'a в Android-проекте (часть 2)