Utilisation du NDK : Lecture & Gestion
des PDF sous Android
Juin 2014Julien Sanchez
Julien Sanchez
Développeur Android
@JuSchz
+JulienSanchez9
Objectif :
Pdf et Android SDK
Pdf et Android SDK
1/ Laisser la main à l’OS
File file = new File("/sdcard/files/mypdf.pdf");
Intent intent = new Intent()...
Pdf et QuickOffice
2/ Quickoffice + webview
String myUrl = "https://drive.google.com/viewer?url=" + myPdfFile;
mWebview = ...
Rendu Quickoffice
Si > 20 Mo
Pdf et Android SDK
3/ Faire son propre rendu
> Bibliothèque Java : qoppa, IText, PdfJet, PSPDFkit
> Bibliothèque JNI : muP...
Know your audience
http://www.funnysigns.net/files/illiterate-write-for-help.jpg
NDK : Native Developement Kit
Qu’est ce que le NDK ?
https://developer.android.com/tools/sdk/ndk/
NDK : Usage
JNIEXPORT jint JNICALL com_myndklib_myNdkFunction
(JNIEnv * env, jobject pThis, jstring jParam) {
return 2+2;
...
NDK : Avantages / Contraintes
Avantages
- Performances++
- Plus de mémoire (heap) disponible
- Cross-plaform
- Sécurité
- ...
SDK : Taille mémoire
Heap Sizes :
- Galaxy S3 : 256Mo
- Galaxy Tab : 64 Mb
- HTC Wildfire : 16 Mo
/system/build.prop
NDK dans le SDK
ex: Allocation de Bitmap
=> bibliothèques systèmes dans /system/lib
// File : android.graphics.Bitmap.java...
Apps utilisant le NDK
(AndEngine)(libvorbis)
(libopencv)
Plus sur le NDK ?
-> Session du Paris AUG, Mars 2013
par Sylvain Ratabouil
http://youtu.be/K4TgkzpEEvM
Rendu PDF
Utilisation de la bibliothèque MuPDF
Rendu PDF : MuPDF
- Developpé par Artifex Software depuis 2006
- Gratuit et open source
- Licence GNU GPL v3
https/code.go...
MuPDF : Etape 1
Récupération des sources & third-party :
$ git clone git://git.ghostscript.com/mupdf.git
$ cd mupdf/
$ git...
MuPDF : Etape 2
Compilation de la bibliothèque :
-> mupdf/platform/android/libs/armeabi-v7a/libmupdf.so
$ cd platform/andr...
Question
ou
MuPDF : Etape 3
Eclipse : intégration bibliothèque/projet externe
Android Studio (gradle > 0.7.2) :
/src/main/jniLibs /arm...
MuPDF : Etape 4
Appel bibliothèque coté SDK :
Intent intent = new Intent(activity, MuPDFActivity.class);
Uri data_decoded ...
MuPdf : Etape 5 (finale)
Génération de l’executable :
$ ./gradlew assemble
MuPdf
Taille .apk : 14 Mo
http://www.quickmeme.com/Surprised-Koala/page/2/
Architecture CPU
Architectures : armv7, armeabi-v7a, mips, intel x86
> 1 exécutable par architecture
File : mupdf/platform...
MuPdf : Options de compilation
Fonts CJK (China/Japan/Korea) :
// File : mupdf/platform/source/pdf/pdf-fontfile.c:17
#ifde...
MuPdf : Options de compilation(2)
// File : mupdf/platform/android/jni/Core.mk:7
LOCAL_CFLAGS := -DNOCJK
ifeq ($(TARGET_AR...
MuPdf
Apk final : 2,2 Mo
http://www.quickmeme.com/meme/3rzk86
MuPdf : immersive mode
// File : MuPDFActivity:485
if (android.os.Build.VERSION.SDK_INT >= 11){
mDocView.setSystemUiVisibi...
Résultat
Sécurité des PDF
Comment sécuriser l’accès aux
documents ?
Sécurité : Approche #0
Accès fichiers sous Android
Fichiers distants (via web) = stockage :
Inclus dans executable (ex: res/raw) :
$ adb pull /da...
Sécurité : Chiffrage coté Java
Génération de la clé :
String seed = “myseed”;
KeyGenerator kgen = KeyGenerator.getInstance...
Sécurité : Chiffrage coté Java
Génération du vecteur d’initialisation (iv) :
byte[] iv = new byte[16];
SecureRandom random...
Sécurité : Chiffrage coté Java
Chiffrage / Dechiffrage :
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
IvPar...
Plus de sécurité
- Fichier PDF avec mot de passe :
- Chiffrage coté JNI
- SSL (+ vérification certificats)
MuPDFCore.authe...
Utilisation du NDK : Lecture & gestion des PDF (@TAUG, Juin 2014)
Prochain SlideShare
Chargement dans…5
×

Utilisation du NDK : Lecture & gestion des PDF (@TAUG, Juin 2014)

595 vues

Publié le

Le SDK Android ne possède pas d'api permettant le rendu de PDF. Cette presentation vous montrera comment traiter cette problématique, via l'utilisation du Native Developement Kit (NDK), la compilation et l'intégration de bibliothèques natives, puis comment protéger ses fichiers et éviter que ceux-ci ne soient accessibles trop facilement.

Publié dans : Technologie
0 commentaire
0 j’aime
Statistiques
Remarques
  • Soyez le premier à commenter

  • Soyez le premier à aimer ceci

Aucun téléchargement
Vues
Nombre de vues
595
Sur SlideShare
0
Issues des intégrations
0
Intégrations
3
Actions
Partages
0
Téléchargements
5
Commentaires
0
J’aime
0
Intégrations 0
Aucune incorporation

Aucune remarque pour cette diapositive

Utilisation du NDK : Lecture & gestion des PDF (@TAUG, Juin 2014)

  1. 1. Utilisation du NDK : Lecture & Gestion des PDF sous Android Juin 2014Julien Sanchez
  2. 2. Julien Sanchez Développeur Android @JuSchz +JulienSanchez9
  3. 3. Objectif :
  4. 4. Pdf et Android SDK
  5. 5. Pdf et Android SDK 1/ Laisser la main à l’OS File file = new File("/sdcard/files/mypdf.pdf"); Intent intent = new Intent(); intent.setAction(Intent.ACTION_VIEW); Uri uri = Uri.fromFile(file); intent.setDataAndType(uri, "application/pdf");
  6. 6. Pdf et QuickOffice 2/ Quickoffice + webview String myUrl = "https://drive.google.com/viewer?url=" + myPdfFile; mWebview = (WebView) findViewById(R.id.webview); mWebview.getSettings().setJavaScriptEnabled(true); mWebview.loadUrl(myUrl);
  7. 7. Rendu Quickoffice Si > 20 Mo
  8. 8. Pdf et Android SDK 3/ Faire son propre rendu > Bibliothèque Java : qoppa, IText, PdfJet, PSPDFkit > Bibliothèque JNI : muPdf, Android Pdf Viewer (APV)
  9. 9. Know your audience http://www.funnysigns.net/files/illiterate-write-for-help.jpg
  10. 10. NDK : Native Developement Kit Qu’est ce que le NDK ? https://developer.android.com/tools/sdk/ndk/
  11. 11. NDK : Usage JNIEXPORT jint JNICALL com_myndklib_myNdkFunction (JNIEnv * env, jobject pThis, jstring jParam) { return 2+2; } public class myClass { static { System.loadLibrary("myndklib"); } private native int myNdkFunction(String param); // => 4 }
  12. 12. NDK : Avantages / Contraintes Avantages - Performances++ - Plus de mémoire (heap) disponible - Cross-plaform - Sécurité - Utilisation de bibliothèque C Contraintes - Langage : C/C++ - Peu d’API : Interfaces-- - Dépendant de l’architecture CPU - Pas d’outil d’obfuscation
  13. 13. SDK : Taille mémoire Heap Sizes : - Galaxy S3 : 256Mo - Galaxy Tab : 64 Mb - HTC Wildfire : 16 Mo /system/build.prop
  14. 14. NDK dans le SDK ex: Allocation de Bitmap => bibliothèques systèmes dans /system/lib // File : android.graphics.Bitmap.java:1566 private static native Bitmap nativeCreate(int[] colors, int offset, int stride, int width, int height, int nativeConfig, boolean mutable); private static native void nativeDestructor(int nativeBitmap); private static native boolean nativeRecycle(int nativeBitmap);
  15. 15. Apps utilisant le NDK (AndEngine)(libvorbis) (libopencv)
  16. 16. Plus sur le NDK ? -> Session du Paris AUG, Mars 2013 par Sylvain Ratabouil http://youtu.be/K4TgkzpEEvM
  17. 17. Rendu PDF Utilisation de la bibliothèque MuPDF
  18. 18. Rendu PDF : MuPDF - Developpé par Artifex Software depuis 2006 - Gratuit et open source - Licence GNU GPL v3 https/code.google.com/p/mupdf/
  19. 19. MuPDF : Etape 1 Récupération des sources & third-party : $ git clone git://git.ghostscript.com/mupdf.git $ cd mupdf/ $ git submodule update --init $ make generate
  20. 20. MuPDF : Etape 2 Compilation de la bibliothèque : -> mupdf/platform/android/libs/armeabi-v7a/libmupdf.so $ cd platform/android/ $ NDK_PATH/ndk-build [armeabi-v7a] Install : libmupdf.so => libs/armeabi-v7a/libmupdf.so
  21. 21. Question ou
  22. 22. MuPDF : Etape 3 Eclipse : intégration bibliothèque/projet externe Android Studio (gradle > 0.7.2) : /src/main/jniLibs /armeabi/myndklib.so /armeabi-v7a/myndklib.so /x86/myndklib.so Changer le répertoire par défaut (build.gradle) : sourceSets.main { jniLibs.srcDir 'src/main/myNDKlibs'}
  23. 23. MuPDF : Etape 4 Appel bibliothèque coté SDK : Intent intent = new Intent(activity, MuPDFActivity.class); Uri data_decoded = Uri.parse(myUrl); // ex: sdcard; internal storage; ressources intent.setAction(Intent.ACTION_VIEW); intent.setData(data_decoded); activity.startActivity(intent);
  24. 24. MuPdf : Etape 5 (finale) Génération de l’executable : $ ./gradlew assemble
  25. 25. MuPdf Taille .apk : 14 Mo http://www.quickmeme.com/Surprised-Koala/page/2/
  26. 26. Architecture CPU Architectures : armv7, armeabi-v7a, mips, intel x86 > 1 exécutable par architecture File : mupdf/platform/android/jni/Application.mk APP_ABI := all #APP_ABI := armeabi armeabi-v7a x86 mips
  27. 27. MuPdf : Options de compilation Fonts CJK (China/Japan/Korea) : // File : mupdf/platform/source/pdf/pdf-fontfile.c:17 #ifdef NOCJK #define NOCJKFONT #endif … #ifndef NOCJKFONT #ifndef NOCJKFULL #include "gen_font_cjk_full.h"
  28. 28. MuPdf : Options de compilation(2) // File : mupdf/platform/android/jni/Core.mk:7 LOCAL_CFLAGS := -DNOCJK ifeq ($(TARGET_ARCH),arm) LOCAL_CFLAGS += -DARCH_ARM -DARCH_THUMB - DARCH_ARM_CAN_LOAD_UNALIGNED ifdef NDK_PROFILER Ajout d’un flag ‘NOCJK’ :
  29. 29. MuPdf Apk final : 2,2 Mo http://www.quickmeme.com/meme/3rzk86
  30. 30. MuPdf : immersive mode // File : MuPDFActivity:485 if (android.os.Build.VERSION.SDK_INT >= 11){ mDocView.setSystemUiVisibility( View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION // hide nav bar | View.SYSTEM_UI_FLAG_FULLSCREEN // hide status bar | View.SYSTEM_UI_FLAG_IMMERSIVE); // kitkat } layout.addView(mDocView);
  31. 31. Résultat
  32. 32. Sécurité des PDF Comment sécuriser l’accès aux documents ?
  33. 33. Sécurité : Approche #0
  34. 34. Accès fichiers sous Android Fichiers distants (via web) = stockage : Inclus dans executable (ex: res/raw) : $ adb pull /data/com.package/files/myfile.pdf ./ // ou sdcard $ adb pull /data/app/com.package.apk ./ $ tar -xvf com.package.apk
  35. 35. Sécurité : Chiffrage coté Java Génération de la clé : String seed = “myseed”; KeyGenerator kgen = KeyGenerator.getInstance("AES"); SecureRandom sr = SecureRandom.getInstance("SHA1PRNG"); sr.setSeed(seed.getBytes(); kgen.init(128, sr); SecretKeySpec sKey = new SecretKeySpec(kgen.generateKey().getEncoded(), "AES");
  36. 36. Sécurité : Chiffrage coté Java Génération du vecteur d’initialisation (iv) : byte[] iv = new byte[16]; SecureRandom random = SecureRandom.getInstance("SHA1PRNG"); random.nextBytes(iv);
  37. 37. Sécurité : Chiffrage coté Java Chiffrage / Dechiffrage : Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); IvParameterSpec ivspec = new IvParameterSpec(iv); cipher.init(Cipher.ENCRYPT_MODE, sKey, ivspec); // ou DECRYPT_MODE encryptedCount = cipher.update(data, 0, bytesRead, encryptedData);
  38. 38. Plus de sécurité - Fichier PDF avec mot de passe : - Chiffrage coté JNI - SSL (+ vérification certificats) MuPDFCore.authenticatePassword(“mypassword”);

×