Todos os produtos
Search
Central de documentação

Mobile Platform as a Service:Projetos Portal e Bundle

Última atualização: Jun 28, 2026

O framework baseado em componentes do mPaaS utiliza OSGi para dividir um aplicativo Android em projetos Bundle independentes e um único projeto Portal, que os unifica em um APK executável.

Importante
  • Caso utilize a baseline 10.2.3 ou superior, adote o método AAR nativo.

  • O tipo de conexão baseada em componentes (Portal & Bundle) exige o Android Studio Flamingo (2022.2.1) ou uma versão anterior.

Esse framework emprega a tecnologia OSGi para separar o aplicativo em um ou mais projetos Bundle, independentes do ponto de vista de negócios, e um projeto Portal. O mPaaS gerencia o ciclo de vida e as dependências de cada Bundle, enquanto o Portal consolida todos os pacotes Bundle em um pacote .apk executável.

Essa arquitetura é ideal para o desenvolvimento de aplicativos em equipe, pois oferece inicialização e instrumentação de componentes que facilitam a integração com o mPaaS.

Projetos Bundle

Um projeto nativo tradicional possui um módulo principal e submódulos opcionais. Já um projeto Bundle do mPaaS geralmente contém um módulo principal chamado app e diversos submódulos.

No Alipay, por exemplo, um Bundle é composto por um módulo principal denominado app e três submódulos:

  • API: Contém apenas definições de interfaces.

  • biz: Armazena as implementações das interfaces.

  • ui: Inclui activities, visualizações personalizadas e outros componentes relacionados à interface do usuário.

Nota

Todo Bundle deve ter pelo menos um submódulo chamado API. Sem ele, o Bundle não gera um pacote de interface, impedindo que outros Bundles estabeleçam dependência sobre ele.

Os projetos Bundle abrangem os seguintes tópicos:

Diferenças entre projetos Bundle e tradicionais

Um Bundle é, essencialmente, um projeto nativo. A principal distinção reside na adição do Apply plugin do mPaaS aos arquivos build.gradle do projeto, do módulo principal e dos submódulos:

  • Arquivo build.gradle no diretório raiz do projeto

  • Arquivo build.gradle do módulo principal

  • Arquivo build.gradle de um submódulo

build.gradle no diretório raiz do projeto

Adicione a dependência do plugin do mPaaS no arquivo build.gradle da raiz:

Nota

A versão do plugin pode ser atualizada em novas iterações.

classpath 'com.alipay.android:android-gradle-plugin:3.0.0.9.13'

image.png

build.gradle do módulo principal

Declare o Apply plugin do mPaaS Bundle no arquivo build.gradle do módulo principal para identificar o projeto como um Bundle:

apply plugin: 'com.alipay.bundle'

O arquivo build.gradle do módulo principal também requer a seguinte configuração:image

Parâmetros:

  • version: Versão do Bundle.

  • group: ID do grupo do Bundle.

  • exportPackages: Nomes dos pacotes que contêm todas as classes deste Bundle. É possível especificar um nome de pacote pai. Para Bundles sem vinculação estática, exportPackages é obrigatório; caso contrário, as classes podem falhar ao carregar. Por exemplo, se todo o código estiver sob com.alipay.demo e com.alipay.bundle, especifique com.alipay em exportPackages, ou liste tanto com.alipay.demo quanto com.alipay.bundle. Evite nomes de pacotes excessivamente genéricos ou específicos demais.

  • initLevel: Prioridade de carregamento do Bundle na inicialização. Intervalo: 0–100 (valores menores indicam maior prioridade). O valor 11110000 ativa o carregamento tardio (sob demanda).

  • packageId: ID de recurso para empacotamento via aapt. Deve ser exclusivo para cada Bundle em uma arquitetura multi-Bundle. Os packageIds utilizados pelo mPaaS são:

Bundle

packageId

com.alipay.android.phone.thirdparty:androidsupportrecyclerview-build

28

com.alipay.android.phone.mobilesdk:framework-build

30

com.alipay.android.phone.rome:pushservice-build

35

com.alipay.android.phone.sync:syncservice-build

38

com.alipay.android.phone.wallet:nebulabiz-build

41

com.alipay.android.phone.mobilecommon:share-build

42

com.alipay.android.phone.wallet:nebulacore-build

66

com.alipay.android.mpaas:scan-build

72

com.alipay.android.phone.wallet:nebula-build

76

com.alipay.android.phone.securitycommon:aliupgrade-build

77

As seguintes dependências do mPaaS são adicionadas em dependencies:

dependencies {
    compile project(":api")
    apt 'com.alipay.android.tools:androidannotations:2.7.1@jar'
    //mPaaS dependencies
    provided 'com.alipay.android.phone.thirdparty:fastjson-api:1.1.73@jar'
    provided 'com.alipay.android.phone.thirdparty:androidsupport-api:13.23@jar'
}

build.gradle de um submódulo

Declare o Apply plugin do mPaaS no arquivo build.gradle do submódulo para marcá-lo como tal. Essa ação gera o pacote de interface do Bundle.

apply plugin: 'com.alipay.library'

Dependências do mPaaS em dependencies:

dependencies {
    apt 'com.alipay.android.tools:androidannotations:2.7.1@jar'
    //mPaaS dependencies
    provided "com.alipay.android.phone.thirdparty:utdid-api:1.0.3@jar"
    provided "com.alipay.android.phone.mobilesdk:framework-api:2.1.1@jar"
}

Propriedades do Bundle

Neste framework, as propriedades do Bundle baseiam-se nos Bundles OSGi, porém de forma simplificada.

A tabela a seguir lista essas propriedades.

Propriedade

Descrição

Bundle-Name

Derivada do group no build.gradle e do name no settings.gradle.

Bundle-Version

Obtida do version no build.gradle.

Init-Level

Definida pelo init.level no build.gradle.

Package-Id

Extraída das propriedades no build.gradle.

Contains-Dex

Indica se o Bundle contém um arquivo DEX. O plugin de compilação determina isso automaticamente.

Contains-Res

Sinaliza a presença de recursos no Bundle. Determinado automaticamente pelo plugin de compilação.

Native-Library

Refere-se aos arquivos .so presentes no Bundle. Identificado automaticamente pelo plugin de compilação.

Component-Name

Originada dos elementos Activity, Service, BroadcastReceiver e ContentProvider definidos no AndroidManifest.xml.

exportPackages

Nomes dos pacotes que englobam todas as classes deste Bundle. Configurado no arquivo build.gradle do módulo principal.

Pacotes de interface do Bundle

Um Bundle pode conter múltiplos submódulos (biz, API, ui). Durante a compilação, cada submódulo produz um pacote de interface no formato .jar. Outros Bundles podem consumir o pacote de interface API.

A compilação também gera um pacote de projeto do Bundle que agrega todos os submódulos. O Portal utiliza esse pacote de projeto para construir o .apk final.

  • O pacote de interface de um submódulo do Bundle inclui exclusivamente classes de interface Java ou Kotlin, sem outros recursos (como o conteúdo do diretório res). Apenas submódulos denominados API geram esses pacotes de interface.

  • A dependência entre Bundles ocorre por meio de pacotes de interface. Configure essa relação na seção dependency do arquivo build.gradle do Bundle. Por exemplo, se o Bundle A depender do submódulo bapi do Bundle B, adicione a dependência bapi na seção dependency do arquivo build.gradle do submódulo correspondente:

    provided "com.alipay.android.phone:bundleB:1.0.1:bapi@jar"
  • O formato groupId:artifactid:version:classifier na dependência corresponde ao grupo, nome, versão e nome do submódulo declarados no Bundle.

  • Por padrão, o nome do Bundle equivale ao nome da pasta do módulo principal. Para alterá-lo, edite o settings.gradle. Neste exemplo, app representa o nome do projeto do módulo principal:

    include ':api', ':xxxx-build'
    project(':xxxx-build').projectDir = new File('app')

Pacotes de projeto do Bundle

  • O pacote .jar proveniente de todo o projeto Bundle consiste, na verdade, em um arquivo no formato .apk renomeado com a extensão .jar (por exemplo, framework-build.jar).

  • Para referenciar um Bundle dentro de um Portal, declare a dependência na seção dependency do arquivo build.gradle do módulo principal do Portal:

    dependencies {
        bundle "com.alipay.android.phone.mobilesdk:framework-build:version@jar"
        manifest "com.alipay.android.phone.mobilesdk:framework-build:version:AndroidManifest@xml"
    }
  • Os pacotes Bundle existem nas variantes debug e release. Para depender de um pacote debug, anexe :raw à dependência.

    • Quando o Portal depende do pacote debug do Bundle: bundle "com.alipay.android.phone.mobilesdk:framework-build:version:raw@jar"

    • Quando o Portal depende do pacote release do Bundle: bundle "com.alipay.android.phone.mobilesdk:framework-build:version@jar"

Nota
  • Ao empacotar um Portal, defina:

    • Quais Bundles integrarão o DEX principal. Bundles com vinculação estática que contenham um ContentProvider devem ser obrigatoriamente incluídos.

    • Quais Bundles terão carregamento dinâmico. Em aplicativos pequenos, recomenda-se empacotar todos os Bundles no DEX principal.

  • Para incluir o código de um Bundle no DEX principal, adicione-o ao arquivo slinks do Portal usando o formato groupId-artifactId. Se o artifactId terminar com -build, remova esse sufixo. Por exemplo, para o groupId com.mpaas.group e artifactId testBundle-build, insira com.mpaas.group-testBundle no arquivo slinks.

  • A vinculação estática insere o código do Bundle nos arquivos APK, como classes.dex, classes1.dex, classes2.dex e demais arquivos DEX, permitindo que as classes sejam carregadas durante a inicialização.

Projetos Portal

Um projeto Portal consolida todos os pacotes Bundle em um único arquivo .apk executável.

Diferenças entre projetos Portal e tradicionais

O Portal distingue-se de um projeto tradicional pelas configurações no arquivo build.gradle:

  • build.gradle no diretório raiz do projeto

  • build.gradle no diretório do módulo principal

build.gradle no diretório raiz do projeto

O plugin com.alipay.android:android-gradle-plugin:2.1.3.2.7 é adicionado ao classpath:

Nota

A versão do plugin pode sofrer alterações em novas iterações.

image.png

Esse plugin incorpora o plugin do Portal, responsável por mesclar os Bundles durante o empacotamento.

  • Consolidação do bundle .jar

  • Mesclagem do AndroidManifest do bundle

build.gradle no diretório do módulo principal

Declare o Apply Portal plugin do mPaaS para classificar o projeto como um Portal:

apply plugin: 'com.alipay.portal'

Inclua as dependências do Bundle no bloco dependencies. As instruções em dependencies declaram os bundles e manifests dos quais o Portal depende:

image

Importante
  • Em geral, não se escreve código diretamente em um Portal.

  • Certos recursos do Bundle devem residir obrigatoriamente no Portal. Caso contrário, não serão encontrados durante a compilação ou execução:

    • Recursos referenciados no AndroidManifest.xml.

    • Recursos transmitidos ao NotificationManager.

    • Recursos acessados pelo método getResources().getIdentifier().

    • Se um pacote AAR de terceiros contiver algum desses tipos de recurso, descompacte o AAR e copie os recursos para o Portal.

Dependências do projeto

Um aplicativo baseado em mPaaS compreende um Portal e um ou mais Bundles. Cada aplicativo admite apenas um Portal, mas suporta múltiplos Bundles.

O plugin do mPaaS unifica todos os pacotes Bundle no Portal para gerar um .apk executável. Após a mesclagem, o plugin publica o Bundle em um repositório. O endereço desse repositório é definido no build.gradle do módulo principal do Bundle:

uploadArchives {
    repositories {
        mavenLocal()
    }
}

Por padrão, essa configuração envia os artefatos para o repositório local ~/.m2. Você pode adicionar um endereço de repositório personalizado:

mavenDeployer {
    mavenLocal()
    repository(url: "${repository_url}") {
        authentication(userName: 'userName', password: 'userName_pwd')
    }
    snapshotRepository(url: "${repository_url}") {
        authentication(userName: 'userName', password: 'userName_pwd')
    }
}

Após o upload, o Bundle fica disponível no formato groupid:artifactid:version:classifier@type. Declare as dependências na seção dependency do arquivo build.gradle do módulo principal do Portal:

dependencies {
    bundle 'com.alipay.android.phone.mobilesdk:quinox-build:2.2.1.161221190158:nolog@jar'
    manifest 'com.alipay.android.phone.mobilesdk:quinox-build:2.2.1.161221190158:AndroidManifest@xml'
}

Para estabelecer dependências entre Bundles, declare o endereço do repositório no build.gradle raiz do Bundle dependente.

Importante

O username e a password mencionados abaixo não correspondem às suas credenciais de login no console. Para obter esses valores, participe do grupo DingTalk 145930007362.

  • mavenLocal(): Repositório local para dependências.

  • maven{}: Repositório remoto para dependências.

allprojects {
    repositories {
        mavenLocal()
        mavenCentral()
        maven {
            credentials {
                username "{username}"
                password "{password}"
            }
            url "http://mvn.cloud.alipay.com/nexus/content/repositories/releases/"
        }
    }
}

Resultados da compilação e empacotamento do Bundle

A compilação e o empacotamento de um Bundle com o plugin do mPaaS geram um pacote de projeto (.jar). Para mais detalhes, consulte Pacotes de projeto do Bundle e Pacotes de interface do Bundle.

O pacote de projeto é publicado no repositório no formato groupid:artifactid:version:classifier@type. O endereço do repositório é configurado no build.gradle do módulo principal do Bundle:

uploadArchives {
    repositories {
        mavenLocal()
    }
}

Isso utiliza o repositório Maven local (mavenLocal, padrão: ~/.m2). Para alterar o endereço ou adicionar outro repositório, veja Configurar um repositório de publicação.

Adicionar dependências do Bundle

É possível adicionar uma dependência de Bundle a partir de um Portal ou de outro Bundle:

  1. Declare o repositório de dependências no build.gradle raiz do Portal ou do Bundle. O repositório de dependências deve corresponder ao repositório de publicação do Bundle. Consulte Configurar um repositório de dependências.

  2. Declare as dependencies no build.gradle do módulo principal. O exemplo abaixo adiciona uma dependência ao Bundle quinox:

dependencies {
    bundle 'com.alipay.android.phone.mobilesdk:quinox-build:2.2.1.161221190158:nolog@jar'
    manifest 'com.alipay.android.phone.mobilesdk:quinox-build:2.2.1.161221190158:AndroidManifest@xml'
}

Tópicos relacionados