4 Jul 2011

Código-fonte do Android no Eclipse

Depois de um longo e tenebroso inverno sem postar nada por aqui, voltei. Se você quiser, pode saltar a seção abaixo e ir direto para o "Ao que interessa".

 

Motivação (ou "Eu e meu TOC")

Estou trabalhando em um projeto que integra um aplicativo Android com o ADK para o GTUG-BH. Mas, talvez por algum transtorno obsessivo compulsivo, eu tenho uma dificuldade enorme em codificar sem ter acesso ao código fonte da plataforma ou das bibliotecas que estou usando. Toda hora, instintivamente, eu aperto F3 (ou Ctrl+Click) em cima de uma classe, só para receber a desagradável mensagem de Source not Found, no caso do Android.

Como quem já brincou de Android SDK sabe bem, a plataforma de desenvolvimento não vem com o código-fonte desde a versão 1.6, se não me engano. Isso já foi comentado muitas vezes na comunidade e tem um bug aberto desde 2008. O bug foi recusado em 2009 com uma motivação até razoável: no caso de debugar para mais de uma versão do Android, o Eclipse não permite mudar o source usado pelo debugger sem reiniciar, e, mesmo que isso não fosse um problema, o source oficial não é garantido de corresponder ao do aparelho em que você está testando, porque a fabricante pode mudar partes do SDK.

Bem, mas, para mim, o importante em ter o código-fonte é ver parâmetros do método e resolver dúvidas sobre o método sem ter que mudar a tela para o browser com a documentação. Em geral, é mais rápido e mais confiável eu olhar o código e entender como ele usa internamente um parâmetro do que ler a documentação.

Entâo saí à procura de uma solução. O jeito mais "oficial" é baixar todo o fonte para cada versão do Android que você vai usar (uns 2GB para cada versão!) e depois juntar os *.java de cada subsistema em um diretório só. Então, procurando um pouco mais, achei um cara que fez um script Python que junta só o que é necessário em cada versão. E um outro que fez um script Bash para, dada uma tag de versão, baixar o repositório oficial e usar o script Python mencionado ali atrás, gerando um diretório só com o código-fonte da versão prontinho para ser importado pelo Eclipse.

 

Ao que interessa

Se você roda Linux ou Mac, baixe este script e execute-o em uma linha de comando. Ele é bem auto-explicativo e vai pedir qual a tag (versão do Android) que você quer gerar o pacote do source. Ele mesmo mostra a URL que lista todas as tags. Escolha uma delas, copie e cole. O resto é demorado mas quase automático (algumas outras perguntas, como o diretório onde vai ser gerado e configuração do Git se for a primeira vez que você o usa).

Você vai precisar de:

  • Python
  • Curl
  • Git
  • um terminal de comandos *nix (no Ubuntu, Applications->Accessories->Terminal)
  • umas duas horas de banda larga para cada versão que você quiser o código-fonte.

 

Depois de rodar o script

Após o script acima rodar, você terá todos os .java em um diretório sources dentro do diretório que você especificou. Caso seja necessário, mova esses arquivos para o diretório da versão do Android: <androidsdkdir>/plataforms/android-<versao>/
Por exemplo, no meu caso:
mv sources /opt/android-sdk/platforms/android-10

No próximo restart o Eclipse reconhece o diretório "sources" e já lê o fonte direto de lá.

Para debugging tem um passo extra. Comece a debugar e faça Step Into em um método da plataforma. Mesmo com os sources do passo acima, você ainda assim verá a mensagem "Source not found" e um botão de "Edit source lookup path". Clique neste botão e adicione o diretório sources criado acima. Só lembre-se que, caso esteja debugando direto no aparelho, o source pode ser diferente do oficial, como explicado na introdução.
2 Jun 2010

Adapte seu site Java pro Orkut - parte 1

Na semana passada o Google anunciou a biblioteca para código cliente do Orkut. Passei alguns dias fuçando a biblioteca e fazendo um aplicativo para teste, e queria compartilhar o que aprendi.

A quem esse artigo interessa? A quem está desenvolvendo um site e deseja integrá-lo ao Orkut. Com essa biblioteca, você pode, por exemplo, ler e enviar recados (scraps), listar os amigos do usuário e baixar e enviar fotos dos álbuns. Claro que tudo é protegido e só pode ser acessado com autorização do usuário e dentro das regras de uso para desenvolvedores do Orkut. Por isso, nada de brincar de instalar vírus no perfil dos outros, ok?

A biblioteca se baseia em OAuth. Se você não sabe o que é OAuth, é melhor dar uma lida neste excelente tutorial antes. Vou partir do pressuposto que você entende o que é 3-legged authentication e como ela funciona em um container OpenSocial como o Orkut (neste link você acha um esquemático bem simples de entender).

 

Mãos à obra

Antes de começar, você vai precisar de:

  1. consumerKey e consumerSecret do Google Account para o seu website. https://www.google.com/accounts/ManageDomains  (guarde com MUITO CUIDADO com esses dados)
  2. biblioteca orkut-os-client
  3. coisas básicas que qualquer desenvolvedor Java deve ter: JDK 1.6, uma boa IDE, ant, etc.

Extraia o arquivo orkut-os-client-1.0-007f393481.tar.bz2 (ou a versão que você baixou no passo 2, se for diferente). Vá para o subdiretório java e execute
ant run-sample
 
Se tudo der "certo", você receberá a mensagem "signature_invalid", e a exceção "net.oauth.OAuthProblemException: HTTP/1.1 400 Bad Request". Edite o arquivo java/sample/oauth.properties e substitua os valores de "consumerKey" e "consumerSecret" pelos obtidos no passo 1 acima. Rode de novo o ant, e agora ele deve abrir uma janela do seu navegador pedindo autorização para acessar sua conta do Orkut. Autorize e você verá na linha de comando a lista de seus amigos sendo impressa, como por exemplo:
 
     [java] Hello, Pedro Antônio Carlos!
     [java] Friend: Paulo Ferreira
     [java] Friend: Girino
     [java] Friend: Renato Mangini
     [java] Friend: Carla
     [java] Friend: João
     [java] Friend: Paulo

 
Simples assim, né? Agora vamos ver o que aconteceu nas entrelinhas.
 
 
Entendendo o exemplo em poucas palavras

O código executado está em sample/sample-src/com/google/orkut/client/sample/SampleApp.java. Vá lá e dê uma olhadinha... A mágica está na classe Transport (sample/sample-src/com/google/orkut/client/sample/Transport.java). Em pouquíssimas palavras, ela faz o seguinte:

  • verifica se o usuário está logado (método init()). Caso não esteja, abre um browser na página de autenticação do OAuth do Google. Após a autenticação o browser é redirecionado para uma URL específica local, por isso o código do exemplo sobe com um servidor Jetty só para receber essa resposta de que a autenticação foi feita com sucesso (classe DesktopClient do exemplo);

Nesse request de resposta, o Google devolve dois códigos: accessToken e accessSecret. Observe que isso não tem nada a ver com o consumerKey e consumerSecret usado antes. Os consumerKey/Secret são do seu Website, enquanto o accessToken/Secret são do usuário que autenticou. Lembre das três pernas do 3-legged OAuth. Você pode guardar o accessToken e accessSecret no seu banco de dados, pois precisará deles para fazer qualquer request em nome desse usuário. Importante: mesmo que algum hacker roube esses dois códigos, eles só são válidos se o request for assinado com o consumerKey/Secret do seu website. Por isso é tão importante guardar o consumerKey/Secret em um lugar seguro.

  • enfileira o request (getprofile, writescrap, getphoto, etc) para ser enviado em lote
  • envia os requests enfileirados para o Orkut, devidamente assinados com o consumerKey/consumerSecret do seu website, e usando o accessToken/accessSecret do usuário
A classe Transport do exemplo obviamente não pode ser usada em uma aplicação web. Por quê?
  • Ela executa o browser diretamente (veja a classe sample/sample-src/com/centerkey/utils/BareBonesBrowserLaunch.java) . No caso de uma aplicação web, o código rodará no servidor e temos formas mais elegantes de fazer isso;
  • Ela executa um servidor Jetty só para receber o resultado do processo de autenticação. A sua aplicação web já estará rodando, então basta criar uma servlet específica para isso.
 

Próximos passos: como adaptar sua aplicação web
 
Ops, o artigo já está muito grande. Para não aumentar mais ainda, vou escrever outro post - essa semana ainda, prometo - explicando como adaptar a sua aplicação web. 
 
Enquanto isso, você pode baixar o aplicativo de testes feito pelo pessoal do Google. Não é lá muito explicativo e depende fortemente do Google App Engine, mas os mais fuçadores conseguirão fazer muita coisa a partir dele.
 

 

22 Jan 2010

Meu primeiro Posterous...

... pois então, por sugestão do Paulim resolvi criar um Posterous para mim. Ainda não sei sobre o quê vou escrever, mas provavelmente deve ser relacionado com minhas paixões geek (GWT, Android, empreendedorismo e location-based social apps) ou não-geek (bike e corrida).

Não sei nem se vou lembrar de escrever com frequência, nem se alguém vai ter paciência de ler. Na pior das hipóteses, fica como um histórico da vida geek que o pai tinha para os meus filhos, daqui a trinta anos (isso se o mundo não acabar em 2012, claro).

Renato Mangini's Space

Developer for food, entrepreneur for passion, biker and runner on the free time.
More at http://linkedin.com/in/mangini