BT

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.

Avalie esse artigo

Relevância
Estilo/Redação

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
Feedback geral
Bugs
Publicidade
Editorial
Marketing
InfoQ Brasil e todo o seu conteúdo: todos os direitos reservados. © 2006-2016 C4Media Inc.
Política de privacidade
BT

We notice you’re using an ad blocker

We understand why you use ad blockers. However to keep InfoQ free we need your support. InfoQ will not provide your data to third parties without individual opt-in consent. We only work with advertisers relevant to our readers. Please consider whitelisting us.