web-dev-qa-db-de.com

Schritte zum Erstellen einer APK-Erweiterungsdatei

Ich habe Application entwickelt und arbeite erfolgreich.

Ich habe die Anwendungslizenzierungsfunktion in meiner Anwendung verwendet. Und jetzt werde ich eine Anwendung auf Google Play hochladen.

Bitte lassen Sie mich die Schritte wissen, wie die Anwendungslizenzierung verwendet wird und wie die APK-Erweiterungsdatei erstellt wird.

39
user1414154

Erweiterungsdateien heben die Beschränkung auf, mehr als 50 MB Apk-Größe hochzuladen. Sie sollten diese Dateien beim Hochladen der apk anhängen. Jede App kann bis zu 4 GB (2 GB - Haupt- und 2 GB - Patch) zusätzliche Daten für jedes APK bereitstellen.

Es gibt Namenskonventionen, die Sie beim Erstellen von Erweiterungsdateien beachten müssen

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

hinweis:

  1. main- Sind diese Dateien nicht vorhanden, wird Ihre Anwendung nicht ausgeführt
  2. patch- sind die zusätzlichen Dateien, ohne die Ihre Anwendung ausgeführt werden kann
  3. expansion-version - Version, die Sie Ihrer apk geben, damit keine Konflikte zwischen Erweiterungsdateien unterschiedlicher Versionen auftreten
  4. package-name - Dies ist Ihr eindeutiger Paketname

.obb Wird nicht angehängt, sondern implizit von Google beim Hochladen angehängt

angenommen, Sie haben den gesamten Inhalt in Ihrem aktuellen Verzeichnis. Wählen Sie einfach den gesamten Inhalt aus und erstellen Sie eine Zip-Datei mit dem Namen main.2.com.xyz.abc.Zip. Fügen Sie diese beim Hochladen der apk-Datei hinzu

enter image description here

Dies alles zum Hochladen, jetzt zum Herunterladen

Zunächst müssen Sie das Google-Zusatzpaket herunterladen , indem Sie auf SDK-Manager klicken

enter image description here

Erstellen Sie nun ein neues Projekt aus einer vorhandenen Quelle und importieren Sie market_licensing, play_apk_expansion aus dem Pfad sdk-path/extras/google

Denken Sie daran: Für die kostenlose App ist keine Lizenzierung erforderlich, aber ein Erweiterungskonzept ist erforderlich. Sie müssen sich nur nicht darum kümmern, Ihrem Projekt einen Verweis auf market_licensing zu geben, das implizit verwaltet wird.

play_apk_expansion Enthält drei Projekte downloader_library, Zip_file, downloader_sample.

downloader_library selbst mit der Referenz Market_licensing.

Jetzt musst du dich nur noch auf downloader_sample Konzentrieren. Ändere zuerst den Paketnamen (zum Testen) in deinen Paketnamen (Paketname wie hochgeladen apk).

sehr wichtig

Navigieren Sie in SampleDownloaderActivity zu ...

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
            ),

    };

Jetzt Diese Aktivität lädt die Erweiterungsdatei herunter und speichert sie in sdcard/Android/obb/[main|patch].<expansion-version>.<package-name>.obb Obb. Entpacken Sie diese Datei einfach an einer beliebigen Stelle (sdcard/Android/data Wird empfohlen, da sie bei der Deinstallation Ihrer Anwendung entfernt wird).

Es gibt die neuesten Geräte, die Erweiterungsdateien direkt vom Play Store herunterladen und in sdcard/Android/obb/ Gespeichert werden. Sie müssen also sehr vorsichtig sein, um alle Fälle zu überprüfen

  1. Obb bereits heruntergeladen
  2. Verfügbare Erinnerung
  3. heruntergeladen, aber nicht entpackt
  4. Speicher zur Auswahl (siehe Memory Cases)

Memory Cases:

wenn Sie ein neues Gerät nehmen oder zum Beispiel. micromax funbook, dann hat es drei speicher

  • / data/data/(Telefoninterner Speicher) getFilesDirectory ()
  • / mnt/sdcard/(interne SD-Karte des Telefons) Environment.getExternalStorageDirectory ()
  • / mnt/extsd/(Externe SD-Karte) /mnt/extsd

Ich hoffe, dies wird Ihnen helfen und Ihren Anforderungen entsprechen.

Und noch eine Sache, benutze dies unten ZipHelper um den Inhalt zu entpacken.

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

Nehmen Sie zunächst an, Sie migrieren mit einem helloworld.jpg von /assets/helloworld.jpg zu Ihrer Erweiterung

  1. erstellen Sie eine Zip-Datei mit dem folgenden Dateimuster und beenden Sie die Dateierweiterung .obb:
 `[main|patch].{expansion-version}.{package-name}.obb`

Zum Beispiel, wenn Ihr pkg-Name "com.earth.helloworld" und Version = 1 ist

dann sollte der Dateiname Ihrer Ausgabeerweiterung sein: patch.1.com.earth.helloworld.obb
Dies ist eine Zip-Datei, die helloworld.jpg enthält
Notieren Sie nach dem Erstellen der Zip-Datei die Dateigröße: enter image description here 2. dann erstelle diesen Ordner auf deiner SD-Karte, falls nicht vorhanden:
/mnt/sdcard/Android/obb/{Ihr Paketname} /
d. h. / mnt/sdcard/Android/obb/com.earth.helloworld /

  1. laden Sie dann Ihre OBB-Datei auf Ihre SD-Karte hoch, z. B. /mnt/sdcard/Android/obb/com.earth.helloworld/patch.1.com.earth.helloworld.obb

  2. Erstellen Sie dann eine Methode, um die Erweiterungsdatei abzurufen

    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. Verwenden Sie zum Schluss diese beiden Zeilen, um die Datei helloworld.jpg zu erhalten
    InputStream istr = getExpansionFile().getInputStream(strName);

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

Einige hilfreiche Informationen für Leute, die hier in diesem Beitrag landen, da es einige Dinge gibt, die sich in der Funktionsweise von apk-Erweiterungen geändert haben und auch, wenn Sie Android Studio verwenden, um die Bibliotheken zum Laufen zu bringen.

ANMERKUNG 1

Sie können Entwurf nicht mehr verwenden, da der Link zum Abrufen der Erweiterungsdatei noch nicht aktiv ist. Sie müssen zuerst eine Version mit Erweiterungsdatei auf Alpha oder Beta hochladen. (Das Hinzufügen einer Erweiterungsdatei ist nur ab dem zweiten hochgeladenen Apk möglich.) Stellen Sie also sicher, dass die aufgelistete Apk-Erweiterungsdatei angezeigt wird, wenn Sie unter APK auf die Details im Abschnitt zur Veröffentlichung für Entwickler klicken.

ANMERKUNG 2

Wenn Sie Android studio verwenden und die Downloadbibliothek verwenden möchten, kopieren Sie nicht einfach den Paketnamen und Java files in Ihr eigenes App-src-Verzeichnis Importieren Sie die Downloader - Bibliothek in Eclipse und wählen Sie export => gradle build files. Anschließend können Sie die Bibliothek als Modul in Android studio.

ANMERKUNG

Ich bin mir nicht sicher, denke aber auch, dass es notwendig ist, die App mindestens einmal über den Play Store herunterzuladen und über das Konto auf Ihrem Testgerät darauf zuzugreifen. Wenn Sie mit Alpha arbeiten, erstellen Sie eine Google + -Testgruppe und fügen Sie sich selbst oder andere Testgeräte hinzu.

ÜBRIGENS

Mit diesen Bibliotheken ist es ziemlich einfach, den Download der apk-Erweiterung zu implementieren.

  1. ihre Aktivität (die Aktivität, bei der Sie das Herunterladen des Erweiterungspakets implementieren möchten, wenn das Herunterladen nicht automatisch erfolgt ist) implementiert IDownloaderClient.

  2. sie richten den Service und den Empfänger ein und richten sie in Ihrem Manifest ein.

  3. Der BASE64_PUBLIC_KEY in der Serviceklasse ist korrekt. Laden Sie die erste apk hoch => schauen Sie in Dienste und APIs in der Entwicklerkonsole unter Ihrer App nach => Lizenzcode für diese App.

Mit diesem Code wird überprüft, ob die Erweiterungsdatei auf dem Gerät vorhanden ist:

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

Es wird die Klasse XAPKS verwendet, die eine Erweiterungsdatei darstellt, sei es eine Haupt- oder eine Patch-Datei, die eine bestimmte Dateigröße (Bytes) aufweist und mit einer apk-Version (der Version, in der sie zuerst hinzugefügt wurde) verknüpft ist.

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

Mit den von Google bereitgestellten Zip-Tools (com.Android.vending.zipfile) können Sie auch Filmdateien und anderes direkt aus der Erweiterungsdatei lesen.

Rufen Sie zuerst die Erweiterungsdatei mit den in der Bibliothek bereitgestellten Methoden ab. Die Parameter sind Ganzzahlen, die Ihre Hauptversion der Erweiterungs-Apk (die Apk-Version, in der das zuerst benötigte Erweiterungspaket hinzugefügt wurde) und die Patch-Apk-Version darstellen.

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

Video

Zum Abspielen von Videos direkt aus dieser zipresource-Datei:

AssetFileDescriptor a = expansionFile.getAssetFileDescriptor(pathToFileInsideZip);

Aus diesem assetFileDescriptor können Sie nun einen FileDescriptor abrufen und diesen in Ihrem Mediaplayer verwenden. Die richtige Syntax, damit Ihr Mediaplayer das Video abspielt, erfordert auch den zweiten und dritten Parameter. Sei es der Startoffset und die Länge, die Sie aus dem AssetFileDescriptor abrufen können.

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

Andere

Für alle anderen Dinge (wie Bilder) können Sie einfach einen Inputstream der zipresource-Datei erhalten:

expansionFile.getInputStream(pathToFileInsideZip);`

Achte AUCH darauf, dass du die Videos in der Zip nicht komprimierst, damit das funktioniert! Zum Beispiel, um MP4-Dateien nicht zu komprimieren:

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

Ich möchte nur einige Dinge hinzufügen, die ich bei der Implementierung gelernt habe:

1) Ab sofort müssen Sie die Download-Bibliothek und das gesamte XAPKFile-Material nicht mehr implementieren. Sie müssen lediglich alle Berechtigungen kopieren/einfügen, die unter https://developer.Android.com) aufgeführt sind /google/play/expansion-files.html in Ihre Manifest-Datei. Vielleicht warst du es früher, aber der Google Play Store übernimmt das Herunterladen und Installieren für dich. Der einzige Grund, warum Sie den eigentlichen Download in Ihrem Quellcode erledigen müssen, ist, wenn der Benutzer manuell in Android/obb gegangen ist und Ihre Erweiterungsdateien gelöscht hat.

2) Wenn Sie Ihre .Zip-Datei hochladen, müssen Sie sie nicht der main.version.package.obb-Konvention zuordnen. Laden Sie einfach Ihre .Zip-Datei mit ihrem ursprünglichen Namen hoch, und sie wird trotzdem für Sie umbenannt.

3) Um auf die Zip-Datei zuzugreifen, gehen Sie zu Datei> Neu> Modul importieren und importieren Sie die Zip-Dateibibliothek, die sich im selben Verzeichnis befindet wie der Downloader und die Lizenzbibliotheken. Stellen Sie sicher, dass Sie zu Ihren Abhängigkeiten in der Datei build.gradle für Ihre Anwendung Folgendes hinzufügen: compile project (': Zip_file'). Auf diese Weise können Sie diese Bibliotheken in Ihr Projekt importieren.

Ich hoffe das ist hilfreich. Ich habe im Grunde Stunden damit verbracht, den (komplizierten) Download-Bibliothekscode zu implementieren, der auf der Site aufgeführt ist, und am Ende habe ich alles gelöscht und nur die Berechtigungen im Manifest beibehalten, und es funktioniert einwandfrei.

2
eric k atwood