Использование внутреннего общего доступа к приложениям для тестирования модуля динамических функций по запросу не работает

Я пытаюсь использовать внутренний общий доступ к приложениям, чтобы проверить, могу ли я правильно запрашивать и загружать модуль динамических функций по запросу.

Когда я пробую это сделать, я вижу, что сначала он начинает правильно загружать новую функцию, но никогда не устанавливается. Я вижу этиcom.example is installed but certificate mismatchжурналы. Может ли это быть причиной проблемы? Я знаю, что загрузки для внутреннего совместного использования приложений "автоматически подписываются с помощью ключа внутреннего доступа к приложениям, который автоматически создается для вашего приложения Google". источник. Возможно ли, что внутренний общий доступ к приложениям неправильно подписывает apk по запросу?

Загрузите рассматриваемый код:

private const val ONDEMAND_FEATURE_MODULE_NAME: String = "ondemandfeature" // must match gradle module name

fun downloadOnDemandFeature(context: Context) {
    val request = SplitInstallRequest
            .newBuilder()
            .addModule(ONDEMAND_FEATURE_MODULE_NAME)
            .build()

    val splitInstallManager = create(context)

    // Initializes a variable to later track the session ID for a given request.
    var mySessionId = 0
    val listener = SplitInstallStateUpdatedListener { state ->
        if (state.sessionId() == mySessionId) {
            when (state.status()) {
                SplitInstallSessionStatus.DOWNLOADING -> {
                    val totalBytes = state.totalBytesToDownload()
                    val progress = state.bytesDownloaded()
                    Timber.d("Downloading on demand module: state DOWNLOADING")
                    Timber.d("Downloading on demand module: %d of %d bytes", progress, totalBytes)
                }
                SplitInstallSessionStatus.INSTALLED -> {
                    Timber.d("Downloading on demand module: state INSTALLED")
                    // TODO installed, now do stuff
                }
                SplitInstallSessionStatus.CANCELED -> {
                    Timber.d("Downloading on demand module: state CANCELED")
                }
                SplitInstallSessionStatus.CANCELING -> {
                    Timber.d("Downloading on demand module: state CANCELING")
                }
                SplitInstallSessionStatus.DOWNLOADED -> {
                    Timber.d("Downloading on demand module: state DOWNLOADED")
                }
                SplitInstallSessionStatus.FAILED -> {
                    Timber.d("Downloading on demand module: state FAILED")
                }
                SplitInstallSessionStatus.INSTALLING -> {
                    Timber.d("Downloading on demand module: state INSTALLING")
                }
                SplitInstallSessionStatus.PENDING -> {
                    Timber.d("Downloading on demand module: state PENDING")
                }
                SplitInstallSessionStatus.REQUIRES_USER_CONFIRMATION -> {
                    Timber.d("Downloading on demand module: state REQUIRES USER CONFIRMATION")
                }
                SplitInstallSessionStatus.UNKNOWN -> {
                    Timber.d("Downloading on demand module: state UNKNOWN")
                }
            }
        }
    }

    splitInstallManager.registerListener(listener)

    splitInstallManager
            .startInstall(request)
            .addOnSuccessListener { sessionId -> mySessionId = sessionId }
            .addOnFailureListener { exception ->
                Timber.e(exception, "Error installing ondemandfeature")
            }
}

Вы можете увидеть мои полные логи здесь.

1 ответ

Я реализовал в своем приложении динамический модуль размером более 10 МБ, который также требует подтверждения пользователя. Ваш код выглядит нормально. Пожалуйста, убедитесь, что вы делаете следующее правильно.

  1. В (case:SplitInstallSessionStatus.INSTALLED:) убедитесь, что вы создали намерение перейти к своей динамической активности.

    Intent intent = new Intent(); intent.setClassName("your package name", "your packagename.module.yourdynamicactivity"); startActivity(intent);

  2. Убедитесь, что ваши (versionCode *) и (versionName " * ") совпадают в файле buidle.gradle приложения и вашего модуля.

  3. В своем динамическом модуле вызовите этот метод в своей деятельности.

    @Override protected void attachBaseContext(Context newBase) { super.attachBaseContext(newBase); SplitCompat.install(this); }

Другие вопросы по тегам