2014 год
Новый проект
Kotlin M8
Вдохновлён Guice
Compile time
Меняет байткод
@Component
private class MainComponent {
@Provides
private fun provideMainModule() = MainModule()
@Module
private class MainModule {
@Provides
private fun provideMainRepository(impl: MainRepositoryImpl): MainRepository = impl
}
}
class MainActivity : BaseActivity() {
@Inject private val repository: MainRepository = notNull()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val injector = lightsaber.createInjector(MainComponent())
injector.injectMembers(this)
}
}
ObjectWeb ASM
Transform API
Kotlin ❤️ APT
Своя реализация JSR 269
Компиляция в .java стабы
Компиляция в .class стабы
Как ButterKnife
Только без APT
Больше не используется
class MainActivity : BaseActivity() {
@Bind(R.id.label) private val label: TextView = notNull()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.main_activity)
Sento.bind(this, this)
}
@OnTextChanged(R.id.input)
private fun onInputChanged(text: CharSequence) {
label.text = getValidationMessage(text)
}
}
Удобство
Надёжность
Стабильность
protected static Drawable getDrawableFromResource(View view, int resourceId) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
return view.getContext().getDrawable(resourceId);
} else {
return view.getResources().getDrawable(resourceId);
}
}
protected static Drawable getDrawableFromResource(View view, int resourceId) {
return AppCompatResources.getDrawable(view.getContext(), resourceId));
}
Генерация Parcelable
Для Kotlin
Опять без APT
sealed class Selection : AutoParcelable {
data class Item(val id: String) : Selection()
object None : Selection()
}
Часть Lightsaber
DOM для классов
Поисковые запросы
grip select methods from inputs where
(isConstructor() and annotatedWith(Types.INJECT_TYPE))
grip
.select(methods)
.from(inputs)
.where(isConstructor() and annotatedWith(Types.INJECT_TYPE))
Обфускатор строк
Демо проект
@Obfuscate
object TopSecretStrings {
const val TOP_SECRET_STRING = "42"
}
Обёртки для PSI
Медленно и тяжело
Что с Java?
Как kapt1, но лучше
Регистрация плагинов
Compile time
Слабая связность
@Colony
@SelectSettlersBySuperType(Feature::class)
@ProduceSettlersAsClasses
@AcceptSettlersViaCallback
annotation class FeatureColony
class MyFeature : Feature { /* ... */ }
@FeatureColony
private class FeatureManager {
init {
Colonist.settle(this)
}
@OnAcceptSettler(colonyAnnotation = FeatureColony::class)
fun onAcceptFeature(featureClass: Class<out Feature>) {
// ...
}
}
Closeable объекты
были закрыты
до сборки мусора
Только DataBinding
BR не используется
Медленная сборка
А также BR и DataBindingComponent
Отключить процессор DataBinding
Собрать проект
Запустить процессор DataBinding
-20% от времени сборки
Нет неожиданных деградаций
Решение не универсальное
Compose вытеснит DataBinding
И многое изменит
kapt не будет first-class citizen
А Kotlin будет
Kotlin-плагины заменят Transform API
И, возможно, kapt
Объединение трансформаций
Парсинг диплинков
Отправка аналитики
Сетевой клиент
Патчи в проекте