Da clonagem do repositório à compilação

Criando um fork do Telegram para Android
Foto: NeONBRAND/Unsplash

O Telegram, um dos serviços de mensagens instantâneas mais populares da atualidade, se destaca pela abertura do código-fonte, de suas APIs e pela existência de uma biblioteca oficial para a construção de clientes alternativos, características que atraem os usuários com conhecimento avançado e o tornam um dos comunicadores mais developer-friendly disponíveis no mercado.

É fato que ele possui defeitos. Condenações ao uso de criptografia ponta-a-ponta somente em secret chats, questionamentos em relação à segurança do MTProto e a não divulgação do código-fonte dos servidores são algumas das polêmicas que ele enfrentou ao longo de sua existência. Umas das críticas mais relevantes é a do renomado especialista em segurança The Grugq, que, em seu texto “Operational Telegram”, de novembro de 2015, conclui:

O Telegram é suscetível a erros, utiliza criptografia questionável, vaza um grande volume de informações, rouba os contatos do dispositivo, e agora é conhecido como ponto de encontro para terroristas.

Mas apesar das controvérsias, o Telegram permanece popular e, por isso, é um interessante objeto de estudo. Então, decidi recentemente iniciar um fork para aprender com o código-fonte dos clientes oficiais.

Iniciando

Antes de decidir qual aplicação do Telegram usaria como base para o desenvolvimento, a minha única preferência era pelas versões mobile. Mesmo assim, tive algumas frustrações devido à inconsistência na manutenção e na divulgação do código-fonte dos clientes.

Em janeiro de 2018, o Telegram anunciou um novo cliente oficial para Android e iOS, o Telegram X, que seria mantido paralelamente à alternativa clássica nas lojas de aplicativos das respectivas plataformas. Meses depois, em setembro, anunciou-se a substituição da versão clássica pela X no iOS — muito embora, no momento da publicação deste texto, o app chamado Telegram X permaneça disponível na App Store ao lado do Telegram Messenger.

Há pouco tempo atrás, o código-fonte referenciado no site oficial estava bastante defasado. Hoje, ele aponta para um novo repositório no GitHub, aparentemente contendo uma versão mais atual — que pode ser baseado no Telegram X. Já o código-fonte do Telegram X para Android aparentemente nunca foi publicado.

No caso do Telegram clássico para Android, a situação é menos confusa, com o código-fonte encontrado no GitHub aparentando equivaler ao aplicativo na Play Store. Enfim, optei por utilizá-lo para o desenvolvimento do fork.

Configuração do ambiente

As instruções a seguir descrevem a configuração de um ambiente baseado no Fedora 29 para compilação do Telegram para Android conforme presente em seu repositório do GitHub durante a elaboração deste texto (no momento em que escrevo, o commit mais recente é o e222fde, de 7 de novembro de 2018).

Embora baseadas no Fedora, as instruções podem ser interpretadas sem grandes dificuldades para aplicação em outras distribuições Linux ou mesmo em sistemas operacionais completamente distintos.

Como a intenção desta seção é orientar sobre a compilação do aplicativo em sua forma original, evitando alterações ao projeto publicado, precisei basear-me em versões antigas de algumas ferramentas requeridas. São elas:

  • Android NDK (atual: r18b; utilizada: r16b);
  • Gradle (atual: 4.6; utilizada: 4.4);
  • Plugin Android Gradle (atual: 3.2.1; utilizada: 3.1.4)

Os problemas encontrados em relação às versões mais recentes de cada um dos itens listados estão descritos na próxima seção deste texto.

  1. Instalação do Android Studio
    Basta efetuar o download e prosseguir com a instalação de acordo com as instruções oficiais, que se resumem a extrair o arquivo .zip para o local desejado e executar o script studio.sh na pasta android-studio/bin.

  2. Instalação do Android NDK r16b
    O NDK (Native Development Kit) é um conjunto de ferramentas para implementação de partes de um aplicativo Android em código nativo, por meio de linguagens como C e C++. É necessário para compilar bibliotecas incluídas no projeto do Telegram.

  3. Clonagem do repositório do Telegram para Android
    Exemplo para linha de comando: git clone --recurse-submodules [https://github.com/DrKLO/Telegram.git](https://github.com/DrKLO/Telegram.git) . Destaque para o parâmetro --recurse-submodules, necessário para que o download do código da biblioteca libgtvoip, incluída no repositório como submódulo, seja também realizado no processo.

  4. Configuração do Android Studio
    Após abrir o projeto do Telegram para Android, é preciso configurar o caminho para o Android NDK através da janela Project Structure, que pode ser acessada por meio do menu File.

  5. Modificação do BuildVars.java
    É necessário gerar e adicionar ao arquivo as suas próprias chaves de API para o Telegram e HockeyApp, conforme avisado no README do repositório. Também é interessante observar as outras variáveis presentes e modificá-las conforme desejado.

  6. Adição do google-services.json
    O google-services.json é um arquivo de configuração necessário para habilitar o uso de APIs da Google utilizadas pelo Telegram. O processo de geração e adição do arquivo a um projeto do Android Studio é descrito na página de suporte da Google.

  7. Gerar chave para assinatura
    Por fim, é necessário gerar chaves para assinar o aplicativo. Uma maneira de fazê-lo de dentro do próprio Android Studio é através da opção Build > Generate Signed Bundle / APK… > APK (selecionar) > Next > Create new…. Alternativamente, a ferramenta keytool do Java pode ser usada. A keystore deve ser salva no diretório TMessagesProj/config com o nome release.keystore, e o alias da chave gerada, bem como a senha da keystore e a senha da chave, devem ser adicionadas nas propriedades do projeto (arquivo gradle.properties).

Problemas com versões recentes das ferramentas utilizadas

No momento em que escrevo, existem duas versões estáveis mais recentes do Android NDK disponíveis: a r17c e a r18b.

O projeto do Telegram para Android tem como requerimento mínimo a API nível 16, associada ao Android 4.1 Jelly Bean. No entanto, bibliotecas usadas por ele utilizam a função posix_memalign, que, a partir do NDK r17c, passou a estar disponível somente para os níveis de API superiores à 17, do Android 4.2 Jelly Bean MR1.

A justificativa para a mudança, de acordo com este issue no repositório do NDK no GitHub, é que a posix_memalign não havia sido implementada em alguns dispositivos com o Android 4.1 Jelly Bean.

Por sua vez, o NDK r18b abandonou o suporte ao compilador GCC e agora força o uso do Clang, que não compila as bibliotecas do projeto.

É possível utilizar o NDK r17c alterando o requerimento mínimo do projeto para a API nível 17. O uso do NDK r18, no entanto, exigiria maiores alterações. Há um pull request aberto, não avaliado nem testado por mim, que promete aplicar as mudanças apropriadas.

Em relação ao Gradle, a versão 4.6 provoca conflito com a opção depreciada android.enableD8, que desativa o D8 e está presente no arquivo gradle.properties, e o desugaring, uma etapa extra de otimização do bytecode que tornou-se padrão. Ocorrem problemas também com o valor da buildToolsVersion declarado no arquivo build.gradle do TMessagesProj.

Possíveis soluções são desativar o desugaring adicionando android.enableD8.desugaring=false ao build.gradle e elevar o valor da buildToolsVersion de 28.0.2 para 28.0.3.

No mais, cabe mencionar que o plugin Android Gradle não pode ser atualizado para a versão 3.1.4 sem que o Gradle seja também atualizado para a 4.6.

Conclusão

Uma vez que o aplicativo tenha sido corretamente compilado, começa-se a pensar na aplicação das modificações desejadas. Particularmente, penso que atualizar o projeto para funcionar com versões mais recentes do Android NDK e do Gradle seriam excelentes primeiros passos.

Telegram com AlertDialog adicionado à IntroActivity

Por fim, destaco o Telegram FOSS. Trata-se de um fork não oficial do Telegram para Android cuja principal promessa é substituir ou remover elementos “não-FOSS, pouco confiáveis ou suspeitos” do mensageiro. Dentre as modificações efetuadas, estão a troca do Google Cloud Messaging pelo serviço de push do Telegram e a remoção do HockeyApp.

Não somente esta versão pode ser um melhor ponto de partida para a criação de um fork do Telegram — a depender, é claro, de suas preferências e objetivos — , o trabalho já realizado pelos seus desenvolvedores podem servir de auxílio mesmo para quem preferir basear-se na versão oficial.