BT
x A sua opinião é importante! Por favor preencha a pesquisa do InfoQ sobre os seus hábitos de leitura!

Desenvolvimento Multi-Plataforma Android e iOS em C++: A lição do Dropbox

por Sergio De Simone , traduzido por David Padilha Coelho De Lucca em 18 Jul 2014 |

Recentemente, os desenvolvedores do Dropbox explicaram como suportam o iOS e Android em seus aplicativos sem a necessidade de reescrever todo o código para cada plataforma. Esta análise lista os motivos que os levaram a utilizar esta abordagem, os benefícios, e alguns lições importantes deste processo.

De acordo com o que foi descrito pelos desenvolvedores do Dropbox Stephen Poletto e Sean Beausoleil em uma palestra no Facebook Developers recentemente, apontou alguns inconvenientes em possuir diferentes repositórios para iOS e Android:

  • Desenvolvimento e manutenção tem o custo dobrado.
  • Os times escrevem e corrigem os mesmos bugs diversas vezes;
  • Os bugs são reportados para uma plataforma específica e podem não ser reportados na outra plataforma.
  • Os aplicativos podem apresentar sutis diferenças em seus comportamentos.
  • Otimização de performance é algo custoso e muito específico da plataforma.

O ponto fundamental da estratégia do Dropbox para resolver todos estes problemas é criar uma biblioteca multi-plataforma escrita em C++ para todo o código (menos o código de interface), ex: dados e lógica de rede. A interface com usuário é codificada de forma nativa para tirar o máximo de proveito do suporte da plataforma para animações, sensores de dispositivos e garantir que seja totalmente responsiva.

Os dois desenvolvedores descreveram esta abordagem como "bottom-up". Ao contrário de uma abordagem "top-down", onde seria favorecido o uso de uma linguagem mais abstrata, seja HTML5 ou JavaScript. Este tipo de abordagem, costuma falhar por não entregar o desempenho esperado, de acordo com Poletto e Beausoleil.

Por outro lado, C++ possui um bom suporte no iOS e pode ser facilmente misturado com código Objective-C. Além disso, o C++ pode ser usado em aplicativos Android através da Android Native Development Kit (NDK), embora não de forma tão fácil quanto em aplicativos iOS.

Durante a Ulkonf 2014, o desenvolvedor do MailBox Steven Kabbes explicou como os desenvolvedores do Dropbox lidaram com a complexidade de desenvolvimento da NDK através do uso do gyp, sistema de meta-build do Google que pode gerar projetos para o Xcode, arquivos para Unix e Android , e projetos Visual Studio a partir de um documento JSON. Steve também publicou um projeto no GitHub onde demonstra as técnicas multiplataforma utlizadas no Dropbox.

C++ Camada de Design

A multi-plataforma em C++ do Dropbox possui uma arquitetura simples que inclui:

  • Um banco de dados SQLite, desempenhando o papel de "fonte da verdade".
  • Um serviço de sincronização que é executado em sua própria thread e é responsável por manter a sincronia entre o servidor do Dropbox e o SQLite DB local.
  • Uma fila de operações que armazena todas as operações do usuário que não foram executadas.
  • Uma thread de operação responsável por extrair as operações do usuário da fila e executa-las no servidor do Dropbox.

A idéia básica por trás da camada multi-plataforma C++ do Dropbox é impor uma fronteira entre ele e o código nativo. Isto significa que o código em C++ e a camada de interface não compartilham nenhuma informação, e os objetos são copiados de volta e passam para uma camada de fronteira. A principal vantagem desta política é que as duas camadas podem ser consideradas independentes quando se trata de concorrência, portanto elas não precisam de nenhuma espécia de lock entre as camadas e podem lidar com a concorrência sem se relacionarem entre si.

O principal componente da camada C++ do Dropbox é um framework de consulta e persistência movido pelo SQLite que permite que os desenvolvedores do Dropbox não utilizem o Core Date do iOS. Segundo Kabbe, esta decisão não foi teve como base algum problema com o Core Data, que é leve e poderoso, mas exclusivamente pelo requisito de suportar Android, iOS, Mac, e no futuro Windows.

Este componente não tem o propósito de ser uma substituição para o Core Data, mas sim apenas oferecer capacidade de persistência e consulta, além da adição de um componente que Kabbes considerachave para garantir a capacidade de resposta da interface do usuário: um mecanismo de notificação em C++ similar com o que é oferecido pelo NSManagedObjectContextObjectsDidChangeNotification, que apenas permite trocar os deltas das mudanças. Maiores detalhes sobre este componente de persistência podem ser encontrado nas notas de Kabbes hospedadas no GitHub e em um post do Ole Begemann.

Uma decisão difícil quando se está desenhando uma camada multi-plataforma C++ é quando reimplementar do zero uma funcionalidade que o OS oferece nativamente e quando escrever um wrapper disso. Você não pode reimplementar toda a plataforma em C++, disse Poletto. Então, funcionalidades básicas como acesso a rede ou validação do certificado SSL são chamadas diretamente na plataforma a partir da camada C++. Ole Begemann ofereceu alguns outros exemplos onde reimplantar do zero não era uma opção: downloads em background através do NSURLSession, comportamentos em background do aplicativo e o acesso ao iCloud. Em outros casos, como funcionalidades oferecidas por APIs específicas da plataforma, podem ser reimplementadas; como é o caso do NSUserDefaults, que foi substituído no código do Dropbox pelo LevelDB.

Lidando com apenas uma base de código compartilhado entre as plataformas iOS e Android traz outros benefícios, de acordo com Poletto. Em primeiro lugar, traz uma maior colaboração entre os times iOS e Android, quase por definição. Os bugs são encontrados antes e corrigidos simultaneamente para as duas plataformas. As otimizações de performance também beneficiam ambas plataformas simultaneamente. Finalmente, o Dropbox poderia otimizar o processo de beta teste do Android para testar o "código iOS", com as vantagens de estarem aptos de realizar correções imediatamente sem esperar pela revisão do processo da App Store.

Olá visitante

Você precisa cadastrar-se no InfoQ Brasil ou para enviar comentários. Há muitas vantagens em se cadastrar.

Obtenha o máximo da experiência do InfoQ Brasil.

Dê sua opinião

HTML é permitido: a,b,br,blockquote,i,li,pre,u,ul,p

Receber mensagens dessa discussão
Comentários da comunidade

HTML é permitido: a,b,br,blockquote,i,li,pre,u,ul,p

Receber mensagens dessa discussão

HTML é permitido: a,b,br,blockquote,i,li,pre,u,ul,p

Receber mensagens dessa discussão

Dê sua opinião

Conteúdo educacional

Feedback geral
Bugs
Publicidade
Editorial
InfoQ Brasil e todo o seu conteúdo: todos os direitos reservados. © 2006-2014 C4Media Inc.
Política de privacidade
BT