Pro Yearly is on sale from $80 to $50! »

Android e NDK - Para além da performance

Android e NDK - Para além da performance

Slides de apoio para as minhas apresentações no Intercon Android e Intel Innovation Week, na qual apresento uma visão geral da integração do NDK com Gradle e usos avançados associados!

D4b7a3e2ed10f86e0b52498713ba2601?s=128

Ubiratan Soares

September 24, 2014
Tweet

Transcript

  1. ANDROID E NDK PARA ALÉM DA PERFORMANCE Setembro de 2014

  2. SOBRE MIM Computeiro by ICMC/USP Engenheiro de Software Instrutor Intel

    Software Innovator Palestrante Etc
  3. AGENDA Motivação Integração com Gradle NDK e Segurança Usos Avançados

    Conclusão
  4. MOTIVAÇÃO

  5. VISÃO GERAL NDK é um toolchain que permite que parte

    da sua aplicação seja construída em C/C++ Funcionalidades acessíveis para a aplicação através do padrão JNI (Java Native Interface) Binários pré-compilados (shared objects) são carregados em tempo de execução e chamados a partir no nível Java
  6. NDK E CASOS TÍPICOS Utilizar código já construído, estabilizado e

    bem testado Tudo que precise mastigar números ! Engines de jogos … NDK, a princípio, não deve ser a saída para resolver ANRs
  7. INTEGRAÇÃO COM GRADLE

  8. GRADLE E NDK Já foi infinitamente mais chata … Hoje

    é mais fácil (oficialmente suportada) Formato AAR suporta arquivos .so empacotados Integração via productFlavors e/ou APK splits
  9. // Adapted from http://tools.android.com/tech-docs/new-build-system/tips ! productFlavors { ! x86 {

    ndk { abiFilter "x86" versionCode = 3; } } ! arm { ndk { abiFilter "armeabi-v7a" versionCode = 2; } } ! fat { ndk { versionCode = 0; } } }
  10. // Adapted from http://tools.android.com/tech-docs/new-build-system/tips ! ! ! ! ! //

    make per-variant version code applicationVariants.all { variant -> def abiVersion = variant.productFlavors.get(1).versionCode ! // set the composite code variant.mergedFlavor.versionCode = abiVersion * 100000 + defaultConfig.versionCode } ! ! ! ! ! ! ! !
  11. flavorGroups "fremium", "abi" ! productFlavors { ! free { flavorGroup

    "fremium" // … } ! paid { flavorGroup "fremium" // … } ! x86 { ndk { flavorGroup "abi" abiFilter "x86" versionCode = 3; } } ! arm { ndk { flavorGroup "abi" abiFilter “armeabi-v7a" versionCode = 2; } } !
  12. NDK E ANDROID STUDIO Suporte ainda manco … #FATO Funcionalidades

    da IDE ainda não plenamente integradas (auto-complete, refactor, etc) CLion é indicativo de que o suporte a C/C++ está chegando!
  13. NDK E SEGURANÇA

  14. CAMADA DE SEGURANÇA Existem várias opções nas quais o NDK

    é aplicado como camada de segurança Simplesmente mover keys e tokens para o nível do NDK já representa um ganho … Diversas opções robustas herdadas do mundo C/C++
  15. SQLITE-CIPHER Implementação transparente para criptografia dos dados armazenados via SQLite

    (AES-256) Integração fácil via binários pré-compilados Chave de criptografia é parâmetro nas principais operações da API https://github.com/sqlcipher/android-database-sqlcipher
  16. // Example from https://www.zetetic.net/sqlcipher/design ! ~ $ sqlite3 sqlcipher.db sqlite>

    PRAGMA KEY='test123'; sqlite> CREATE TABLE t1(a,b); sqlite> INSERT INTO t1(a,b) VALUES ('one for the money', 'two for the show'); sqlite> .quit ! ~ $ hexdump -C sqlcipher.db 00000000 84 d1 36 18 eb b5 82 90 c4 70 0d ee 43 cb 61 87 |.?6.?..?p.?C?a.| 00000010 91 42 3c cd 55 24 ab c6 c4 1d c6 67 b4 e3 96 bb |.B?..?| 00000bf0 8e 99 ee 28 23 43 ab a4 97 cd 63 42 8a 8e 7c c6 |..?(#C??.?cB..|?| ! ~ $ sqlite3 sqlcipher.db sqlite> SELECT * FROM t1; Error: file is encrypted or is not a database
  17. NACL Biblioteca para criptografia, criada por Daniel J. Bernstein Alternativa

    mais moderna - e performática - aos tradicionais BouncyCastle e SpongyCastle Existem bindings prontos via JNI/NDK https://github.com/joshjdevl/kalium-jni
  18. O-LLVM Obfuscador no nível do assembly nativo Opção para ocultar

    strings é um BIG WIN! Configuração “difícil", mas pelo seu custo ser ZERO, é uma boa alternativa para ferramentas como DexGuard https://github.com/obfuscator-llvm/obfuscator
  19. USOS AVANÇADOS

  20. NOSQL COM SNAPPYDB Armazenamento de dados tipo chave-valor SharedPreferences, versão

    turbo ! Suporta objetos serializáveis e POJOs Extremamente performático ! Artefato disponível via MavenCentral https://github.com/nhachicha/SnappyDB
  21. DB snappydb = DBFactory.open(context); snappydb.put("name", “Ubiratan Soares"); . . .

    String name = snappydb.get("name");
  22. CASOS DE FRONTEIRA Opção - não aconselhável! - para contornar

    o dex-limit (64k) Extrapolar o uso máximo de memória para além do limite da VM Construir e carregar o seu próprio runtime Acessar funcionalidades do hardware que não estão expostas diretamente API do Android Portabilidade de código (sim, é possível e razoável)
  23. CONCLUSÕES

  24. FINALIZANDO Brincar com NDK é legal :) Integração com Gradle

    já é decente e tende ser aperfeiçoada Suporte decente a C/C++ no Android Studio é questão de tempo (opinião pessoal) É uma boa opção para resolver problemas avançados, que você ainda não sabe que estão pela frente !
  25. CONTATOS ubiratan.f.soares@gmail.com @ubiratanfsoares google.com/+UbiratanSoares ubiratansoares.github.io

  26. OBRIGADO