web-dev-qa-db-ja.com

APK拡張ファイルを作成する手順

アプリケーションを開発し、正常に動作しています。

アプリケーションにアプリケーションライセンス機能を使用しました。そして今、Google Playにアプリケーションをアップロードします。

手順、アプリケーションライセンスの使用方法、APK拡張ファイルの作成方法を教えてください。

39
user1414154

拡張ファイルにより、50MBを超えるapkサイズのアップロードの制限がなくなります。 APKをアップロードするときにこれらのファイルを添付する必要があります。各アプリは、APKごとに最大4GB(2GB-メイン、2GB-パッチ)の追加データを提供できます。

拡張ファイルの作成中に従う必要がある命名規則があります

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

注意:

  1. main-これがない場合、アプリケーションは実行されません
  2. patch-は追加のファイルで、これがなければアプリケーションは実行できます
  3. expansion-version- apkに提供しているバージョン。異なるバージョンの拡張ファイルが競合しないようにするため
  4. package-name-これは一意のパッケージ名です

.obb追加していません。アップロード中にGoogleによって暗黙的に追加されます

現在のディレクトリにすべてのコンテンツがあるため、すべてのコンテンツを選択し、main.2.com.xyz.abc.Zipという名前のZipにし、apkのアップロード時に添付します

enter image description here

このすべてのアップロード部分、現在ダウンロード部分

まず、SDK-Managerをクリックしてダウンロードする必要があるGoogleの追加パッケージ

enter image description here

既存のソースから新しいプロジェクトを作成し、インポートしますmarket_licensingplay_apk_expansionパスからsdk-path/extras/google

要確認:無料アプリにはライセンスは必要ありませんが、拡張コンセプトが必要です。暗黙的に管理するプロジェクトにmarket_licensingの参照を提供するだけでかまいません。

play_apk_expansionには3つのプロジェクトdownloader_libraryZip_filedownloader_sampleが含まれます。

downloader_library自体がMarket_licensingの参照を持っています。

これで、downloader_sampleに集中する必要があります。最初に、パッケージ名(テスト用)をパッケージ名(アップロードされたapkと同じパッケージ名)に変更します。

非常に重要

SampleDownloaderActivityでナビゲート...

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

    };

これで、このアクティビティは拡張ファイルをダウンロードし、sdcard/Android/obb/[main|patch].<expansion-version>.<package-name>.obb obbに保存します。このファイルは任意の場所で解凍します(sdcard/Android/dataは、アプリケーションがアンインストールされると削除されるため推奨されます)。

拡張ファイルをPlayストアから直接ダウンロードする最新のデバイスがあり、sdcard/Android/obb/に保存されるため、すべてのケースを非常に慎重にチェックする必要があります

  1. Obbは既にダウンロードされています
  2. 使用可能なメモリ
  3. ダウンロードされたが解凍されていない
  4. 選択するメモリ(メモリケースを参照)

メモリケース:

新しいデバイスを使用する場合、または元の場合。マイクロマックスファンブック、それは3つのメモリを持っています

  • / data/data /(電話の内部メモリ)getFilesDirectory()
  • / mnt/sdcard /(電話の内部SDカード)Environment.getExternalStorageDirectory()
  • / mnt/extsd /(外部SDカード)/ mnt/extsd

これがあなたを助け、あなたの要件を満たすことを願っています。

そしてもう1つ、以下のZipHelperを使用してコンテンツを解凍します。

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

最初に、/assets/helloworld.jpgからhelloworld.jpgを使用して展開に移行すると仮定します

  1. zipファイルを作成しますが、ファイル拡張子.obbで終わる次のファイルパターンを使用します。
_ `[main|patch].{expansion-version}.{package-name}.obb`_

たとえば、pkg名が「com.earth.helloworld」でバージョンが1の場合

その後、出力拡張ファイル名は次のようになります。patch.1.com.earth.helloworld.obb
これはhelloworld.jpgを含むZipファイルです
Zipファイルの作成後、ファイルサイズに注意してください。 enter image description here 2.次に、sdcardにこのフォルダーが存在しない場合は作成します。
/mnt/sdcard/Android/obb/{パッケージ名} /
i.e / mnt/sdcard/Android/obb/com.earth.helloworld /

  1. 次に、obbファイルをsdcardにアップロードします(例:/mnt/sdcard/Android/obb/com.earth.helloworld/patch.1.com.earth.helloworld.obb

  2. 次に、拡張ファイルを取得するメソッドを作成します

    _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. 最後に、この2行を使用してhelloworld.jpgを取得します
    InputStream istr = getExpansionFile().getInputStream(strName);

    _Bitmap bitmap = BitmapFactory.decodeStream(istr);
    _
13
RAY

Apk拡張の動作方法が変更されたため、またAndroid Studioを使用してライブラリを動作させる場合もあるため、この投稿で終わる人々のためのいくつかの完全な情報。

注1

拡張ファイルを取得するためのリンクがまだアクティブになっていないため、ドラフトを使用することはできません。最初に拡張ファイルを使用して、アルファ版またはベータ版にバージョンをアップロードする必要があります。 (拡張ファイルの追加は、アップロードした2番目以降のapkからのみ可能です)APKの開発者公開セクションで詳細をクリックすると、apk拡張ファイルがリストされていることを確認してください。

注2

Android studioを使用しており、ダウンローダーライブラリを使用したい場合は、パッケージ名とJavaファイルを独自のアプリsrcディレクトリにコピーしないでください。 Eclipseでダウンローダーライブラリをインポートし、export => gradle build filesを選択します。その後、ライブラリをモジュールとしてAndroid studio。

これについてはわかりませんが、Playストアからアプリを少なくとも1回ダウンロードし、テストデバイスのアカウントでアクセスできるようにする必要があると思います。したがって、アルファを使用している場合は、google +テストグループを作成し、自分自身または他のテストデバイスを追加します。

[〜#〜] btw [〜#〜]

これらのライブラリを使用すると、apk拡張ダウンロードの実装が非常に簡単になります:

  1. アクティビティ(ダウンロードが自動的に行われていないときに拡張パックのダウンロードを実装するアクティビティ)がIDownloaderClientを実装します。

  2. サービスとレシーバーをセットアップし、マニフェストでセットアップします。

  3. サービスクラスのBASE64_PUBLIC_KEYは正しいです。最初のapkをアップロード=>開発者コンソールのアプリの下のサービスとAPIを確認=>このアプリのライセンスコード.

このコードは、拡張ファイルがデバイスで見つかるかどうかを確認するために使用されます。

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

それは、特定のファイルサイズ(バイト)を持ち、apkバージョン(最初に追加されたもの)に関連付けられたメインファイルまたはパッチファイルのいずれかである拡張ファイルを表すクラスXAPKSを使用します。

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

また、Googleが提供するZipツール(com.Android.vending.zipfile)を使用して、拡張ファイルから直接ムービーファイルやその他のものを非常に簡単に読み取ることができます。

最初に、ライブラリで提供されるメソッドを使用して拡張ファイルを取得します。パラメーターは、メインの拡張apkバージョン(必要な拡張パックが最初に追加されたapkバージョン)とパッチapkバージョンを表す整数です。

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

ビデオ

このzipresourcefileから直接ビデオを再生する場合:

AssetFileDescriptor a = expansionFile.getAssetFileDescriptor(pathToFileInsideZip);

これで、このassetFileDescriptorからFileDescriptorを取得してメディアプレーヤーで使用できます。MediaPlayerでビデオを再生するための正しい構文には、2番目と3番目のパラメーターも必要です。

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

その他

他のすべてのもの(画像など)については、zipresourcefileの入力ストリームを取得できます。

expansionFile.getInputStream(pathToFileInsideZip);`

また、これが機能するように、Zipのビデオを圧縮しないでください。たとえば、.mp4ファイルを圧縮しない場合:

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

これを実装する過程で学んだことをいくつか追加したいだけです。

1)現時点では、ダウンローダーライブラリとすべてのXAPKFileを実装する必要はありません。必要なのは、 https://developer.Android.comにリストされているすべての権限をコピー/貼り付けするだけです/google/play/expansion-files.html をマニフェストファイルに追加します。以前は使用していたかもしれませんが、Google Playストアがダウンロードとインストールを自動的に処理します。ソースコードで実際のダウンロードを処理する必要があるのは、ユーザーが手動でAndroid/obbにアクセスして拡張ファイルを削除した場合のみです。

2).Zipファイルをアップロードするときに、main.version.package.obb規則に名前を付ける必要はありません。 .Zipファイルを元の名前でアップロードするだけで、名前は変更されます。

3)Zipファイルにアクセスするには、[ファイル]> [新規]> [モジュールのインポート]に移動し、ダウンローダーおよびライセンスライブラリと同じディレクトリにあるZip_fileライブラリをインポートします。アプリのbuild.gradleファイルの依存関係に必ず追加してください:compile project( ':Zip_file')。これにより、これらのライブラリをプロジェクトにインポートできます。

それがお役に立てば幸いです。基本的に、サイトにリストされている(複雑な)ダウンロードライブラリコードを実装しようとして数時間を費やし、最終的にすべてを削除し、マニフェストにアクセス許可を保持しただけで、正常に機能しました。

2
eric k atwood