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
PRO

September 24, 2014
Tweet

More Decks by Ubiratan Soares

Other Decks in Programming

Transcript

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

    View Slide

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

    View Slide

  3. AGENDA
    Motivação
    Integração com Gradle
    NDK e Segurança
    Usos Avançados
    Conclusão

    View Slide

  4. MOTIVAÇÃO

    View Slide

  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

    View Slide

  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

    View Slide

  7. INTEGRAÇÃO
    COM GRADLE

    View Slide

  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

    View Slide

  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;
    }
    }
    }

    View Slide

  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
    }
    !
    !
    !
    !
    !
    !
    !
    !

    View Slide

  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;
    }
    }
    !

    View Slide

  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!

    View Slide

  13. NDK E
    SEGURANÇA

    View Slide

  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++

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  19. USOS
    AVANÇADOS

    View Slide

  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

    View Slide

  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");

    View Slide

  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)

    View Slide

  23. CONCLUSÕES

    View Slide

  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 !

    View Slide

  25. CONTATOS
    [email protected]
    @ubiratanfsoares
    google.com/+UbiratanSoares
    ubiratansoares.github.io

    View Slide

  26. OBRIGADO

    View Slide