Модуль динамических функций Android, ресурс не найден - PullRequest
0 голосов
/ 05 февраля 2019

У меня проблема с запуском действия в загруженном модуле функций, когда он публикуется в магазине воспроизведения.Он всегда падает на setContentView () в активности загруженных модулей.

java.lang.RuntimeException: Unable to start activity ComponentInfo{xxx/xxxActivity}: android.content.res.Resources$NotFoundException: Resource ID #0x7e080000
Caused by: android.content.res.Resources$NotFoundException: Resource ID #0x7e080000
    at android.content.res.ResourcesImpl.getValue(ResourcesImpl.java:227)
    at android.content.res.Resources.loadXmlResourceParser(Resources.java:2149)
    at android.content.res.Resources.getLayout(Resources.java:1158)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:421)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:374)
    at androidx.appcompat.app.AppCompatDelegateImpl.setContentView(AppCompatDelegateImpl.java:469)
    at androidx.appcompat.app.AppCompatActivity.setContentView(AppCompatActivity.java:140)

Действительно странная часть заключается в том, что если я публикую новую версию приложения (только изменение - versionCode) для воспроизведения и обновления приложения, все работает отлично.

При удаленииприложение и установить его снова сбой возвращается.

мое приложение наследует SplitCompatApplication () и просто чтобы быть уверенным, что с тех пор я попытался добавить:

override fun attachBaseContext(newBase: Context?) {
        super.attachBaseContext(newBase)
        SplitCompat.install(this)
    }

к активному элементу в функциональном модуле и отключил proguard, чтобы убедиться, что ничегоудалено во время минимизации

My SplitInstallStateUpdatedListener

private val listener = SplitInstallStateUpdatedListener { state ->
        val multiInstall = state.moduleNames().size > 1
        state.moduleNames().forEach { name ->
            // Handle changes in state.
            when (state.status()) {
                SplitInstallSessionStatus.DOWNLOADING -> {
                    //  In order to see this, the application has to be uploaded to the Play Store.
                    displayLoadingState(state, "Laddar ner $name")
                }
                SplitInstallSessionStatus.REQUIRES_USER_CONFIRMATION -> {
                    /*
                      This may occur when attempting to download a sufficiently large module.
                      In order to see this, the application has to be uploaded to the Play Store.
                      Then features can be requested until the confirmation path is triggered.
                     */
                    startIntentSender(state.resolutionIntent()?.intentSender, null, 0, 0, 0)
                }
                SplitInstallSessionStatus.INSTALLED -> {
                    if(toInstall.isNotEmpty() && toInstall.contains(name)) {
                        toInstall.remove(name)
                    }
                    if(toInstall.isEmpty()) {
                        // Updates the app’s context with the code and resources of the
                        // installed module. (should only be for instant apps but tried it anyway, no change)
                        SplitInstallHelper.updateAppInfo(applicationContext) 
                        Handler().post {
                            viewModel.goToOverview()
                        }
                    }
                }

                SplitInstallSessionStatus.INSTALLING -> displayLoadingState(state, "Installerar $name")
                SplitInstallSessionStatus.FAILED -> {
                    toastAndLog("Error: ${state.errorCode()} for module ${state.moduleNames()}")
                }
            }
        }
    }

Этот код загружает модули в зависимости от утверждений пользователя и запускает действие в базовом приложении

Затем загруженное действие модулей запускается изa BottomSheetDialogFragment вроде этого:

xxx.setOnClickListener(view -> {
                    Intent intent = new Intent();
                    String packageName = Constants.MODULE_BASEPACKAGE + "." + Constants.MODULE_XXXXX;
                    intent.setClassName(getActivity().getPackageName(),packageName + ".XxxxxActivity" );
                    ParcelUuid parcelUuid = new ParcelUuid(UUID.randomUUID());
                    intent.putExtra("uuid", parcelUuid);
                    startActivity(intent);
                    dismiss();
                });

У меня нет идей о том, что делать дальше.Похоже, что это что-то, что не обновляет список ресурсов до тех пор, пока не будет установлено обновление, а перезапуска приложения недостаточно, или я просто упускаю что-то простое?

Ответы [ 2 ]

0 голосов
/ 10 мая 2019

Вы всегда можете получить доступ к ресурсам из основного проекта внутри динамического модуля, так что вы можете просто поместить свои ресурсы для динамического модуля в основное приложение, а затем использовать R.java из основного приложения.

Однако правильный способ открыть эти ресурсы - использовать SplitCompat.install (this) внутри динамического доставленного действия

0 голосов
/ 07 февраля 2019

Это, похоже, ошибка в com.android.tools.build:gradle:3.2.1 Когда я обновился до 3.3.0, проблема решилась сама собой.

Надеюсь, это может помочь кому-то, кто имеетэта проблема ...

...