featureModule = apply plugin: 'com.android.dynamic-feature'
libraryModule = apply plugin: 'com.android.library'
Problem - Using any library resources in feature module requires full package name qualifier which eventually creates a problem for databinding generated classes in feature module.
Description - I have this above app structure. When I am trying to use any library resource in any featureModule it requires to specify the resource with full package name qualifier because by default I have the feature resource R as the main import.
So for any kotlin class let say activity code looks like this
feature-1/TestActivity.kt
internal class TestActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val binding: ActivityTestBinding = DataBindingUtil.setContentView(this, R.layout.activity_test)
binding.testName.text = getText(R.string.abc_test) // this resource is present in core-lib module
}
}
The above will lead to an unresolved reference error which you can resolve by using full-name so instead of R.string.abc_test
use com.blah.core-lib.R.string.abc_test
.
R.layout.activity_test
Но для XML -databinding это создает большую проблему. Поскольку R.layout.abc_test
находится в функциональном модуле, он не может получить доступ к библиотечному ресурсу. Я могу решить эту проблему, используя служебный класс, и разрешить служебному классу возвращать строку с квалификатором полного имени пакета, но эта проблема ограничивает многие функции привязки данных, когда я не могу использовать ресурс непосредственно в самом XML.
PS : все это отлично работает, если я конвертирую свой функциональный модуль в библиотечный модуль. Даже на уровне кода я не использую квалификатор полного имени пакета, если это библиотечный модуль.
Есть ли у кого-нибудь лучшие предложения по решению этой проблемы для функциональных модулей?