17 avril 2012 ~ 5 Commentaires

[Tuto] – Utiliser la librairie « APK Expansion » pour les applications lourdes Android (50Mo+)

Préface:
Hello les devs Android :) , j’ai décidé de lancer ce blog car je ne trouvais pas d’information sur l’implémentation de la library Apk Expansion. Après plusieurs heures jours de galères j’ai enfin réussi à l’utiliser, et comme je suis sympa, je vais partager cette expérience avec vous :p.
Avant tout, je tiens juste à préciser que je ne suis pas un développeur Android ayant énormément d’expérience, seulement 2 applis publiées sur le market.
Je ne garantie donc pas la véracité absolue de mes propos tout au long de cet article (mais un peu quand même) :) .

Petit rappel du sujet:
APK Expansion Library, qu’est ce que c’est ?
Si comme moi vous développez des applications Android qui dépassent la limite de taille fixé par google (50Mo) à cause de ressources un peu lourde vous êtes concernés.
Avant la mise en place de cette library, il n’y avait que 2 solutions:

  • Télécharger les ressources avec un downloader perso depuis un serveur perso post installation
  • Créer une autre application sur le Market pour faire une « Extension » de la première
  • Se restreindre ( j’avais bien dis 2 solutions ;) )

La première peut coûter assez cher en fonction de la fréquence d’installation de votre application (pour un dev non pro), peu pratique pour gérer les mises à jour, nécessite beaucoup de développement.
La seconde est contraignante pour les utilisateurs.

Mais c’est après un peu plus de 6 mois de retard sur son planning que Google s’est décidé à nous offrir cette option tant attendue … l’hébergement des application de plus de 50 Mo.
Mais il y a un mais. Et oui, tout n’est pas toujours rose au pays des petits robots vert…
Le fichier .apk de notre application est toujours limité à 50Mo, mais Google se propose d’héberger nos ressources sous la forme de deux archive de 2go Max liées à notre apk.
L’APK Expansion Library, que nous allons désormais raccourcir à APKEL car je suis flemmard, est la pour nous faciliter la tâche quand à la récupération de ces archives dans notre application.

Google décrit clairement dans la doc de l’APKEL (dispo ici) que « normalement » ces fichiers d’archives se téléchargent automatiquement lors de l’installation de votre application depuis le Play Store (oui je suis bobo, l’android market c’est has been comme appellation…).
Mais « au cas ou » car « on sait jamais », mieux vaut rajouter une couche de sécurité dans notre application, on est jamais trop prudent. (Vous l’aurez compris, je pense que Google a été un peu feignant sur ce coup la, mais je ne leur en veut pas … j’aurais fais pareil :D )

Nous allons voir comment implémenter APKEL dans notre application, télécharger nos fichiers de ressources (ou assets dans la langue de Shakespeare), vérifier leur intégrité, les utiliser.
C’est partit !

1 – Installer les composants suivant depuis le SDK Android (Rubrique « Extra »):

  • Google Market Licensing package
  • Google Market Apk Expansion package

Si vous ne voyez pas le Google Market Apk Expansion package, mettez à jour votre SDK Manager.
Pensez également à mettre à jour ADT dans votre IDE. (j’utilise ADT 18.0 sur ce tuto)

2 – Ajouter les librairies au projet

Une fois les librairies téléchargées, il faut les importer dans votre application Android existante.
(ha oui, petite précision je travaille sous éclipse)

Donc dans Eclipse, nous allons créer 3 nouveaux projets. (1 à la fois s’il vous plait :p )

La petite subtilité ici c’est de sélectionner « Create project from existing source » et de spécifier la source de chaque librairie:

Nous allons les nommer respectivement:

  • « Google Play License Library »
  • source:
    « Emplacement_de_votre_android_sdk\extras\google\play_licensing\library »

  • Google Play Downloader Library
  • source:
    « Emplacement_de_votre_android_sdk\extras\google\play_apk_expansion\downloader_library »

  • Google Play ZipFile Library
  • source:
    « Emplacement_de_votre_android_sdk\extras\google\play_apk_expansion\zip_file »

La « ZipFile Library » permet de faire des vérifications d’intégrité après téléchargement des fichiers d’extension, elle est facultative mais il est recommandé de l’utiliser.

En SDK Target laissez la version recommandée  » 4.0.3  » même si votre projet est configuré dans une version inférieure:

Une fois les trois libraries importées, vous devriez vous retrouver dans cette configuration:

« Google Play Downloader Library » contient des erreurs car il est dépendant de la « License Library », nous allons configurer le lien entre les deux libraries tout de suite:
Faites un « clique droit -> properties » sur le projet « Google Play Downloader Library ». Dans l’onglet « Android » vous devriez avoir cette fenêtre:

Sélectionnez la référence en erreur « market_licensing » et cliquez sur « remove »
Cliquez ensuite sur « Add » et sélectionnez le projet que vous avez importé sous le nom « Google Play License Library »

Vous devriez vous retrouver dans cette configuration:

Cliquez sur « ok », nos trois librairies apparaissent maintenant sans erreur:

Nos trois librairies sont maintenant prêtes à être intégrées. Répétez la même opération que ci-dessus dans les propriétés de votre projet Android, mais cette fois nous allons inclure les 3 librairies:

Une fois l’opération terminée vous devriez voir les 3 librairies correction liées:

Cliquez sur « ok » pour valider l’importation des librairies.


Attention, à ce niveau j’ai rencontré un soucis:
mon SDK étant sur un autre disque, je soupçonne que le chemin depuis mon workspace jusqu’aux librairies était trop long.
Ré-ouvrez les propriétés de votre projet et vérifiez que les 3 librairies sont toujours dans l’état « coche verte ». Personnellement je les avait vertes avant de valider, mais en ré-ouvrant les propriétés elle étaient devenue rouge:

J’ai résolu le problème en déplaçant l’emplacement du SDK à « proximité » de mon workspace Eclipse !
Si tout est vert pour vous, l’importation s’est bien déroulée, on peut continuer !

!CE TUTORIEL N’EST PAS TERMINE, il sera mis à jour très prochainement!

3 – Ajouter les permissions au Manifest de l’application:

?Download manifest.xml
1
2
3
4
5
6
    <uses-permission android:name="com.android.vending.CHECK_LICENSE" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

4 – La classe DownloaderService

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
 public class SampleDownloaderService extends DownloaderService {
 
    //Votre clef publique se trouve
    public static final String BASE64_PUBLIC_KEY = "Votre clé publique";
 
    //Le SALT est une suite de bytes aléatoires qui permet de sécuriser le transfert, assurez vous de modifier ces numéros:
    public static final byte[] SALT = new byte[] { 1, 42, -12, -1, 54, 98, -100, -12, 43, 2, -8, -4, 9, 5, -106, -107, -33, 45, -1, 84
    };
 
    @Override
    public String getPublicKey() {
        return BASE64_PUBLIC_KEY;
    }
 
    @Override
    public byte[] getSALT() {
        return SALT;
    }
 
    @Override
    public String getAlarmReceiverClassName() {
        return SampleAlarmReceiver.class.getName();
    }
}
  • oocieni

    Bonjour,

    depuis le temps que je cherchais un tuto sur ce sujet ;) A quand la suite ?

    Merci

    • http://www.gmla.fr Floy

      Salut Oocieni, merci pour ton commentaire ;)
      Je vais essayer de le poursuivre prochainement mais je suis un peu surbooké ces derniers temps !

      Je fais le Max ;)

  • kom

    Il serait intéressant de poster la suite du tutoriel.

    Merci.

  • Frederic Hunter

    Bonsoir… idem oocieni… depuis le temps que je cherchais à comprendre le charabia de Google en matière de « correctif » (fichier extension)… bon, je n’ai pas encore testé, je m’y colle !

    merci pour ce travail,
    Frederic

  • letroll

    Bonjour,

    +1 pour le tuto, mais s’il n’est pas finis il ma déjà bien aidé merci à toi!