10

私はGoogleからのAPK拡張ファイルダウンロードライブラリを私のプロジェクトに統合しました、そしてそれは多かれ少なかれうまくいきます(すでにSOで他の人によって報告されたいくつかのマイナーな落とし穴を除いて)。

しかし、私はそれをテストするのに苦労しています。最初にテストしたとき、署名したAPK+メイン拡張ファイルバージョン1をGooglePlayにアップロードしましたが、うまく機能しました。

ただし、メインの拡張ファイルバージョン2と一緒にアプリケーションをアップグレードすると、アプリケーションはファイルをダウンロードできなくなりました。ライブラリはすぐにNO_DOWNLOAD_REQUIREDで返されますが、ファイルはありません。LVLチェックパスのデバッグを開始しましたが、ダウンロード可能なファイルのテーブルが空でした。詳細をデバッグしようとしていたときに...突然再び機能し始めました!

これは一種の一時的な不具合であると想定し、APKと拡張ファイルを再度更新した後、同じ問題が再び発生するように作業を続けました。アプリケーションはLVLチェックに合格しますが、ライブラリはダウンロードするファイルがないと想定します。

Googleのライブラリの既知の問題ですか?または、ファイルがGoogleのクラウドで利用可能になるまでしばらく待つ必要がありますか?

編集:それはちょうどうまく働き始めました。ファイルがどういうわけかGoogle側に伝播するのに少し時間がかかるようです。ライブラリの悪い点の1つは、ライセンスを検証すると、ダウンロードリストを再度チェックすることがないため、アプリを再インストールする必要があったことです。奇妙な...なぜそれはとても複雑なのですか?

4

4 に答える 4

17

スレッドのネクロマンシーは少しありますが、OBBのダウンロードを機能させるのに非常に苦労したので、すべての問題を1か所にまとめたかったのです。グーグルがインターネットからファイルをダウンロードすることをなんとかして、これほど複雑なことは私を超えています。

AndroidStudioへのライブラリの追加

誤った情報の省( https://developer.android.com/google/play/expansion-files.html )によって誇らしげにあなたにもたらされた公式の指示は単に間違っています。

ライブラリをインポートする前に、sdk \ extras \ google \ market_apk_expansion \ downloader_libraryに移動し、project.propertiesを編集して、「android.library.0」行を完全に削除します。また、既存のプロジェクトのターゲットバージョンと一致するように、同じファイルのandroidターゲットバージョン行を更新する必要がある場合もあります。

上記のリンク先のページにあるインストール手順に従って、「ダウンローダーライブラリを使用するための準備」ステップ2は、「ファイル>新規>新しいモジュール」ではなく「ファイル>新規>インポートモジュール」である必要があります。

両方のモジュールをインポートした後、[ファイル]> [プロジェクト構造]に移動し、依存関係を追加します。

  • アプリには、ライセンスライブラリとダウンローダーライブラリの両方に「モジュール依存関係」が必要です
  • ダウンローダーライブラリには、ライセンスライブラリに対する「モジュール依存関係」が必要です。

「BASE64_PUBLIC_KEY値を更新して、発行元アカウントに属する公開鍵にする必要があります」という手順。また間違っています。アカウントではなく、この特定のアプリの公開鍵が必要です。この公開鍵は、アプリを選択した後、オンラインの開発者コンソールの[サービスとAPI]の下にあります。

ライセンス検証ライブラリとダウンローダーライブラリはどちらも、削除されたパッケージ「org.apache.http」に依存しています。

「decodeExtras」メソッドの2つのインスタンス(APKExpansionPolicy.javaに1つ、ServerManagedPolicy.javaに1つ)を次のように置き換えます。

private Map<String, String> decodeExtras(String extras) {
    Map<String, String> results = new HashMap<String, String>();

    UrlQuerySanitizer sanitizer = new UrlQuerySanitizer();
    sanitizer.setAllowUnregisteredParamaters(true);
    sanitizer.setUnregisteredParameterValueSanitizer(new UrlQuerySanitizer.IllegalCharacterValueSanitizer(
            UrlQuerySanitizer.IllegalCharacterValueSanitizer.URL_LEGAL));
    sanitizer.parseQuery(extras);

    for (UrlQuerySanitizer.ParameterValuePair item : sanitizer.getParameterList()) {
        String name = item.mParameter;
        int i = 0;
        while (results.containsKey(name)) {
            name = item.mParameter + ++i;
        }
        results.put(name, item.mValue);
    }

    return results;
}

「サービスインテントは明示的でなければならない」と言って実行時にクラッシュする

https://stackoverflow.com/questions/24480069で回答を参照してください。

W / LicenseValidator:ライセンスサーバーへの接続中にエラーが発生しました

ライセンス検証ライブラリはエミュレータでは機能しません。これは、エミュレータがスローするエラーです。実際のデバイスを使用している場合は、本物のタイムアウトである可能性があります。

デバッグバージョンは署名チェックに失敗するため(署名検証に失敗)、アクセスが拒否されます。

ライセンス検証サービスを呼び出しているバイナリは、正しく署名されたリリースバージョンである必要があります。そうではないデバッグコピーを実行している場合、ライセンスチェックは失敗します。

  • オンラインの開発者コンソール、設定、アカウントの詳細に移動します
  • 「LicenseTestResponse」を「LICENSED」(またはテストしているもの)に変更します
  • [アクセスをテストするGmailアカウント]にメールアドレスを入力します。

ダウンローダーは「STATE_COMPLETED」を返しますが、ダウンロードは行われません。

これは、前の変更の副作用です。ライセンスは付与されていますが、実際にはライセンスが付与されていないため、APK拡張ファイルはまだ提供されていません。この手順により、ファイルをテストデバイスに手動で配置する代わりに、配布後にダウンロードが発生したときに実際にダウンロードをテストできます。

  • アプリのプロモーションコードを作成します。
  • まったく新しいGMailアカウント用に、デバイスに新しいユーザーを作成します。
  • 新しいユーザーとしてデバイスにログインし、プロモーションコードを利用します。これで、本物のアプリの所有者になりました。
  • 前のセクションと同様に、[アクセスをテストするGmailアカウント]の下に新しいGmailアカウントを追加します。

購入または引き換えが失敗するため、開発者のアカウントでこれを行うことはできません。つまり、自分の製品のコピーを所有することはできません。つまり、OBBのダウンロードは機能しません。

アプリの本物のPlayストアコピーを持ち、「偽の」LICENSEDステータスのテストアカウントとして登録されている2番目のアカウントがあるので、コードのデバッグコピーを実行し、LICENSEDステータスを取得し、ダウンロードは期待どおりに機能します。

W / LVLDL:ダウンロードwhavever .obbの要求を中止します:宛先ファイルの書き込み中:java.io.FileNotFoundException:

Android v23以降、SDカードであるかどうかに関係なく、マニフェストにアクセス許可がリストされていることに加えて、「外部ストレージ」に書き込むためのアクセス許可を明示的に要求する必要がありました。https://developer.android.com/guide/topics/permissions/requesting.htmlを参照してください。

「ファイルが見つかりません」とは、ダウンローダーライブラリがOBBファイルを配置する外部ストレージ上のディレクトリを指しますが、作成できませんでした。ファイルを作成できない場合は例外が発生しますが、ディレクトリを作成できない場合はサイレントに失敗します。processResponseHeaders()DownloadThread.javaを参照してください。

W / LVLDL:ダウンロードメインのリクエストを中止します。.obb:httpエラー410

アプリのバージョン番号は、Googleが認識している現在のAPKのバージョン番号と一致する必要があります。一致しない場合、ダウンロードリクエストはエラー410で拒否されます。

一度有効であることが判明した場合、ライブラリはライセンスを再チェックしません。

テストしている場合は、数回やり直す必要がある可能性があります。ライセンス検証ライブラリは、ライセンスが検出された後の状態をキャッシュします。アプリを完全にアンインストールせずにこれをクリアできます。

DownloadsDB db = DownloadsDB.getDB(my_app_context);
db.updateMetadata(0, 0);

また、ダウンロードしたOBBを所定の位置に保持します。これは、次を使用して検索およびクリアできます。

final String dlName = Helpers.getExpansionAPKFileName(my_app_context, true, expansionVersion);
final String dlFullPath = Helpers.generateSaveFileName(my_app_context, dlName);
File dlFile = new File(dlFullPath);
if (dlFile.exists())
{
    dlFile.delete();
}

さて、失礼しますが、私は一ヶ月かそこらの精神的な隠れ家に行きます。

于 2016-12-30T17:06:32.783 に答える
7

APK +拡張ワークフローには、作成者が説明した伝播時間の他に、直感的で文書化されていない他の落とし穴があります。

  1. APK versionCodeを増やしますが、同じ(古い)拡張ファイルを使い続けます。新しいAPKを開発者コンソールにアップロードしないと、更新されたアプリ(adbを使用して直接インストールされた)からのダウンロードが機能しないようです。「リソースが見つからなかったため、ダウンロードに失敗しました」というエラーメッセージも役に立ちません。私には、Googleが「わかりました。この拡張ファイルのバージョンについては知っていますが、このアプリのバージョンについては知りません」と言っているように見えます。現在のドキュメントでは、この要件への参照は見つかりませんでした。

  2. 開発者コンソールにアップロードされた新しいAPKは、古いAPKから拡張ファイルの関連付けを「キャプチャ」しているようです。例:新しいAPKを削除すると(ただし、拡張と同じバージョンの古いAPKは保持されます)、拡張ファイルも削除されたように見えます。おそらく彼らは、ワークフローが「拡張を新しいAPKに関連付ける必要があるので、開発者は問題なく古いAPKを自由に消去できる」と考えていました。それでも、これはどこにも説明されていないように見える別の落とし穴です。

これらは予備的な注記です。私はこれらの調査結果を確認する可能性のあるサポートリクエストを送信したので、(もし?)彼らが返信したときにここに更新を投稿します...

于 2013-03-10T17:56:19.153 に答える
0

拡張ファイルを取得するための2つの標準的な方法があります(仮定としてそれを取ることができます)。

  1. アプリケーションの起動時に、最初に拡張ファイルがないとします。
  2. ファイルがに存在するかどうかを確認してくださいobvious location

このようにして、アプリは通常どおりに動作します。このアプローチの最良の部分は、ファイルのダウンロードを要求するオプションがあることです。

これらは開発者サイトからのメモです。

Note: The URL that Google Play provides for your expansion files is unique for every download and each one expires shortly after it is given to your application.

Note: Whether your application is free or not, Google Play returns the expansion file URLs only if the user acquired your application from Google Play.

使用方法は
こちらダウンロードリクエストの送信方法はこちら

これが結果を得るのに役立つことを願っています。

于 2012-09-25T07:05:23.717 に答える
0

サンプルアプリの完全なコードを使用している場合は、以下のコードのバージョンコードを変更しましたか?-

private static final XAPKFile[] xAPKS = {
        new XAPKFile(
                true, // true signifies a main file
                <Version code here>, // the version of the APK that the file was uploaded
                   // against
                49597391L // the length of the file in bytes
        ),

};
于 2013-11-15T14:58:46.007 に答える