web-dev-qa-db-fra.com

Étapes pour créer un fichier d'extension APK

J'ai développé une application et je travaille avec succès.

J'ai utilisé la fonctionnalité de licence d'application dans mon application. Et maintenant, je vais télécharger une application sur Google Play.

Veuillez me faire savoir les étapes, comment utiliser la licence d'application et comment créer un fichier d'extension APK?

39
user1414154

Les fichiers d'extension suppriment la restriction du téléchargement de plus de 50 Mo de taille apk. Vous devez joindre ces fichiers lors du téléchargement de l'apk. Chaque application peut fournir jusqu'à 4 Go (2 Go - principal, 2 Go - correctif) de données supplémentaires pour chaque APK.

Il existe une convention de dénomination que vous devez suivre lors de la création de fichiers d'extension

[main|patch].<expansion-version>.<package-name>.obb

remarque:

  1. main- sont ces fichiers sans cela, votre application ne fonctionnera pas
  2. patch- sont ces fichiers qui sont supplémentaires, sans cela votre application peut s'exécuter
  3. expansion-version- version que vous donnez à votre apk, afin que les fichiers d'extension de version différente n'entrent pas en conflit
  4. package-name- Ceci est le nom unique de votre package

.obb nous n'ajoutons pas, il sera implicitement ajouté par Google lors du téléchargement

supposons que vous ayez tout le contenu dans votre répertoire actuel, alors sélectionnez tout le contenu et faites-en un Zip nommé main.2.com.xyz.abc.Zip et joignez-le avec pendant le téléchargement d'apk

enter image description here

Cette partie de téléchargement, maintenant la partie de téléchargement

Tout d'abord, vous devez télécharger le package supplémentaire Google en cliquant sur SDK-Manager

enter image description here

Créez maintenant un nouveau projet à partir de la source existante et importez market_licensing, play_apk_expansion à partir du chemin sdk-path/extras/google

Rappelez-vous: l'application gratuite ne nécessite pas de licence, mais le concept d'extension est requis, il vous suffit de ne pas vous embêter en donnant la référence de market_licensing à votre projet qu'elle gérera implicitement.

play_apk_expansion contient trois projets downloader_library, Zip_file, downloader_sample.

downloader_library lui-même ayant la référence de Market_licensing.

Il ne vous reste plus qu'à vous concentrer sur downloader_sample changez d'abord le nom du paquet (pour les tests) en votre nom de paquet (nom de paquet identique à l'apk téléchargé)

très important

Dans SampleDownloaderActivity accédez à ...

private static final XAPKFile[] xAPKS = {
            new XAPKFile(
                    true, // true signifies a main file
                    2, // the version of the APK that the file was uploaded
                       // against
                    xxxxxxxxxxxL // the length of the zipfile in bytes right click on you expansion file and get the size in bytes, size must be same as Zip size
            ),

    };

Cette activité va télécharger le fichier d'extension et le stocker dans sdcard/Android/obb/[main|patch].<expansion-version>.<package-name>.obb ignorez obb, décompressez simplement ce fichier où vous voulez (sdcard/Android/data recommandé car il se supprime lorsque votre application est désinstallée).

Il existe un appareil récent qui télécharge les fichiers d'extension directement depuis le Play Store et il est stocké dans sdcard/Android/obb/ il faut donc être très prudent pour vérifier tous les cas

  1. Obb déjà téléchargé
  2. Mémoire disponible
  3. téléchargé mais pas décompressé
  4. Mémoire à sélectionner (voir Boîtiers de mémoire)

Cas de mémoire:

si vous prenez un nouvel appareil ou par ex. micromax funbook, alors il a trois mémoires

  • / data/data/(mémoire interne du téléphone) getFilesDirectory ()
  • / mnt/sdcard/(carte mémoire interne du téléphone) Environment.getExternalStorageDirectory ()
  • / mnt/extsd/(Carte SD externe) /mnt/extsd

J'espère que cela vous aidera et répondra à vos besoins.

Et encore une chose, utilisez ceci sous ZipHelper pour décompresser le contenu.

ZipHelper.Java

public class ZipHelper
{
    boolean zipError=false;

    public boolean isZipError() {
        return zipError;
    }

    public void setZipError(boolean zipError) {
        this.zipError = zipError;
    }

    public void unzip(String archive, File outputDir)
    {
        try {
            Log.d("control","ZipHelper.unzip() - File: " + archive);
            ZipFile zipfile = new ZipFile(archive);
            for (Enumeration e = zipfile.entries(); e.hasMoreElements(); ) {
                ZipEntry entry = (ZipEntry) e.nextElement();
                unzipEntry(zipfile, entry, outputDir);

            }
        }
        catch (Exception e) {
            Log.d("control","ZipHelper.unzip() - Error extracting file " + archive+": "+ e);
            setZipError(true);
        }
    }

    private void unzipEntry(ZipFile zipfile, ZipEntry entry, File outputDir) throws IOException
    {
        if (entry.isDirectory()) {
            createDirectory(new File(outputDir, entry.getName()));
            return;
        }

        File outputFile = new File(outputDir, entry.getName());
        if (!outputFile.getParentFile().exists()){
            createDirectory(outputFile.getParentFile());
        }

        Log.d("control","ZipHelper.unzipEntry() - Extracting: " + entry);
        BufferedInputStream inputStream = new BufferedInputStream(zipfile.getInputStream(entry));
        BufferedOutputStream outputStream = new BufferedOutputStream(new FileOutputStream(outputFile));

        try {
            IOUtils.copy(inputStream, outputStream);
        }
        catch (Exception e) {
            Log.d("control","ZipHelper.unzipEntry() - Error: " + e);
            setZipError(true);
        }
        finally {
            outputStream.close();
            inputStream.close();
        }
    }

    private void createDirectory(File dir)
    {
        Log.d("control","ZipHelper.createDir() - Creating directory: "+dir.getName());
        if (!dir.exists()){
            if(!dir.mkdirs()) throw new RuntimeException("Can't create directory "+dir);
        }
        else Log.d("control","ZipHelper.createDir() - Exists directory: "+dir.getName());
    }
}
93
Azhar Shaikh

Tout d'abord, supposez que vous migrez en utilisant un helloworld.jpg de /assets/helloworld.jpg vers votre extension

  1. créer un fichier Zip mais avec le modèle de fichier suivant, mettant fin à l'extension de fichier .obb:
 `[main|patch].{expansion-version}.{package-name}.obb`

Par exemple, si le nom de votre pack est "com.earth.helloworld" et version = 1

alors le nom de votre fichier d'extension de sortie doit être: patch.1.com.earth.helloworld.obb
qui est un fichier Zip contenant helloworld.jpg
après la création du fichier Zip, notez la taille du fichier: enter image description here 2. puis créez ce dossier sur votre carte SD s'il n'existe pas:
/mnt/sdcard/Android/obb/{votre nom de package} /
c'est-à-dire / mnt/sdcard/Android/obb/com.earth.helloworld /

  1. puis téléchargez votre fichier obb sur votre carte SD, par exemple /mnt/sdcard/Android/obb/com.earth.helloworld/patch.1.com.earth.helloworld.obb

  2. Ensuite, créez une méthode pour obtenir le fichier d'extension

    public ZipResourceFile getExpansionFile() {
    
    String fileName = Helpers.getExpansionAPKFileName(this, false, 1);
    
            int filesize = 445461159;
    if (Helpers.doesFileExist(this, fileName, , false)) {
    
        try {
            return APKExpansionSupport.getAPKExpansionZipFile(
                    getBaseContext(), 1, 1);
    
        } catch (IOException e) {
            // TODO Auto-generated catch block
    
            e.printStackTrace();
        }
    }
    return null;       }
    
  3. Enfin, utilisez ces deux lignes pour obtenir le helloworld.jpg
    InputStream istr = getExpansionFile().getInputStream(strName);

    Bitmap bitmap = BitmapFactory.decodeStream(istr);
    
13
RAY

Quelques informations utiles pour les personnes qui se retrouvent ici dans ce post car il y a des choses qui ont changé dans le fonctionnement des extensions apk et aussi si vous utilisez Android Studio pour faire fonctionner les bibliothèques.

NOTE 1

Vous ne pouvez plus utiliser le brouillon car le lien pour obtenir le fichier d'extension ne sera pas encore actif. Vous devez d'abord télécharger une version sur Alpha ou Beta avec un fichier d'extension. (l'ajout d'un fichier d'extension n'est possible qu'à partir de la deuxième apk que vous téléchargez et vers le haut) Assurez-vous donc de voir le fichier d'extension apk répertorié lorsque vous cliquez sur les détails dans la section de publication du développeur sous APK.

NOTE 2

Si vous utilisez Android studio et que vous souhaitez utiliser la bibliothèque de téléchargement, ne copiez pas seulement le nom du package et les fichiers Java dans votre propre répertoire src d'application) . Importez la bibliothèque de téléchargement dans Eclipse et choisissez exporter => les fichiers de construction gradle. Ensuite, vous pouvez importer la bibliothèque en tant que module dans Android studio.

NOTE

Je n'en suis pas sûr, mais je pense également qu'il est nécessaire de télécharger l'application au moins une fois via le Play Store et d'y avoir accès avec le compte sur votre appareil de test. Donc, si vous travaillez avec alpha, créez un groupe de test google + et ajoutez-y vous-même ou d'autres appareils de test.

ENTRE

Avec ces bibliothèques, il est assez facile d'implémenter le téléchargement de l'extension apk, assurez-vous simplement:

  1. votre activité (celle où vous souhaitez implémenter le téléchargement du pack d'extension lorsque le téléchargement n'a pas été fait automatiquement) implémente IDownloaderClient.

  2. vous configurez le service et le récepteur et les installez dans votre manifeste.

  3. Le BASE64_PUBLIC_KEY dans la classe de service est correct. Téléchargez le premier apk => regardez dans Services et API dans la console développeur sous votre application => Code de licence pour cette application.

Ce code est utilisé pour voir si le fichier d'extension peut être trouvé sur l'appareil:

boolean expansionFilesDelivered() {
    for (XAPKFile xf : xAPKS) {
        String fileName = Helpers.getExpansionAPKFileName(this, xf.mIsMain, xf.mFileVersion);
        Log.i(TAG, "Expansion filename " +fileName);
        if (!Helpers.doesFileExist(this, fileName, xf.mFileSize, false))
            return false;
    }
    return true;
}

Il utilise la classe XAPKS qui représente un fichier d'extension, que ce soit un fichier principal ou un correctif, ayant une certaine taille de fichier (octets) et associé à une version apk (celle dans laquelle il a été ajouté pour la première fois).

private static class XAPKFile {
        public final boolean mIsMain; // true
        public final int mFileVersion; //example 4
        public final long mFileSize; //example 126515695L
        // example => main expansion that was first introduced in apk version 4 and is 126515695 bytes in size

        XAPKFile(boolean isMain, int fileVersion, long fileSize) {
            mIsMain = isMain;
            mFileVersion = fileVersion;
            mFileSize = fileSize;
        }
    }

Il est également assez facile de lire des fichiers vidéo et d'autres éléments directement à partir du fichier d'extension à l'aide des outils Zip fournis par Google (com.Android.vending.zipfile).

Obtenez d'abord le fichier d'extension en utilisant les méthodes fournies dans la bibliothèque, les paramètres sont des nombres entiers qui représentent votre version apk d'expansion principale (la version apk où le pack d'extension dont vous avez besoin a été ajouté pour la première fois) et la version apk de patch.

ZipResourceFile expansionFile = APKExpansionSupport.getAPKExpansionZipFile(context, APKX_MAIN_APK, APKX_PATCH_APK);

Vidéo

Pour lire la vidéo directement à partir de ce fichier zipresource:

AssetFileDescriptor a = expansionFile.getAssetFileDescriptor(pathToFileInsideZip);

Maintenant, à partir de cet assetFileDescriptor, vous pouvez obtenir un FileDescriptor et l'utiliser dans votre lecteur multimédia, la syntaxe correcte pour que votre lecteur multimédia joue la vidéo nécessite également les deuxième et troisième paramètres. Que ce soit le décalage de départ et la longueur que vous pouvez obtenir à partir de AssetFileDescriptor.

player.setDataSource(a.getFileDescriptor(), a.getStartOffset(), a.getLength());

Autre

Pour toutes les autres choses (comme les images), vous pouvez simplement obtenir un flux d'entrée du fichier zipresource:

expansionFile.getInputStream(pathToFileInsideZip);`

Assurez-vous également de ne pas compresser les vidéos dans le Zip pour que cela fonctionne! par exemple, ne pas compresser les fichiers .mp4:

Zip -n .mp4 -r zipfile.Zip . -x ".*" -x "*/.*"
11
Jordy

Je veux juste ajouter certaines choses que j'ai apprises lors de la mise en œuvre de ceci:

1) Pour l'instant, vous n'avez pas besoin d'implémenter la bibliothèque de téléchargement et tous les trucs XAPKFile, tout ce que vous avez à faire est de copier/coller toutes les autorisations répertoriées sur https://developer.Android.com /google/play/expansion-files.html dans votre fichier manifeste. Peut-être que vous le faisiez auparavant, mais Google Play Store gère le téléchargement et l'installation pour vous. La seule raison pour laquelle vous auriez besoin de gérer le téléchargement réel dans votre code source est si l'utilisateur est entré manuellement dans Android/obb et a supprimé vos fichiers d'extension.

2) Lorsque vous téléchargez votre fichier .Zip, vous n'avez pas besoin de le nommer à la convention main.version.package.obb. Téléchargez simplement votre fichier .Zip avec son nom d'origine, et il sera renommé pour vous malgré tout.

3) Pour accéder au fichier Zip, accédez à Fichier> Nouveau> Module d'importation et importez la bibliothèque Zip_file qui se trouve dans le même répertoire que les bibliothèques de téléchargement et de licence. Assurez-vous d'ajouter à vos dépendances dans le fichier build.gradle pour votre application: projet de compilation (': Zip_file'). Cela vous permet d'importer ces bibliothèques dans votre projet.

J'espère que cela vous sera utile. J'ai essentiellement passé des heures à essayer de mettre en œuvre le code de bibliothèque de téléchargement (compliqué) qui est répertorié sur le site, et à la fin, j'ai tout supprimé et j'ai simplement conservé les autorisations dans le manifeste, et cela fonctionne bien.

2
eric k atwood