APDE GSoC ’18: Modo Android 4.0 Integrações

Quando você executa um esboço com o alvo do rosto do relógio, o esboço constrói e é enviado para o relógio. Então o aplicativo APDE wear companion carrega automaticamente o sketch e lança o seletor de faces do relógio:

VR sketches são instalados exatamente como os aplicativos normais. Eles suportam a plataforma VR do Google, que inclui fones de ouvido em papelão e Daydream:

Se você quiser colocar suas mãos nestas novas funcionalidades, por favor, junte-se ao APDE Preview Channel e siga as instruções no topo para se juntar à lista de testers.

As de escrita, v0.5.0-pre2 está disponível e inclui wallpapers e VR, mas não rostos de relógio.

Como tudo isto funciona?

A chave para suportar estes novos alvos foi a actualização para usar o Modo Android 4.0 do Desktop Processing, que adicionou suporte para wallpapers, rostos de relógio, e VR. Meu trabalho estava apenas portando essas novas funcionalidades legais para o APDE, o que em si não foi uma tarefa fácil.

Eu decidi cedo que quero que cada esboço seja executável para cada alvo. Eu quero que os usuários sejam capazes de pegar qualquer esboço ou exemplo e transplantá-lo de um ambiente para qualquer outro, seja ele aplicativo, papel de parede, rosto de relógio ou VR. Desta forma, há a máxima flexibilidade e capacidade para explorar todo o potencial do Processamento de esboços. A única exceção a esta regra é que os esboços em VR devem ser 3D (esboços 2D simplesmente não funcionam devido à natureza do VR).

Esta abordagem difere da do modo Android. Por exemplo, na área de trabalho, o VR é empacotado como uma biblioteca, então apenas os esboços que importam explicitamente a biblioteca VR podem ser executados para o alvo VR. No APDE, cada esboço 3D pode ser executado para o VR e as importações corretas são adicionadas automaticamente.

O sistema de compilação agora usa um conjunto de modelos para acompanhar todos os arquivos de compilação como as atividades, manifestos, e layouts. Este método é muito preferível ao código rígido que era feito antes. Os templates são tirados quase literalmente do modo Android, mas há algumas mudanças, como o suporte para fones de ouvido VR Daydream.

Papéis de parede em tempo real e esboços VR são instalados exatamente como os esboços de aplicativos normais, mas VR requer as bibliotecas VR do Google. Da mesma forma, os rostos dos relógios requerem a biblioteca de suporte wearable, mas não instalam da mesma forma porque devem ser instalados em um relógio.

Watch Face Woes

I needed to install the sketch onto the watch.

The first thing I tried was pushing the sketch to the watch and installing it there. Acontece que carregar um APK lateralmente em um relógio Wear OS (anteriormente Android Wear) não é tão fácil como pode parecer. Em um telefone Android, você só precisa habilitar a instalação a partir de fontes desconhecidas nas configurações e está tudo pronto. No entanto, quando está em uso, esta instalação é bloqueada pelo sistema e não há como contorná-la sem enraizar o telefone ou o relógio ou ligar o relógio a um computador. Nenhuma destas são opções para um ambiente de desenvolvimento móvel de nível básico.

Next, tentei empacotar o aplicativo como um aplicativo Wear 1.x e instalá-lo no telefone. Antes do Android Wear 2.0, todos os aplicativos Wear eram distribuídos sendo empacotados em aplicativos para telefone, mesmo que esse aplicativo para telefone fosse apenas um shell vazio. Tudo isso mudou no 2.0 quando os aplicativos de uso se tornaram autônomos. A esperança era que eu pudesse aproveitar o sistema antigo para instalar o aplicativo de relógio através do telefone, mas isso foi em vão. Eu ainda não sei se o antigo método de instalação é ou não suportado em relógios mais novos, mas não consegui obter uma prova de conceito para funcionar.

Finalmente eu recorri a um método de última hora: carga de classe, que é uma espécie de magia negra. A idéia é que ao invés de instalar o sketch como uma aplicação independente, eu posso carregar a classe sketch em uma aplicação que já está rodando no relógio, removendo a necessidade de instalar o sketch cada vez que ele é executado. Este é um modelo fundamentalmente diferente de como o APDE funciona atualmente. O APDE constrói um sketch e é um aplicativo autônomo que é instalado. A tela do aplicativo acumula um monte de esboços à medida que o usuário os executa e eles ficam por aí quando o APDE é desinstalado. O relógio é diferente. Agora os esboços não são instalados, eles são apenas carregados. Há apenas um esboço disponível como um rosto de relógio, e ele desaparece quando o APDE é desinstalado.

Acontece que esta abordagem funciona. O usuário instala uma aplicação bridge em seu relógio da Play Store (ainda não disponível) chamada “APDE Wear Companion”. Quando o APDE constrói um sketch, ele o envia para o companheiro de uso. O companheiro de uso desempacota o esboço e solicita que o usuário selecione um mostrador de relógio embutido no companheiro de uso. Em seguida, esse mostrador carrega o esboço e o exibe. Isto é surpreendentemente perfeito.

Existiram alguns desafios.

Quando o esboço cai, ele está rodando no companheiro de uso, então todo o aplicativo do companheiro de uso também cai. Atualmente estou tentando conter os danos, mas às vezes o companheiro de desgaste quebra e precisa ser reiniciado porque o sketch travou muitas vezes. APDE também não consegue ver os vestígios da pilha de rostos de relógios que se desmancham no momento porque o processo morre antes que o vestígio da pilha possa ser enviado para fora. (Imprimir declarações funciona.)

Não há apenas um rosto de relógio; na verdade há dois. O processamento tem duas classes base para rostos de relógios: uma para o renderizador padrão (JAVA2D) e outra para renderizadores baseados em OpenGL (P2D e P3D). Assim, existem dois rostos de relógios, um para cada renderizador. Quando o companheiro de uso desempacota um esboço, ele verifica para ver qual renderizador ele está usando. Em seguida, o mostrador do relógio correspondente é tornado visível e o outro é escondido. Este é outro tipo de magia negra porque o usuário nem deve notar, mas parece funcionar bastante bem.

Eu acabei de mentir. Na verdade, existem quatro rostos de relógios. Acontece que quando você carrega um novo rosto de relógio, se o novo é o mesmo que o antigo (e todos os esboços usam os mesmos dois rostos de relógio), então o sistema “curto-circuita” (que é o termo técnico para isso) e não recarrega o rosto do relógio. Isto é bom e elegante para rostos de relógios normais, mas o mostrador do relógio APDE precisa ser recarregado para obter o novo esboço. A solução é suja, mas eficaz: basta ter dois rostos de relógio para cada renderizador (quatro no total) e alternar entre eles ao carregar novos esboços para que o mostrador do relógio seja forçado a recarregar.

Apesar de todas estas dificuldades, tenho o prazer de dizer que os rostos do relógio parecem estar a funcionar bastante bem, pelo menos nos dois conjuntos de dispositivos em que os testei. Os outros alvos mais fáceis de usar – wallpapers e VR – foram significativamente mais fáceis de implementar.

Looking Forward

A próxima grande funcionalidade planeada para este Verão é um modo de “pré-visualização”. Atualmente, os esboços do APDE precisam ser instalados toda vez que eles são executados. Este arranjo não é ideal porque o instalador duplica o tempo entre pressionar “run” e ver o sketch em alguns telefones. Além disso, como descrito acima, todos os esboços podem desorganizar a tela dos aplicativos. Não ter que instalar os esboços é provavelmente o recurso mais solicitado pelo APDE.

Eu originalmente tinha duas soluções propostas para este problema. Primeiro, usar Processing.js para converter o esboço para JavaScript e executá-lo em um WebView. Segundo, aproveite o Instant Apps para executar um sketch sem instalá-lo. Ambas as soluções ainda são imperfeitas. O Processing.js está desatualizado e não suporta nenhuma API nativa do Android, como o acelerômetro. Aplicativos Instantâneos é uma idéia instável na melhor das hipóteses porque eu nem sei se será possível falsificar o depurador para hospedar os esboços localmente e executá-los, ou se isso seria mais rápido do que apenas instalá-los.

Felizmente, quebrar a porca do rosto do relógio me deu uma nova abordagem. O APDE não precisa converter um esboço para JavaScript ou construir uma aplicação instantânea. Ele só precisa pegar o esboço existente e carregá-lo em vez de instalá-lo.

Com esta abordagem, o APDE só precisa construir os recursos com AAPT, compilar as classes com ECJ, e dexar as classes. No meu telefone, todo este processo leva menos de dois segundos (embora muitos telefones sejam consideravelmente mais lentos), o que é uma enorme melhoria em relação a ter que compilar o APK e instalá-lo.

Looking ainda mais à frente, eu planejo implementar a compilação incremental neste verão, ou seja, ter o compilador rodando em segundo plano para exibir os erros em tempo real. Com este sistema instalado, o sketch provavelmente será compilado mesmo antes do usuário apertar o botão run, o que significa que tudo o que resta é dexing. Em outras palavras, os carregadores de classes podem, provavelmente, reduzir o processo de compilação para menos de um segundo, dependendo do hardware do telefone, é claro.

Ainda há muita emoção por vir neste verão!

Fin

Se você quiser explorar as mudanças que eu fiz com mais detalhes, confira a ramificação android-mode-4 no GitHub. Eu deixei mensagens de commit detalhadas (na maioria das vezes) e todo o código está lá.

Fique ligado para o modo de pré-visualização!