Como instalar o Google Antigravity IDE no Ubuntu usando o arquivo tar.gz

Dica Rápida

Dica Rápida

O Google Antigravity IDE possui uma versão oficial para Linux em formato .tar.gz, mas ainda não conta com um instalador .deb específico para Ubuntu e Linux Mint. Por isso, depois de baixar o pacote, pode ser necessário configurar manualmente o programa, o atalho no menu e as permissões do chrome-sandbox.

Para facilitar esse processo, preparei um pequeno gerenciador em Bash. Ele permite:

  • instalar o Antigravity em /opt/antigravity;
  • criar o atalho no menu de aplicativos;
  • tentar extrair e instalar o ícone do programa;
  • corrigir as permissões do chrome-sandbox;
  • atualizar o programa usando um novo arquivo .tar.gz;
  • desinstalar o Antigravity, com opção de apagar também configurações e cache.

Importante: baixe o arquivo somente na página oficial do Google Antigravity, na seção Antigravity IDE. O procedimento abaixo é voltado ao pacote oficial para Linux em formato .tar.gz, não ao aplicativo independente Antigravity 2.0.

Criando o script

Crie um arquivo chamado antigravity-manager.sh:

nano antigravity-manager.sh

Cole o conteúdo abaixo:

#!/usr/bin/env bash
#
# antigravity-manager.sh — instala, atualiza ou remove o Google Antigravity
# em qualquer distro Linux/x86_64 baseada em FHS + freedesktop (Ubuntu, Mint, etc).
#
# Uso:
#   ./antigravity-manager.sh install  /caminho/para/Antigravity.tar.gz
#   ./antigravity-manager.sh update   /caminho/para/Antigravity.tar.gz
#   ./antigravity-manager.sh uninstall
#   ./antigravity-manager.sh uninstall --purge   # remove também config/cache do usuário
#
set -euo pipefail

INSTALL_DIR="/opt/antigravity"
DESKTOP_FILE="$HOME/.local/share/applications/antigravity.desktop"
ICON_DIR="$HOME/.local/share/icons/hicolor/512x512/apps"
ICON_FILE="$ICON_DIR/antigravity.png"
TMP_ICON="/tmp/antigravity-icon.png"
DETECTED_BINARY_NAME="antigravity"

log()  { printf '\033[1;34m[antigravity]\033[0m %s\n' "$1" >&2; }
err()  { printf '\033[1;31m[erro]\033[0m %s\n' "$1" >&2; }
die()  { err "$1"; exit 1; }

load_nvm_if_present() {
    # Scripts rodados como './script.sh' são shells NÃO-interativos e não
    # carregam ~/.bashrc, então o nvm (que só é adicionado lá) fica de fora
    # do PATH mesmo que funcione normalmente no seu terminal.
    if ! command -v npx >/dev/null 2>&1; then
        export NVM_DIR="${NVM_DIR:-$HOME/.nvm}"
        if [[ -s "$NVM_DIR/nvm.sh" ]]; then
            # shellcheck disable=SC1091
            source "$NVM_DIR/nvm.sh" >/dev/null 2>&1 || true
        fi
    fi
}

check_deps() {
    command -v tar >/dev/null 2>&1 || die "tar não encontrado."

    load_nvm_if_present

    if ! command -v npx >/dev/null 2>&1; then
        err "npx não encontrado no PATH (mesmo tentando carregar nvm de \$HOME/.nvm)."
        err "A instalação vai continuar SEM ícone customizado. Rode 'nvm use' e"
        err "reexecute o script depois, se quiser corrigir o ícone."
        return 1
    fi
    return 0
}

extract_tarball() {
    local tarball="$1"
    [[ -f "$tarball" ]] || die "Arquivo não encontrado: $tarball"

    local workdir
    workdir="$(mktemp -d)"
    log "Extraindo $tarball em $workdir ..."
    tar -xzf "$tarball" -C "$workdir"

    # Procura por um binário cujo nome comece com "antigravity" (qualquer caixa),
    # já que o app desktop usa 'antigravity' mas a IDE pode vir como
    # 'Antigravity-IDE', 'antigravity-ide', etc.
    local candidates
    candidates="$(find "$workdir" -maxdepth 3 -type f -iname 'antigravity*' \
                    ! -iname '*.so' ! -iname '*.json' ! -iname '*.png' \
                    ! -iname '*.pak' ! -iname '*.dll' ! -iname '*.dat' \
                    ! -iname '*.bin' ! -iname '*.desktop')"

    if [[ -z "$candidates" ]]; then
        err "Estrutura extraída (para depuração):"
        find "$workdir" -maxdepth 3 >&2
        die "Não encontrei nenhum binário começando com 'antigravity' dentro do tarball."
    fi

    local count
    count="$(echo "$candidates" | wc -l)"

    local chosen
    if [[ "$count" -eq 1 ]]; then
        chosen="$candidates"
    else
        # Múltiplos candidatos (ex: 'bin/antigravity-ide' vs 'antigravity-ide'
        # na raiz). O que importa é achar a raiz REAL do app Electron, que é
        # a pasta que também contém 'chrome-sandbox' ao lado do binário.
        # Entre os que atendem isso, prefere o de caminho mais curto (mais
        # próximo da raiz do tarball).
        chosen="$(echo "$candidates" | while read -r f; do
                      d="$(dirname "$f")"
                      if [[ -e "$d/chrome-sandbox" ]]; then
                          # imprime profundidade + caminho para ordenar por rasos primeiro
                          depth="$(echo "$f" | tr -cd '/' | wc -c)"
                          echo "$depth $f"
                      fi
                  done | sort -n | head -n1 | cut -d' ' -f2-)"

        if [[ -z "$chosen" ]]; then
            err "Nenhum candidato tem chrome-sandbox ao lado; usando o primeiro da lista."
            chosen="$(echo "$candidates" | head -n1)"
        fi
        err "Vários candidatos encontrados, usando: $chosen"
        err "Candidatos completos:"
        echo "$candidates" >&2
    fi

    chmod +x "$chosen" 2>/dev/null || true
    printf '%s|%s\n' "$(dirname "$chosen")" "$(basename "$chosen")"
}

fix_sandbox() {
    log "Ajustando permissões do chrome-sandbox..."
    sudo chown root:root "$INSTALL_DIR/chrome-sandbox"
    sudo chmod 4755      "$INSTALL_DIR/chrome-sandbox"

    local perms
    perms="$(stat -c '%a' "$INSTALL_DIR/chrome-sandbox")"
    [[ "$perms" == "4755" ]] || die "Falha ao aplicar permissões setuid no chrome-sandbox."
    log "chrome-sandbox OK (4755, root:root)."
}

extract_icon() {
    if ! command -v npx >/dev/null 2>&1; then
        err "npx indisponível — pulando extração de ícone."
        return 1
    fi

    log "Extraindo ícone do app.asar..."
    rm -f "$TMP_ICON"
    npx --yes asar extract-file "$INSTALL_DIR/resources/app.asar" icon.png 2>/dev/null || true

    if [[ -f "./icon.png" ]]; then
        mv "./icon.png" "$TMP_ICON"
    fi

    if [[ ! -f "$TMP_ICON" ]]; then
        err "Não consegui extrair /icon.png do app.asar. O app funcionará, mas sem ícone customizado."
        return 1
    fi
    return 0
}

install_icon() {
    mkdir -p "$ICON_DIR"
    if [[ -f "$TMP_ICON" ]]; then
        mv "$TMP_ICON" "$ICON_FILE"
        log "Ícone instalado em $ICON_FILE"
    fi
}

write_desktop_entry() {
    mkdir -p "$(dirname "$DESKTOP_FILE")"
    cat > "$DESKTOP_FILE" <<EOF
[Desktop Entry]
Name=Antigravity
Comment=Google Antigravity IDE
Exec=$INSTALL_DIR/$DETECTED_BINARY_NAME %U
Terminal=false
Type=Application
Icon=antigravity
Categories=Development;IDE;
StartupNotify=true
StartupWMClass=Antigravity
MimeType=x-scheme-handler/antigravity;
EOF
    chmod +x "$DESKTOP_FILE"
    log "Entrada de menu criada em $DESKTOP_FILE"
}

refresh_desktop_db() {
    update-desktop-database "$HOME/.local/share/applications" 2>/dev/null || true
    gtk-update-icon-cache -t "$HOME/.local/share/icons/hicolor" 2>/dev/null || true

    if command -v desktop-file-validate >/dev/null 2>&1; then
        if desktop-file-validate "$DESKTOP_FILE"; then
            log "Arquivo .desktop validado com sucesso."
        else
            err "desktop-file-validate encontrou problemas no .desktop (veja acima)."
        fi
    fi
}

do_install_or_update() {
    local tarball="$1"
    local mode="$2"  # "install" ou "update"

    check_deps || true

    local extracted_result extracted_dir
    extracted_result="$(extract_tarball "$tarball")"
    extracted_dir="${extracted_result%%|*}"
    DETECTED_BINARY_NAME="${extracted_result##*|}"

    if [[ "$mode" == "update" ]]; then
        log "Removendo instalação anterior em $INSTALL_DIR ..."
        sudo rm -rf "$INSTALL_DIR"
    elif [[ -d "$INSTALL_DIR" ]]; then
        die "$INSTALL_DIR já existe. Use 'update' para substituir a instalação atual."
    fi

    log "Movendo para $INSTALL_DIR (requer sudo)..."
    sudo mv "$extracted_dir" "$INSTALL_DIR"

    fix_sandbox

    if extract_icon; then
        install_icon
    fi

    write_desktop_entry
    refresh_desktop_db

    log "Instalação concluída. Procure por 'Antigravity' no menu de aplicativos."
    log "Se não aparecer de imediato, saia e entre na sessão novamente, ou rode: gtk-launch antigravity.desktop"
}

do_uninstall() {
    local purge="${1:-}"

    log "Removendo $INSTALL_DIR (requer sudo)..."
    sudo rm -rf "$INSTALL_DIR"

    rm -f "$DESKTOP_FILE" "$ICON_FILE"
    refresh_desktop_db

    if [[ "$purge" == "--purge" ]]; then
        log "Removendo config/cache do usuário (--purge)..."
        rm -rf "$HOME/.config/Antigravity" \
               "$HOME/.cache/Antigravity" \
               "$HOME/.config/antigravity-updater"
    fi

    log "Desinstalação concluída."
}

usage() {
    cat <<EOF
Uso:
  $0 install  <caminho-para-Antigravity.tar.gz>
  $0 update   <caminho-para-Antigravity.tar.gz>
  $0 uninstall [--purge]

  install    - primeira instalação (falha se já existir)
  update     - substitui a instalação existente pelo tarball novo
  uninstall  - remove app, ícone e .desktop; use --purge para também
               apagar config/cache do usuário
EOF
}

main() {
    local cmd="${1:-}"
    case "$cmd" in
        install)
            [[ $# -eq 2 ]] || { usage; exit 1; }
            do_install_or_update "$2" "install"
            ;;
        update)
            [[ $# -eq 2 ]] || { usage; exit 1; }
            do_install_or_update "$2" "update"
            ;;
        uninstall)
            do_uninstall "${2:-}"
            ;;
        *)
            usage
            exit 1
            ;;
    esac
}

main "$@"

Salve o arquivo e dê permissão de execução:

chmod +x antigravity-manager.sh

Instalando o Antigravity

Considerando que o pacote esteja na pasta Downloads, execute:

./antigravity-manager.sh install "$HOME/Downloads/Antigravity.tar.gz"

Troque Antigravity.tar.gz pelo nome exato do arquivo baixado. O terminal solicitará sua senha porque a aplicação será instalada dentro de /opt.

Ao terminar, procure por Antigravity no menu de aplicativos.

Atualizando

Baixe a versão mais recente do .tar.gz e rode:

./antigravity-manager.sh update "$HOME/Downloads/Antigravity.tar.gz"

O script substituirá a instalação anterior e manterá as configurações do usuário.

Desinstalando

Para remover apenas o programa, o ícone e o atalho:

./antigravity-manager.sh uninstall

Para remover também as configurações e o cache do usuário:

./antigravity-manager.sh uninstall --purge

Use --purge com cuidado, pois essa opção apaga as preferências locais do Antigravity.

Observação sobre o ícone

O npx é usado somente para tentar extrair o ícone de dentro do arquivo app.asar. Caso o Node.js ou o npx não estejam instalados, o Antigravity continuará funcionando, mas poderá aparecer no menu sem o ícone personalizado.

Essa é uma solução prática para instalar e administrar manualmente a versão compactada do Antigravity IDE enquanto não existe um pacote .deb específico para Ubuntu e distribuições derivadas.

Referências:download oficial e versões anteriores.


Este conteúdo foi útil?

Deixe sua avaliação, compartilhe ou envie uma sugestão.

Enviar sugestão
Sem anúncios, só conteúdo. Apoie o site com um Pix a partir de R$ 1,00 e ajude a mantê-lo no ar! ✨

Deixe um Comentário