Slide 72 de 74

Empacotando um app

Um programa que também é um app
type Msg {
	Tapped
}

func view(count: Int): ui.View {
	return ui.column([ui.pad(24), ui.gap(12), ui.align(ui.Align.Center())], [
		ui.text([ui.size(ui.TextSize.Title())], "Tocado {count} vezes"),
		ui.button([ui.on(Msg.Tapped()), ui.tone(ui.Tone.Good())], "Toque"),
	])
}

proc update(count: mut Int, msg: Msg): Msg {
	if msg is Msg.Tapped {
		count += 1
	}
	return msg
}

proc main(): void {
	spawn(ui.window("Toques", view, update), 0)
}
Rode aqui, instale lá
$ hive run taps.hive          # uma janela nesta máquina
$ hive export taps.hive --target android/arm64
Packaged taps.hive -> taps-android-arm64.apk (4s)

$ adb install taps-android-arm64.apk
Success
As quatro formas de dizer não
$ hive export taps.hive
hive: `hive export` needs a target, and the one it knows is `--target android/arm64`.

$ hive export taps.hive --target android/amd64
hive: `--target android/amd64` needs a C cross-compiler, which is the one thing a machine with the Go toolchain on it cannot be assumed to have. `android/arm64` is the only Android target Go links on its own, and it is what a handset is.

$ hive export taps.hive --target linux/arm64
hive: `hive export` knows one format, and it is Android's. It takes `--target android/arm64`; `linux/arm64` has no app to be packaged into.

$ hive export server.hive --target android/arm64
server.hive:1: `server.hive` opens no window, so there is nothing for an app to show and no way to start it. `hive build` is what compiles a program that serves or prints.

hive build escreve um programa. hive export escreve um app: hive export taps.hive --target android/arm64 produz taps-android-arm64.apk, instalável do jeito que sai.

A janela não precisa de nada novo. Uma hive.ui.window já serve a própria página em loopback com todos os recursos embutidos, então o que a mostra num aparelho é a WebView que a plataforma já tem. O programa nunca fica sabendo que está num telefone: ele serve a mesma árvore que serviria a um navegador, e a mesma view responde aos dois.

  • android/arm64, e nenhum outro target do Android. É o único que o Go linka sem um compilador C cruzado, então os outros três são recusados pelo nome — e é o que um aparelho é.
  • Um programa sem janela é recusado em vez de empacotado: um app que não mostra nada não tem como ser iniciado. hive build é o que compila um programa que serve ou imprime.
  • Nada além do Go o escreve. O arquivo carrega o programa, um hospedeiro WebView fixo, um manifesto binário, e assets/icon.png como ícone do lançador quando o programa traz um. O manifesto, a tabela de recursos, o arquivo compactado e a assinatura são trabalho do próprio build: nenhum SDK do Android, e nenhuma rede.
  • O id da aplicação vem do nome do ponto de entrada: taps.hive é hive.taps. Dois apps cujos pontos de entrada são ambos main.hive são um app só para o telefone, e o segundo instala por cima do primeiro — dê ao ponto de entrada o nome do app.

A assinatura é o APK Signature Scheme v2, sob uma chave criada no primeiro uso em ~/.hive/android.key. Uma chave estável por máquina, então um build posterior instala sobre um anterior em vez de ser recusado como um app diferente.