Upgrade to Pro — share decks privately, control downloads, hide ads and more …

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!

Ubiratan Soares

September 24, 2014
Tweet

More Decks by Ubiratan Soares

Other Decks in Programming

Transcript

  1. 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
  2. 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
  3. 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
  4. // 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; } } }
  5. // 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 } ! ! ! ! ! ! ! !
  6. 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; } } !
  7. 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!
  8. 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++
  9. 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
  10. // 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
  11. 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
  12. 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
  13. 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
  14. 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)
  15. 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 !