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.
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.
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.gradleno diretório raiz do projetoArquivo
build.gradledo módulo principalArquivo
build.gradlede 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:
A versão do plugin pode ser atualizada em novas iterações.
classpath 'com.alipay.android:android-gradle-plugin:3.0.0.9.13'

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:
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 sobcom.alipay.demoecom.alipay.bundle, especifiquecom.alipayemexportPackages, ou liste tantocom.alipay.demoquantocom.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 valor11110000ativa 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 |
|
Bundle-Version |
Obtida do |
|
Init-Level |
Definida pelo |
|
Package-Id |
Extraída das propriedades no |
|
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 |
|
Component-Name |
Originada dos elementos |
|
exportPackages |
Nomes dos pacotes que englobam todas as classes deste Bundle. Configurado no arquivo |
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
dependencydo arquivobuild.gradledo Bundle. Por exemplo, se o Bundle A depender do submódulobapido Bundle B, adicione a dependênciabapina seçãodependencydo arquivobuild.gradledo submódulo correspondente:provided "com.alipay.android.phone:bundleB:1.0.1:bapi@jar" O formato
groupId:artifactid:version:classifierna 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
.jarproveniente de todo o projeto Bundle consiste, na verdade, em um arquivo no formato.apkrenomeado 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
dependencydo arquivobuild.gradledo 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"
-
Ao empacotar um Portal, defina:
Quais Bundles integrarão o DEX principal. Bundles com vinculação estática que contenham um
ContentProviderdevem 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
slinksdo Portal usando o formatogroupId-artifactId. Se o artifactId terminar com-build, remova esse sufixo. Por exemplo, para o groupIdcom.mpaas.groupe artifactIdtestBundle-build, insiracom.mpaas.group-testBundleno arquivoslinks.A vinculação estática insere o código do Bundle nos arquivos
APK, comoclasses.dex,classes1.dex,classes2.dexe 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.gradleno diretório raiz do projetobuild.gradleno 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:
A versão do plugin pode sofrer alterações em novas iterações.

Esse plugin incorpora o plugin do Portal, responsável por mesclar os Bundles durante o empacotamento.
Consolidação do bundle
.jarMesclagem do
AndroidManifestdo 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:

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
AARde terceiros contiver algum desses tipos de recurso, descompacte oAARe 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.
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:
Declare o repositório de dependências no
build.gradleraiz 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.Declare as
dependenciesnobuild.gradledo módulo principal. O exemplo abaixo adiciona uma dependência ao Bundlequinox:
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'
}