Por que um aplicativo Android não deveria ser escrito em C / C ++ porque você “simplesmente prefere programar em C / C ++”? [fechadas]

86

Atualizado (para maior clareza e para reduzir a ambiguidade):

Vou começar a mexer em aplicativos para Android. Eu estava planejando escrever em C ++ usando o NDK (já que tenho mais experiência em C ++ e prefiro-o a Java), mas deparei com o seguinte na página Android NDK :

você só deve usar o NDK se for essencial para seu aplicativo - nunca porque você simplesmente prefere programar em C / C ++.

Fiquei com a impressão de que você deveria usar a linguagem de sua preferência, desde que seja adequada ao trabalho. Alguém poderia explicar por que é tão aconselhável não usar C / C ++ para o desenvolvimento do Android?


Original:

Vou começar a mexer em aplicativos móveis, especificamente o Android, que é o sistema operacional do meu telefone atual, e queria saber se escrever o aplicativo em C ++ (ou pelo menos o núcleo, em seguida, embrulhar em Java) era uma opção aceitável.

Com alguma formação, sou formado em ciência da computação, tendo feito 3 cursos C ++ (introdução, intermediário, OOP e estou fazendo um curso STL na primavera) e apenas 1 curso Java (intermediário). Por causa disso, fico mais confortável com C ++ e prefiro-o a Java. Encontrei o seguinte na página Android NDK :

Usar código nativo no Android geralmente não resulta em uma melhoria perceptível de desempenho, mas sempre aumenta a complexidade do aplicativo. Em geral, você só deve usar o NDK se for essencial para o seu aplicativo - nunca porque você simplesmente prefere programar em C / C ++.

  • Tive a impressão de que você deveria usar a linguagem que melhor se adeque ao trabalho, assim como aquela que você está familiarizado
  • Posso querer portar o aplicativo para outra plataforma móvel, como iOS, que suporta C ++, mas não java
  • Embora Java seja uma linguagem de alto nível e, portanto, deva tornar o desenvolvimento mais rápido, eu sinto que o desenvolvimento seria mais lento porque eu teria que reaprender quase tudo (já que só fiz uma aula sobre a linguagem)

Qualquer conselho seria muito apreciado.

ps: muitas das respostas sobre esse assunto são de anos atrás e há muito poucas respostas de acompanhamento que mencionam que o NDK permite o desenvolvimento de aplicativos nativos completos no Android 2.3 e mais recentes.

Logan Besecker
fonte
1
"Aceitável" é uma palavra estranha - certamente possível , por meio do NDK ...
ildjarn
1
Você provavelmente está melhor se mordendo a bala e aprendendo Java. O kit de ferramentas do Android foi realmente planejado para ser usado em Java, e o tempo que você economizaria por já saber C ++ seria gasto e depois alguns tentando descobrir como fazer todas as coisas do Android funcionarem em C ++. Pense nisso como uma oportunidade de aprendizado :)
Jeremy Friesner
Pessoalmente, eu morderia a bala como Jeremy disse e simplesmente aprenderia o que você precisa com Java. Ele realmente não deve ser que negócio um grande para você aprender que é relativamente rápido.
OmniOwl
Para seu primeiro ponto, C ++ não se encaixa no trabalho (desenvolvimento para Android) quase tão bem quanto Java, independentemente da familiaridade. Em seu segundo ponto, apesar do Android ser Linux, há uma enorme diferença entre o Android e os aplicativos de desktop; os ciclos de vida são diferentes e você precisa lidar com atividades em vez de processos, o que é uma maneira completamente diferente de desenvolver em comparação com o desenvolvimento de desktop normal. Em seu terceiro ponto, aprender o Android SDK em C ++ levará muito mais tempo do que aprender em Java primeiro (depois de aprender Java) e, em seguida, mudar para C ++.
Cornstalks
1
Muitas pessoas usam o termo "C / C ++" como se houvesse uma única linguagem com esse nome. Espero que você saiba que C e C ++ são duas linguagens diferentes (embora intimamente relacionadas) - e parece ser C ++, não C, que você está perguntando.
Keith Thompson

Respostas:

107

Pense desta maneira. Você pode usar o Java SDK para construir um aplicativo funcional completo que aproveita 100% das APIs disponíveis para desenvolvedores. Não há nada que você possa fazer com o NDK que não possa ser feito com o SDK (de uma perspectiva de API), o NDK apenas fornece um desempenho superior.

Agora, olhe ao contrário. Se você optar por escrever um aplicativo 100% no NDK, ainda poderá escrever um aplicativo totalmente funcional, mas estará limitado no número de APIs de estrutura que pode acessar. Nem toda a estrutura Android pode ser acessada na camada nativa; a maioria das APIs são apenas Java. Isso não quer dizer que todas as APIs de que você pode precisar não estejam disponíveis no NDK, mas nem de longe TODAS as APIs estão expostas.

Além disso, o NDK apresenta código específico da plataforma que expande o tamanho da sua distribuição. Para cada arquitetura de dispositivo que você pretende oferecer suporte, seu código nativo deve ser integrado em arquivos .so (um para armv5, armv7 e x86) todos empacotados no mesmo APK. Essa duplicação de código executável torna seu aplicativo 3 vezes maior (ou seja, um "binário gordo"), a menos que você assuma a tarefa de criar APKs separados para cada arquitetura ao distribuir o aplicativo. Portanto, o processo de implantação torna-se um pouco mais trabalhoso se você não quiser que seu APK aumente significativamente.

Novamente, embora nada disso o proíba de fazer o que você escolher, ele mostra por que o Google descreve o Java como o método "preferido" para a maior parte do seu código e o caminho de menor resistência. Espero que esclareça por que a documentação está redigida da maneira que está.

sem fio
fonte
1
Muito obrigado! A mudança de perspectiva era a grande parte que estava faltando. Eu não sabia que faltava alguma API no NDK. Eu também não estava pensando no tamanho da distribuição; mas faz muito sentido agora que você o trouxe à mente (especificamente porque o c ++ deve incluir todas as bibliotecas padrão, enquanto as bibliotecas padrão do java já estão ativadas nos dispositivos). Você poderia explicar um pouco sobre os .soarquivos? Estou ciente de que deve haver uma compilação separada de código nativo para cada arquitetura de hardware com suporte, portanto, cada .soarquivo tem uma compilação separada.
Logan Besecker
43
A restrição do NDK é realmente uma pena. Eu adoraria escrever código de alto desempenho para plataformas móveis, principalmente por causa das considerações sobre a duração da bateria. O nativo é importante em plataformas móveis. Por que não apoiá-lo melhor? # ᴅɪꜱʟɪᴋᴇ
Konrad Rudolph
2
@LoganBesecker A cadeia de ferramentas NDK compilará seu código em um .sopara cada arquitetura que você escolheu suportar (isso é controlado por seus makefiles) e todos os arquivos serão colocados no diretório libs / de seu APK. Quando o APK for instalado, apenas o apropriado .soserá selecionado, mas todos eles ainda precisam viver no APK inicial.
Devunwired em
1
@KonradRudolph você pode escrever partes de seus aplicativos com o ndk, o Google faz isso para partes críticas de desempenho do Android. Exceto em casos muito específicos, c ++ vs java é irrelevante no desenvolvimento do Android, especialmente agora que o ART está chegando. O uso correto das APIs, principalmente aquelas que consomem bateria (GPS, rede) é onde você precisa ter cuidado.
Teovald
1
Java é mais lento. A JVM precisa ser carregada, além do byte-code ser MUITO eficiente, mas não é "nativo" e, portanto, tem uma pequena penalidade - dependendo do aplicativo, isso pode ser perceptível. Por que eles escolheram Java, especificamente porque ele é executado em um interpretador: o coletor de lixo reduz os problemas de memória e reduz os impactos entre aplicativos. Além disso, a linguagem Java (embora detalhada) remove muitos dos erros introduzidos pelo desenvolvedor em C ++.
Daniel,
25

Se você pretende desenvolver apenas um aplicativo em sua vida, use o NDK.

Se você pretende aprender o desenvolvimento do Android com a intenção de desenvolver mais de um aplicativo durante sua vida - e deseja ser capaz de dar suporte adequado a todos eles - é muito provável que se saia melhor a longo prazo se aprender Java e use o Java SDK do Android.

Isaac
fonte
Essa lógica faz muito sentido prático.
vvnraman
8

Os programadores da King usam C ++ para a lógica do jogo. E eles parecem estar indo bem a julgar pelo volume de negócios.

Na minha experiência, C ++ é para solucionadores de problemas e Java é para evitadores de problemas. Eu amo ambas as linguagens, mas C ++ é bastante recompensador quando você escreve um bom código. No entanto, pode levar alguns momentos de magia para chegar lá.

Você também pode recomendar C ++ para cientistas de dados, que normalmente fariam seu trabalho por, digamos, Python ou R. C ++ pode fazer o mesmo com desempenho tão bom ou não, mas basta ser um gênio na linguagem. É por isso que eu nunca não recomendaria o C ++ para quem quer fazê-lo - eu apenas avisaria sobre o tratamento que eles terão.

JAkerblom
fonte
1
Qualquer tempo que você gasta resolvendo problemas que são exclusivos do C ++ é tempo que você poderia ter gasto criando a funcionalidade real do seu aplicativo.
user45623
4

Achei este artigo interessante de: http://betanews.com/2014/07/22/why-c-is-the-perfect-choice-for-modern-app-development/

C ++ foi construído especificamente para independência de plataforma e, como tal, é encontrado em todos os sistemas operacionais existentes. Seu usuário móvel típico pode saber que os aplicativos Android são escritos em Java e iOS em Objective-C, mas o que muitos não sabem é que há mais código C / C ++ na memória de seus dispositivos do que qualquer outra coisa. C / C ++ conduz grande parte da tecnologia de pequenos dispositivos (como o kernel, que interage com o hardware, bem como bibliotecas de tempo de execução típicas) e as redes de telecomunicações que habilitam esses dispositivos. O mais importante para uma equipe de desenvolvimento é que existem interfaces e bibliotecas C / C ++ para tudo o que você precisa fazer em qualquer dispositivo e plataforma. O conjunto de ferramentas Android NDK é um ótimo exemplo de suporte C / C ++ completo que foi adicionado originalmente para equipes de desenvolvimento de jogos para permitir que eles obtenham o melhor desempenho possível do dispositivo evitando Java e o Android Java runtime Dalvik, a máquina virtual na qual O código Java Android é executado em. Ele tem sido melhorado regularmente para habilitar todos os serviços do Android.

Moussa D.
fonte
3

Eu diria que use java para o aplicativo principal. Mas se você tiver algum código c ++ que você precisa portar ou alguma biblioteca que seja implementada de forma eficiente em c ++, use ndk para esses bits

Dan
fonte
4
Por que ele deveria usar Java então?
Vladislav Rastrusny
3

Não vejo nenhuma razão para não usar C ++ para o desenvolvimento normal do Android. Se você tem vasta experiência em trabalhar em C ++ e com sistemas operacionais complexos como o Windows ou qualquer outro, então você pode entender o Android rapidamente e não é tão complicado quanto o outros sistemas operacionais são. enquanto aprende java ou trabalhando sem aprender, seria mais frustrante e complexo!

stng
fonte
3

A consideração mais importante é que o código Java compilado será executado em todos os dispositivos Android inalterados, enquanto o código nativo precisará ser compilado para todas as plataformas de destino.

A intenção geral para Java e Android é que você escreva a maioria, senão todo o seu aplicativo em Java, e use coisas nativas apenas quando não houver outra opção ... então, tudo sobre como escrever o aplicativo se prestará a fazê-lo em Java.

Você vai se poupar de muitos aborrecimentos ao fazer a ponte entre os mundos nativo e Java escrevendo em Java.

Além disso, você fará um grande favor a si mesmo se mergulhar e aprender Java. Não apenas seu aplicativo Android será o melhor para isso, mas você se exporá a uma abordagem significativamente diferente para OO e será um programador melhor para isso.

Adicione a isso o fato de que você evitará uma série de riscos de segurança escrevendo em Java.

Em minha mente, isso é um acéfalo - use Java.

Lawrence Dol
fonte
2
"... e usar coisas nativas apenas quando não houver outra opção". Quando não pode haver outra opção? Tudo no Android pode ser alcançado via Java!
CinCout