Guia de migração do SDK do driver 5.0 do Android

Este guia descreve as mudanças necessárias para migrar para a versão 5.0.

Atualizações do Gradle e do Plug-in do Android para Gradle

Fazer upgrade das versões do Gradle e do Plug-in do Android para Gradle

Primeiro, faça upgrade das versões do Gradle e do plug-in do Android para Gradle. Essa atualização inclui melhor compatibilidade com determinadas dependências do SDK (incluindo Kotlin 1.9), além de algumas correções de bugs críticos.

Esta versão principal do SDK requer as seguintes dependências de versão para seu projeto de aplicativo Android:

  • uma versão do Gradle pelo menos v7.5.0, mas não superior a v7.6.0.
  • uma versão do Plug-in do Android para Gradle (AGP) no intervalo v7.4.x.

Você pode segmentar uma versão mais recente dos plug-ins, mas pode receber avisos de suspensão de uso ou alguns recursos novos podem não funcionar.

Para modificar a versão do Gradle, mude a linha no arquivo /gradle/wrapper/gradle-wrapper.properties do projeto.

distributionUrl=https\://services.gradle.org/distributions/gradle-7.5.1-all.zip

Para modificar a versão do Plug-in do Android para Gradle, edite o arquivo build.gradle que contém o bloco buildscript. Exemplo:

buildscript {
    repositories {
        google()
        mavenCentral()
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:7.4.1'
    }
}

Migração da compatibilidade da biblioteca do Java 7 para o Java 8

Etapa 1: ativar o suporte à biblioteca Java 8

Origem

Como o nível mínimo da API do SDK é 23 e a versão necessária do AGP é 7.4 ou mais recente, a configuração é um pouco diferente da documentação de origem mencionada.

buildscript {

    repositories {
        google()
        mavenCentral()
        jcenter()
        maven {
            url = uri("https://storage.googleapis.com/r8-releases/raw")
        }
    }
    dependencies {
        classpath 'com.android.tools:r8:8.0.46'
        classpath 'com.android.tools.build:gradle:7.4.1'
    }
}

android {
    compileOptions {
        // Flag to enable support for the new language APIs
        coreLibraryDesugaringEnabled true
        // Sets Java compatibility to Java 8
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}

dependencies {
    coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs_nio:2.0.3'
}

Etapa 2: migrar do Proguard ou Dexguard para o R8

R8, fonte

O AGP v7.4 e versões mais recentes usam o R8 como a ferramenta padrão de redução, ofuscação e otimização para o binário. Portanto, nenhuma ação especial é necessária neste momento.

Se o projeto for migrado do AGP 4.0 ou de uma versão mais recente, o AGP poderá emitir os seguintes avisos sobre remoções de arquivos:

  • Uso de useProguard true no arquivo build.gradle
  • Uso de android.enableR8=false no arquivo gradle.properties

A remoção dessas linhas geralmente resolve esses problemas.

Migração do Kotlin 1.6 para o 1.9

Etapa 1: migrar para o plug-in do Kotlin para Gradle 1.9.0

Origem

Atualize a versão do plug-in do Kotlin Gradle no arquivo build.gradle do módulo de nível superior do aplicativo. Adicione org.jetbrains.kotlin:kotlin-gradle-plugin nas dependências do bloco buildscript, caso esteja faltando.

buildscript {
  dependencies {
    classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.9.0"
  }
}

Migre seu aplicativo do Kotlin-synthetics se você estiver usando o plug-in do Kotlin para Gradle 1.6.X ou 1.7.X. Consulte o guia de migração oficial para mais informações.

Etapa 2: fazer upgrade do kotlin-stdlib para 1.9.0

Origem

Faça upgrade do kotlin-stblib para 1.9.0 no arquivo build.gradle do aplicativo.

dependencies {
    implementation "org.jetbrains.kotlin:kotlin-stdlib:1.9.0"
}

Remova todas as referências a kotlin-stdlib-jdk7 ou kotlin-stdlib-jdk8. Ambas as dependências foram consolidadas em kotlin-stdlib a partir do Kotlin 1.8.0.

Descontinuação do StatusListener

A interface StatusListener foi descontinuada (será removida na v6) e substituída por DriverStatusListener.

Há principalmente três mudanças:

  1. Mude a interface implements de StatusListener para DriverStatusListener.
  2. Adicione um parâmetro Nullable cause a updateStatus.
  3. Chame o DriverContextBuilder.setDriverStatusListener em vez do setStatusListener.

DriverStatusListener compartilha a mesma estrutura de StatusListener. A principal diferença entre eles é que DriverStatusListener.updateStatus() usa um parâmetro extra chamado cause. Isso fornece aos usuários insights sobre a causa de uma atualização com nível de status de erro.

Normalmente, você usa cause para recuperar o código de erro retornado pelo Fleet Engine em atualizações de local com falha.

O exemplo a seguir ilustra como implementar StatusListener:

class MyStatusListener implements StatusListener {
  /** Called when background status is updated during actions such as location reporting. */
  @Override
  public void updateStatus(
      StatusLevel statusLevel, StatusCode statusCode, String statusMsg) {
    // Implementation
  }
}

// Inject StatusListener into DriverContext.
DriverContextBuilder.setStatusListener(new MyStatusListener());

Confira a seguir um exemplo de implementação de DriverStatusListener:

class MyStatusListener implements DriverStatusListener {
  /** Called when background status is updated during actions such as location reporting. */
  @Override
  public void updateStatus(
      StatusLevel statusLevel, StatusCode statusCode, String statusMsg, @Nullable Throwable cause) {
    // Existing implementation

    if (cause != null && cause instanceof StatusRuntimeException) {
      if (Status.NOT_FOUND.getCode().equals(cause.getStatus().getCode())) {
        // NOT_FOUND gRPC exception thrown by Fleet Engine.
      }
    }
  }
}

DriverContextBuilder.setStatusListener(new MyStatusListener());

Implementar DriverStatusListener como uma interface funcional

O DriverStatusListener é compatível com interfaces funcionais do Java, assim como o predecessor dele. Confira um exemplo:

DriverContextBuilder.setDriverStatusListener((statusLevel, statusCode, statusMsg, cause) -> {
  if (cause != null && cause instanceof StatusRuntimeException) {
    if (Status.NOT_FOUND.getCode().equals(cause.getStatus().getCode())) {
      // NOT_FOUND gRPC exception thrown by Fleet Engine.
    }
  }
});