Migração para o Android

Este guia explica como migrar do Kit de ML para Firebase para Android.

Atualizar importações do Gradle

O SDK do Kit de ML exige apenas uma dependência para cada API do Kit de ML. Não é necessário especificar bibliotecas comuns, como firebase-ml-vision ou firebase-ml-natural-language. O Kit de ML usa o namespace com.google.android.gms para bibliotecas que dependem dos Serviços do Google Play.

APIs Vision

Os modelos agrupados são entregues como parte do aplicativo. Os modelos finos precisam ser baixados. Algumas APIs estão disponíveis nas formas agrupada e fina, outras apenas em uma ou outra:

APIAgrupadaFina
Reconhecimento de textox (Beta)x
Detecção facialxx
Leitura de código de barrasxx
Marcação de imagensxx
Detecção de objeto e rastreamentox-

Atualize as dependências das bibliotecas do Android do Kit de ML no arquivo Gradle do módulo (nível do app) (geralmente app/build.gradle.kts) de acordo com as tabelas a seguir:

Modelos agrupados

APIArtefatos antigosNovo artefato
Leitura de código de barras com.google.firebase:firebase-ml-vision:24.0.1
com.google.firebase:firebase-ml-vision-barcode-model:16.0.1
com.google.mlkit:barcode-scanning:17.3.0
Contorno facial com.google.firebase:firebase-ml-vision:24.0.1
com.google.firebase:firebase-ml-vision-face-model:19.0.0
com.google.mlkit:face-detection:16.1.7
Marcação de imagens com.google.firebase:firebase-ml-vision:24.0.1
com.google.firebase:firebase-ml-vision-image-label-model:19.0.0
com.google.mlkit:image-labeling:17.0.9
Detecção de objetos com.google.firebase:firebase-ml-vision:24.0.1
com.google.firebase:firebase-ml-vision-object-detection-model:19.0.3
com.google.mlkit:object-detection:17.0.2

Modelos finos

APIArtefatos antigosNovo artefato
Leitura de código de barras com.google.firebase:firebase-ml-vision:24.0.1 com.google.android.gms:play-services-mlkit-barcode-scanning:18.3.1
Detecção facial com.google.firebase:firebase-ml-vision:24.0.1 com.google.android.gms:play-services-mlkit-face-detection:17.1.0
Reconhecimento de texto com.google.firebase:firebase-ml-vision:24.0.1 com.google.android.gms:play-services-mlkit-text-recognition:19.0.1

AutoMLVision Edge

APIArtefato antigoNovo artefato
AutoML sem download com.google.firebase:firebase-ml-vision:24.0.1
com.google.firebase:firebase-ml-vision-automl:18.0.3
com.google.mlkit:image-labeling-custom:17.0.3
AutoML com download com.google.firebase:firebase-ml-vision:24.0.1
com.google.firebase:firebase-ml-vision-automl:18.0.3
com.google.mlkit:image-labeling-custom:17.0.3

Para hospedar e baixar modelos personalizados, mova seus modelos para o Cloud Storage e adicione a lógica de download ao app para carregá-los usando LocalModel. Para mais detalhes, consulte o guia de migração do Firebase ML para o Cloud Storage.

APIs de linguagem natural

Os modelos agrupados são entregues como parte do aplicativo. Os modelos finos precisam ser baixados:

APIAgrupadaFina
ID do idiomaxx
Resposta inteligentexx (Beta)

Atualize as dependências das bibliotecas do Android do Kit de ML no arquivo Gradle do módulo (nível do app) (geralmente app/build.gradle.kts) de acordo com as tabelas a seguir:

Modelos agrupados

APIArtefatos antigosNovo artefato
ID do idioma com.google.firebase:firebase-ml-natural-language:22.0.0
com.google.firebase:firebase-ml-natural-language-language-id-model:20.0.7
com.google.mlkit:language-id:17.0.6
Resposta inteligente com.google.firebase:firebase-ml-natural-language:22.0.0
com.google.firebase:firebase-ml-natural-language-smart-reply-model:20.0.7
com.google.mlkit:smart-reply:17.0.4

Modelos finos

APIArtefatos antigosNovo artefato
ID do idioma com.google.firebase:firebase-ml-natural-language:22.0.0
com.google.firebase:firebase-ml-natural-language-language-id-model:20.0.7
com.google.android.gms:play-services-mlkit-language-id:17.0.0
Resposta inteligente com.google.firebase:firebase-ml-natural-language:22.0.0
com.google.firebase:firebase-ml-natural-language-smart-reply-model:20.0.7
com.google.android.gms:play-services-mlkit-smart-reply:16.0.0-beta1

Atualizar nomes de classes

Se a classe aparecer nesta tabela, faça a mudança indicada:

Classe antigaNova classe
com.google.firebase.ml.common.FirebaseMLException com.google.mlkit.common.MlKitException
com.google.firebase.ml.vision.common.FirebaseVisionImage com.google.mlkit.vision.common.InputImage
com.google.firebase.ml.vision.barcode.FirebaseVisionBarcodeDetector com.google.mlkit.vision.barcode.BarcodeScanner
com.google.firebase.ml.vision.labeler.FirebaseVisionImageLabel com.google.mlkit.vision.label.ImageLabeler
com.google.firebase.ml.vision.barcode.FirebaseVisionBarcodeDetector com.google.mlkit.vision.barcode.BarcodeScanner
com.google.firebase.ml.vision.automl.FirebaseAutoMLLocalModel com.google.mlkit.common.model.LocalModel
com.google.firebase.ml.vision.automl.FirebaseAutoMLRemoteModel com.google.mlkit.common.model.LocalModel

Requer download manual. Os modelos remotos hospedados pelo Firebase foram descontinuados. Para mais detalhes, consulte o guia de migração do Firebase ML para o Cloud Storage.
com.google.firebase.ml.vision.label.FirebaseVisionOnDeviceImageLabelerOptions com.google.mlkit.vision.label.defaults.ImageLabelerOptions
com.google.firebase.ml.vision.label.FirebaseVisionImageLabel com.google.mlkit.vision.label.ImageLabel
com.google.firebase.ml.vision.label.FirebaseVisionOnDeviceAutoMLImageLabelerOptions com.google.mlkit.vision.label.custom.CustomImageLabelerOptions
com.google.firebase.ml.vision.objects.FirebaseVisionObjectDetectorOptions com.google.mlkit.vision.objects.defaults.ObjectDetectorOptions

Para outras classes, siga estas regras:

  • Remova o prefixo FirebaseVision do nome da classe.
  • Remova outros prefixos que começam com o prefixo Firebase do nome da classe.

Além disso, nos nomes dos pacotes, substitua o prefixo com.google.firebase.ml por com.google.mlkit.

Atualizar nomes de métodos

Há mudanças mínimas no código:

  • A instanciação do detector/scanner/rotulador/tradutor... foi alterada. Agora, cada recurso tem seu próprio ponto de entrada. Por exemplo: BarcodeScanning, TextRecognition, ImageLabeling, Translation... As chamadas para o serviço do Firebase getInstance() são substituídas por chamadas para o método getClient() do ponto de entrada do recurso.
  • A instanciação padrão para TextRecognizer foi removida, já que introduzimos bibliotecas adicionais para reconhecer outros scripts, como chinês e coreano. Para usar as opções padrão com o modelo de reconhecimento de texto de script latino, declare uma dependência em com.google.android.gms:play-services-mlkit-text-recognition e use TextRecognition.getClient(TextRecognizerOptions.DEFAULT_OPTIONS).
  • A instanciação padrão para ImageLabeler e ObjectDetector foi removida, já que introduzimos suporte a modelos personalizados para esses dois recursos. Por exemplo, para usar as opções padrão com o modelo base em ImageLabeling, declare uma dependência em com.google.mlkit:image-labeling e use ImageLabeling.getClient(ImageLabelerOptions.DEFAULT_OPTIONS) em Java.
  • Todos os identificadores (detector/scanner/rotulador/tradutor...) podem ser fechados. Verifique se o close() método é chamado quando esses objetos não forem mais usados. Se você os estiver usando em um Fragment ou AppCompatActivity, uma maneira de fazer isso é chamar LifecycleOwner.getLifecycle() no Fragment ou AppCompatActivity, e em seguida chamar Lifecycle.addObserver.
  • processImage() e detectInImage() nas APIs Vision foram renomeados como process() para consistência.
  • As APIs Natural Language agora usam o termo "tag de idioma" (conforme definido pelo padrão BCP 47) em vez de "código de idioma".
  • Os métodos getter nas classes xxxOptions foram removidos.
  • O método getBitmap() na classe InputImage (que substitui FirebaseVisionImage) não é mais compatível como parte da interface pública. Consulte BitmapUtils.java em exemplo de início rápido do Kit de ML para converter bitmap de várias entradas.
  • FirebaseVisionImageMetadata foi removido. Basta transmitir metadados de imagem, como width, height, rotationDegrees, format, para os métodos de construção do InputImage.

Confira alguns exemplos de métodos Kotlin antigos e novos:

Antigo

// Construct image labeler with base model and default options.
val imageLabeler = FirebaseVision.getInstance().onDeviceImageLabeler

// Construct object detector with base model and default options.
val objectDetector = FirebaseVision.getInstance().onDeviceObjectDetector

// Construct face detector with given options
val faceDetector = FirebaseVision.getInstance().getVisionFaceDetector(options)

// Construct image labeler with local AutoML model
val localModel =
    FirebaseAutoMLLocalModel.Builder()
      .setAssetFilePath("automl/manifest.json")
      .build()
val autoMLImageLabeler =
    FirebaseVision.getInstance()
      .getOnDeviceAutoMLImageLabeler(
          FirebaseVisionOnDeviceAutoMLImageLabelerOptions.Builder(localModel)
            .setConfidenceThreshold(0.3F)
            .build()
    )

Novo

// Construct image labeler with base model and default options.
val imageLabeler = ImageLabeling.getClient(ImageLabelerOptions.DEFAULT_OPTIONS)
// Optional: add lifecycle observer
lifecycle.addObserver(imageLabeler)

// Construct object detector with base model and default options.
val objectDetector = ObjectDetection.getClient(
    ObjectDetectorOptions.DEFAULT_OPTIONS
)

// Construct face detector with given options
val faceDetector = FaceDetection.getClient(options)

// Construct image labeler with local AutoML model
val localModel =
  LocalModel.Builder()
    .setAssetManifestFilePath("automl/manifest.json")
    .build()
val autoMLImageLabeler =
  ImageLabeling.getClient(
    CustomImageLabelerOptions.Builder(localModel)
    .setConfidenceThreshold(0.3F).build())
  

Confira alguns exemplos de métodos Java antigos e novos:

Antigo

// Construct image labeler with base model and default options.
FirebaseVisionImageLabeler imagelLabeler =
     FirebaseVision.getInstance().getOnDeviceImageLabeler();

// Construct object detector with base model and default options.
FirebaseVisionObjectDetector objectDetector =
     FirebaseVision.getInstance().getOnDeviceObjectDetector();

// Construct face detector with given options
FirebaseVisionFaceDetector faceDetector =
     FirebaseVision.getInstance().getVisionFaceDetector(options);

// Construct image labeler with local AutoML model
FirebaseAutoMLLocalModel localModel =
    new FirebaseAutoMLLocalModel.Builder()
      .setAssetFilePath("automl/manifest.json")
      .build();
FirebaseVisionImageLabeler autoMLImageLabeler =
    FirebaseVision.getInstance()
      .getOnDeviceAutoMLImageLabeler(
          FirebaseVisionOnDeviceAutoMLImageLabelerOptions.Builder(localModel)
            .setConfidenceThreshold(0.3F)
            .build());

Novo

// Construct image labeler with base model and default options.
ImageLabeler imageLabeler = ImageLabeling.getClient(
    ImageLabelerOptions.DEFAULT_OPTIONS
);
// Optional: add lifecycle observer
getLifecycle().addObserver(imageLabeler);

// Construct object detector with base model and default options.
ObjectDetector objectDetector = ObjectDetection.getClient(
    ObjectDetectorOptions.DEFAULT_OPTIONS
);

// Construct face detector with given options
FaceDetector faceDetector = FaceDetection.getClient(options);

// Construct image labeler with local AutoML model
LocalModel localModel =
  new LocalModel.Builder()
    .setAssetManifestFilePath("automl/manifest.json")
    .build();
ImageLabeler autoMLImageLabeler =
  ImageLabeling.getClient(
    new CustomImageLabelerOptions.Builder(localModel)
    .setConfidenceThreshold(0.3F).build());
  

Mudanças específicas da API

Leitura de código de barras

Para a API Barcode Scanning, agora há duas maneiras de entregar os modelos:

  • Por meio dos Serviços do Google Play, também conhecido como "fino" (recomendado) : isso reduz o tamanho do app, e o modelo é compartilhado entre aplicativos. No entanto, os desenvolvedores precisam garantir que o modelo seja baixado antes de usá-lo pela primeira vez.
  • Com o APK do seu app, também conhecido como "agrupado" : isso aumenta o tamanho do app, mas significa que o modelo pode ser usado imediatamente.

As duas implementações são um pouco diferentes, com a versão "agrupada" tendo várias melhorias em relação à versão "fina". Os detalhes dessas diferenças podem ser encontrados nas diretrizes da API Barcode Scanning.

Detecção facial

Para a API Face Detection, há duas maneiras de entregar os modelos:

  • Por meio dos Serviços do Google Play, também conhecido como "fino" (recomendado) : isso reduz o tamanho do app, e o modelo é compartilhado entre aplicativos. No entanto, os desenvolvedores precisam garantir que o modelo seja baixado antes de usá-lo pela primeira vez.
  • Com o APK do seu app, também conhecido como "agrupado" : isso aumenta o tamanho do download do app , mas significa que o modelo pode ser usado imediatamente.

O comportamento das implementações é o mesmo.

Tradução

  • TranslateLanguage agora usa nomes legíveis para as constantes (por exemplo, ENGLISH) em vez de tags de idioma (EN). Elas também são @StringDef, em vez de @IntDef, e o valor da constante é a tag de idioma BCP 47 correspondente.

AutoML Image Labeling (descontinuado)

O download de modelos personalizados para marcação de imagens usando o AutoML foi descontinuado e será desativado em 15 de junho de 2027. Use o Cloud Storage para hospedar modelos e adicione a lógica de download ao app para baixar os modelos. Para mais detalhes, consulte o guia de migração do Firebase ML para o Cloud Storage.

Detecção e rastreamento de objetos

Se o app usa a detecção de objetos com classificação aproximada, observe que o novo SDK mudou a maneira como retorna a categoria de classificação para objetos detectados.

A categoria de classificação é retornada como uma instância de DetectedObject.Label em vez de um número inteiro. Todas as categorias possíveis para o classificador aproximado estão incluídas na classe PredefinedCategory.

Confira um exemplo do código Kotlin antigo e novo:

Antigo

if (object.classificationCategory == FirebaseVisionObject.CATEGORY_FOOD) {
    ...
}

Novo

if (!object.labels.isEmpty() &&
    object.labels[0].text == PredefinedCategory.FOOD) {
    ...
}
// or
if (!object.labels.isEmpty() &&
    object.labels[0].index == PredefinedCategory.FOOD_INDEX) {
    ...
}

Confira um exemplo do código Java antigo e novo:

Antigo

if (object.getClassificationCategory() == FirebaseVisionObject.CATEGORY_FOOD) {
    ...
}

Novo

if (!object.getLabels().isEmpty()
    && object.getLabels().get(0).getText().equals(PredefinedCategory.FOOD)) {
    ...
}
// or
if (!object.getLabels().isEmpty()
    && object.getLabels().get(0).getIndex() == PredefinedCategory.FOOD_INDEX) {
    ...
}

A categoria "desconhecida" foi removida. Quando a confiança da classificação de um objeto é baixa, não retornamos nenhum rótulo.

Remover dependências do Firebase

Remova as dependências do Firebase após a migração. Siga estas etapas:

  • Remova o arquivo de configuração do Firebase excluindo o arquivo de configuração google-services.json no diretório do módulo (nível do app) do seu aplicativo.
  • Substitua o plug-in do Gradle dos Serviços do Google no arquivo Gradle do módulo (nível do app) (geralmente app/build.gradle.kts) pelo plug-in Strict Version Matcher:

Antes

plugins {
  id("com.android.application")
  id("com.google.gms.google-services")
}

android {
  // …
}

Depois

plugins {
  id("com.android.application")
  id("com.google.android.gms.strict-version-matcher-plugin")
}

android {
  // …
}
  • Substitua o caminho de classe do plug-in do Gradle dos Serviços do Google no arquivo Gradle do projeto (nível raiz) (build.gradle.kts) pelo do plug-in Strict Version Matcher:

Antes

buildscript {
  dependencies {
    // ...

    classpath("com.google.gms:google-services:4.3.3")
  }
}

Depois

buildscript {
  dependencies {
    // ...
    classpath("com.google.android.gms:strict-version-matcher-plugin:1.2.1")
  }
}

Exclua o app do Firebase no console do Firebase de acordo com as instruções no site de suporte do Firebase.

Como receber ajuda

Se você tiver problemas, consulte nossa página da comunidade em que descrevemos os canais disponíveis para entrar em contato conosco.