Android

Blog do Desenvolvedor Android: Construa aplicativos inteligentes para Android: Integre-se ao sistema de inteligência do Android usando AppFunctions

O Android Developers Blog apresenta uma nova funcionalidade chamada AppFunctions, que permite integrar aplicativos ao sistema de inteligência do Android para facilitar tarefas complexas. O artigo detalha como a JetPacker, um app de planejamento de viagens, utiliza essa tecnologia para oferecer recursos como rastreamento de despesas, gerenciamento de itinerários e captura de notas por voz sem intervenção manual.

Compartilhar
Android Developers Blog: Build intelligent Android apps: Integrate into Android's intelligence system using AppFunctions

Interfaces de usuário móveis tradicionais se destacam em tarefas focadas e manuais, e o sistema de inteligência do Android está introduzindo recursos complementares para tornar ações complexas e multi-etapas ainda mais fáceis. Ao complementar as interfaces de usuário tradicionais, AppFunctions fornecem uma nova entrada poderosa: um agente privilegiado no dispositivo pode acessar recursos de aplicativos em segundo plano. Isso é particularmente útil quando os usuários estão dirigindo, caminhando ou realizando outras tarefas simultâneas.

Neste artigo, mostraremos como projetamos e integraramos essas capacidades no nosso aplicativo de planejamento de viagens, JetPacker, usando Android AppFunctions. Exploraremos a lógica por trás das nossas escolhas de recursos, discutiremos as ferramentas especializadas que usamos para acelerar o desenvolvimento e mergulharemos no código que torna tudo isso possível.

Para selecionar quais recursos fornecer ao sistema de inteligência, procuramos por tarefas onde um comando de voz ou texto é objetivamente mais rápido do que tocar em várias telas. Nesta gravação de tela lado a lado, você pode ver essa contraste perfeitamente: à esquerda, um usuário tocando em várias telas para registrar uma despesa; à direita, a mesma tarefa concluída instantaneamente no segundo plano por meio de um agente privilegiado.

Nossa primeira escolha foi o rastreamento de gastos. Registrar um gasto com café durante uma viagem geralmente requer muitos toques - desbloquear o telefone, abrir o aplicativo, encontrar a viagem ativa, navegar até a aba de despesas, clicar no botão adicionar, tirar uma foto do recibo e verificar o resultado. Ao fornecer os recursos addExpense e getExpenses como AppFunctions, o sistema agente lida com toda a operação pesada. Quando o usuário diz: "Adicione um gasto de cinco dólares em café à minha viagem em Paris", o agente pesquisa automaticamente a ID da viagem correta no segundo plano e insere o gasto, pulando completamente o fluxo manual de interface do usuário.

Também priorizamos a gestão de itinerários. Encontrar qual atividade vem a seguir em um itinerário de viagem ocupado geralmente requer rolar por uma visualização densa de cronograma. Ao fornecer getItinerary e addItineraryEvent ao sistema, o usuário pode simplesmente perguntar: "O que estou fazendo a seguir em Paris?" e receber uma resposta imediata.

Finalmente, focamos na captura de notas sem mãos. Digitar lembretes ou anotações enquanto caminha por uma rua movimentada é difícil e inseguro. Expor uma capacidade de nota por voz permite que o usuário diga: "O voo foi incrível, vi um pôr do sol bonito e consegui dormir bem", e o agente privilegiado transcreve automaticamente e salva diretamente no banco de dados de viagem usando a função AppFunction addVoiceNote.

Android MCP alimentado por AppFunctions

Toda essa experiência é construída sobre Android MCP. Nesta design, o aplicativo atua como um servidor local MCP. Em vez de APIs remotas, você fornece os recursos do seu aplicativo diretamente ao sistema de inteligência no dispositivo.

Android AppFunctions

é a API que traz essa ideia à vida. Ela lê funções Kotlin anotadas e as compila em definições de ferramentas seguras do tipo que o agente privilegiado pode descobrir e invocar localmente no dispositivo.

Diagrama destacando nossos aplicativos, a plataforma Android e os agentes do sistema coordenam AppFunctions.

No modelo MCP do Android, seu aplicativo atua como um servidor local MCP que expõe ferramentas estruturadas, enquanto a plataforma Android serve como o registro central de ferramentas. Do lado do cliente MCP, aplicativos de agente são registrados no sistema de inteligência após serem concedidos permissões privilegiadas do sistema para acessar o registro.

Quando um usuário interage com um agente registrado, seu LLM determina se a solicitação pode ser tratada por uma AppFunction, consulta os metadados da plataforma e executa as funções registradas adequadas em segundo plano. Este design cliente-servidor local MCP dá a você o controle total: você escolhe exatamente quais recursos são acessíveis ao agente, mantendo o restante dos dados do seu aplicativo privado.

Como aceleramos o desenvolvimento com habilidades Android

Habilidade de desenvolvimento de AppFunctions

. A habilidade de desenvolvimento de AppFunctions é um companheiro completo durante o ciclo de vida. Ela nos guiou desde a mapeação de classes de dados Kotlin para serializar parâmetros, geração dos pontos de entrada Service, refinamento da documentação KDoc para garantir que o LLM entenda os limites dos parâmetros e configuração de testes automatizados usando ADB.

Fornecendo recursos do aplicativo ao sistema inteligente

Suficiente com a teoria, vamos mergulhar na implementação.

Configuração e instalação de dependências

Iniciamos adicionando as dependências AppFunctions. Uma para a API e uma para o compilador Kotlin Symbol Processing.

implementation("androidx.appfunctions:appfunctions:1.0.0-alpha10")
ksp("androidx.appfunctions:appfunctions-compiler:1.0.0-alpha10")

Mapeando tipos de dados personalizados

Qualquer objeto personalizado trocado com o agente deve ser anotado com @AppFunctionSerializable. Em nosso arquivo TripSerializable.kt, definimos nosso modelo de dados para viagens:

@AppFunctionSerializable(isDescribedByKDoc = true)
data class TripSerializable(
    /** O identificador único da viagem. */
    val id: String,
    /** O título da viagem. */
    val title: String,
    /** A localização de destino da viagem. */
    val location: String,
    /** A data de início da viagem em milissegundos. */
    val startDate: Long,
    /** A data final da viagem em milissegundos. */
    val endDate: Long,
    /** Uma lista de participantes. */
    val participants: List<String>,
)

Fornecendo recursos usando a anotação @AppFunction

A seguir, a habilidade escreveu as funções Kotlin que realizam consultas ao banco de dados e as anotou com @AppFunction. Podemos ver isso em searchTrip:

/**
 * Procura por viagens com base em filtros opcionais como id, título (nome), localização e datas.
 *
 * @param id O identificador único da viagem.
 * @param title O título ou nome da viagem.
 * @param location A localização de destino.
 * @param startDate A data mínima de início em milissegundos.
 * @param endDate A data máxima final em milissegundos.
 * @return Uma lista de viagens que correspondem aos filtros.
 */
@AppFunction(isDescribedByKDoc = true)
suspend fun searchTrip(
    id: String? = null,
    title: String? = null,
    location: String? = null,
    startDate: Long? = null,
    endDate: Long? = null
): List<TripSerializable> {
    return withContext(Dispatchers.IO) {
    // implementação
}

Como AppFunctions executam na thread do UI por padrão, usamos withContext(Dispatchers.IO) para trocar para um despachante de fundo. Além disso, refinamos nossa documentação KDoc para usar verbos imperativos claros e especificar restrições de parâmetros. Esta documentação compila diretamente no esquema da ferramenta, que o agente privilegiado usa para resolver parâmetros e lidar com erros em tempo de execução.

O ponto de entrada do serviço e integração Hilt

Para registrar esses recursos com o sistema inteligente, criamos uma classe base abstrata que estende AppFunctionService. Anotamos-a com @AppFunctionServiceEntryPoint:

@RequiresApi(36)
@AndroidEntryPoint
@AppFunctionServiceEntryPoint(
    serviceName = "JetPackerAppFunctionService",
    appFunctionXmlFileName = "jetpacker_app_function_service"
)
abstract class BaseJetPackerAppFunctionService : AppFunctionService() {
    @Inject internal lateinit var tripDao: TripDao
    // DAOs e referências de banco de dados são injetados aqui...
}

Durante a compilação, KSP gera a subclasse concreta final do serviço JetPackerAppFunctionService, conforme declarado com o parâmetro serviceName. Também registramos app_metadata.xml no manifesto do aplicativo. Este arquivo fornece regras operacionais globais para AppFunctions declaradas pelo JetPacker.

Testando e verificando suas AppFunctions

Uma vez implementado, você deve verificar que suas AppFunctions estão registradas e funcionando corretamente.

Rodando dispositivos ou emuladores com Android 17 ou superior, você pode usar os comandos ADB do terminal para listar e invocar suas funções. Executando adb shell cmd app_function list-app-functions, exibe todas as funções registradas para seu pacote. Você pode então executar uma função específica e testar a integração de banco de dados, executando adb shell cmd app_function execute-app-function enquanto passa uma string JSON de parâmetros brutos.

Ao invés desses comandos ADB, você também pode usar o AppFunctions Testing Agent para inspecionar sua configuração, listar e executar AppFunctions, e até mesmo ver como suas AppFunctions se comportam em um fluxo conversacional real.

Conclusão

Criar recursos de aplicativo que podem ser contribuídos para o sistema inteligente usando AppFunctions requer uma pequena mudança na maneira como pensamos sobre código e documentação. As AppFunctions permitem usar esse novo modelo de interação para apps, permitindo ao agente acessar recursos do app.

Primeiro, a habilidade de desenvolvimento de AppFunctions é uma ferramenta essencial do ciclo de vida, ajudando você a descobrir recursos, implementar e refinar AppFunctions para seus apps. Em segundo lugar, os comentários KDoc são um ativo da API compilada; descrições claras dos parâmetros impactam diretamente na precisão de execução do sistema agente. Finalmente, o Android MCP fornece a execução local-first permitindo que os aplicativos colaborem com segurança com agentes de IA.

Contribuir recursos de aplicativo através das AppFunctions torna seu aplicativo pronto para o sistema inteligente. Nos conte como você está adaptando seus apps para a era agêntica!

Saiba mais

Confira as outras partes desta série do blog post:
Parte 1: Introdução ao app e uma visão geral de alto nível.
Parte 2: Inteligência no dispositivo. Profundidade em APIs GenAI do ML Kit e Gemini Nano para construir recursos de privacidade-first como resumo de itinerário, análise de recibos e processamento local de áudio.
Parte 3: Raciocínio híbrido e em nuvem. Explore como usar o Firebase AI Logic para fundamentar respostas de LLM em dados do mundo real, como Google Maps e contexto da web.
Parte 4 (esta postagem!): Integração com o sistema inteligente do Android usando AppFunctions.
Parte 5 (em breve): Fluxos de trabalho agênticos no aplicativo. Estenda o app com um assistente de reserva end-to-end alimentado por A2UI e ADK.

Interessado em mais sobre desenvolvimento para Android? Siga os Desenvolvedores do Android no YouTube ou LinkedIn!

Todos os trechos de código neste post de blog seguem a seguinte declaração de direitos autorais:

Direitos Autorais 2026 Google LLC.
SPDX-License-Identifier: Apache-2.0

Fonte original

Conteúdo traduzido e adaptado pela redação do Notícias Mobile. Confira também a matéria na fonte original.

Leia a matéria completa