17

新しい Google Play (またはマーケット) 拡張ライブラリを使用する必要があり、苦労しています。他の誰かがそれを使用していて、私が見ることができるのと同じ問題に気付いているのではないかと思うので、それらを修正するのを手伝ってくれるととてもうれしいです:

1.重要なイベント (エラーなど) がダウンローダーのアクティビティに返されないことがあります。

2. xoom などの一部のデバイスではまったく機能しません。私はそれを修正したと思います: タブレットで拡張ファイルをダウンロード

3.同じデバイスであっても、一方がファイルをダウンロードでき、もう一方が常に接続エラーになる可能性があります。一部のデバイスでは、決してダウンロードできません (google-play アプリを持っているルート化されていないデバイスでも)。

4.ダウンロードが完了した後、ファイルが破損している可能性があるため、CRC チェックを使用して、すべてを再度ダウンロードする必要があります。

5.通知を押すと、ダウンローダ アクティビティの複数のインスタンスが開くことがあります。また、アクティビティがまだ表示されている場合に通知を残す理由がわかりません。

6.エラーが発生して後で処理されると、ユーザーが再開するように指示するのを待ちません。どのような場合に発生するかはわかりませんが、本当に奇妙で予測不可能です。

7. ダウンローダ アクティビティを終了すると、リーク サービスの例外が発生します。

8.アプリを難読化すると、ライブラリ経由で実行される SQL 操作が原因でアプリがクラッシュします。それはどうしてですか?EDIT:これは、GoogleがSQL部分(ファイル「DownloadsDB.java」内)でいくつかのリフレクション操作を行うことにしたためです。それを修正するために、ライブラリ全体を無視するようにproguardを設定しようとしました(とにかくオープンソースです)が、うまくいきませんでした。 「DownloadsDB.class.getDeclaredClasses()」を「new Class[] {MetadataColumns.class, DownloadColumns.class};」に置き換えました。.

ファイルをダウンロードして問題がないかどうかを確認するための単純な API を市場に送信するための単純な API を公開したり、はるかに複雑でないライブラリを提供したりすることができなかった理由がわかりません。複雑なため、バグを見つけて修正するのは非常に困難です。

私の質問は次のとおりです。他の誰かがこのライブラリを試しましたか?また、他の誰かが問題なく使用できましたか? もしそうなら、解決策を公開してください...


編集: Google がライブラリを (バージョン 2 に) 更新したようです。

彼らは次の変更を主張します。

  • リスト項目
  • パッチ ファイルがダウンロードされるようになりました。
  • ハニカム デバイスが ICS のような通知でサポートされるようになりました
  • CRC チェック (サンプルから) が圧縮された Zip ファイルをサポートするようになりました
  • 難読化を容易にするためにリフレクションの使用を削除
  • サービスリークが修正されました
  • ZipResourceFile から削除された印刷不能文字
  • マイナーなフォーマットの変更
  • このファイルへの追加のコメントと編集

私は今それをテストしました、そして、それらはほとんどそこにあるようです.

私が見つけた唯一のバグは、拡張ファイル (および APK&filesize&CRC) を更新すると、ダウンロードは開始されますが、古い拡張ファイルが削除されないことです。

また、通知には、ダウンロードに関連する可能性のあるものではなく、現在の時刻が表示されます。

今のところ、展開は 1 つしかないので、サービスから STATE_COMPLETED 状態を取得するたびに次のチェックを行います。他に問題がないことを願っています:

private void deleteOldExpansionFile()
{
  int fileVersion = 0;
  final int versionCode = App.getAppVersionCode(DownloaderActivity.this);
  fileVersion = versionCode;
  final String fileName = Helpers.getExpansionAPKFileName(this, true, fileVersion); //get the expansion file name based on the build version of the app.
  final File newFile = new File(Helpers.generateSaveFileName(this, fileName));
  final File[] listFiles = newFile.getParentFile().listFiles();
  for (final File file:listFiles)
  {
    final String name = file.getName();
    if (name.startsWith(fileName))
      continue;
    file.delete();
  }
}
4

2 に答える 2

3

. こんにちは !CRC Check Fail については、私もこの問題を経験しました。私にとってそれを解決したのは、拡張ファイルのアーカイブを7zipで、圧縮なしのzip形式で作成することでした(保存)。

このように: http://floy.fr/perso/floy/expfiles/crc.PNG

今、CRCは私にとって魅力のように機能しています!

私はあなたに同意します..このライブラリは使用するのが非常に苦痛です..

于 2012-04-18T11:31:49.987 に答える
0

このコードは、圧縮ファイルを含むZipファイルの検証をサポートしていません。ZipファイルのCRCを正しく検証するために、検証関数のdoInBackgroundループを置き換えます。Zipファイルに圧縮されて保存されたファイルからビデオ/オーディオ再生をストリーミングすることはできないことに注意してください。

        @Override
        protected Boolean doInBackground(Object... params) {
            for (XAPKFile xf : xAPKS) {
                String fileName = Helpers.getExpansionAPKFileName(SampleDownloaderActivity.this,
                        xf.mIsMain, xf.mFileVersion);
                if (!Helpers.doesFileExist(SampleDownloaderActivity.this, fileName,
                        xf.mFileSize, false))
                    return false;
                fileName = Helpers
                        .generateSaveFileName(SampleDownloaderActivity.this, fileName);
                ZipResourceFile zrf;
                byte[] buf = new byte[1024 * 256];
                try {
                    zrf = new ZipResourceFile(fileName);
                    ZipEntryRO[] entries = zrf.getAllEntries();
                    /**
                     * First calculate the total compressed length
                     */
                    long totalCompressedLength = 0;
                    for (ZipEntryRO entry : entries) {
                        totalCompressedLength += entry.mCompressedLength;
                    }
                    float averageVerifySpeed = 0;
                    long totalBytesRemaining = totalCompressedLength;
                    long timeRemaining;
                    /**
                     * Then calculate a CRC for every file in the
                     * Zip file, comparing it to what is stored in
                     * the Zip directory. Note that for compressed
                     * Zip files we must extract the contents to do
                     * this comparison.
                     */
                    for (ZipEntryRO entry : entries) {
                        if (-1 != entry.mCRC32) {
                            long length = entry.mUncompressedLength;
                            CRC32 crc = new CRC32();
                            DataInputStream dis = null;
                            try {
                                dis = new DataInputStream(
                                        zrf.getInputStream(entry.mFileName));

                                long startTime = SystemClock.uptimeMillis();
                                while (length > 0) {
                                    int seek = (int) (length > buf.length ? buf.length
                                            : length);
                                    dis.readFully(buf, 0, seek);
                                    crc.update(buf, 0, seek);
                                    length -= seek;
                                    long currentTime = SystemClock.uptimeMillis();
                                    long timePassed = currentTime - startTime;
                                    if (timePassed > 0) {
                                        float currentSpeedSample = (float) seek
                                                / (float) timePassed;
                                        if (0 != averageVerifySpeed) {
                                            averageVerifySpeed = SMOOTHING_FACTOR
                                                    * currentSpeedSample
                                                    + (1 - SMOOTHING_FACTOR)
                                                    * averageVerifySpeed;
                                        } else {
                                            averageVerifySpeed = currentSpeedSample;
                                        }
                                        totalBytesRemaining -= seek;
                                        timeRemaining = (long) (totalBytesRemaining / averageVerifySpeed);
                                        this.publishProgress(
                                                new DownloadProgressInfo(
                                                        totalCompressedLength,
                                                        totalCompressedLength
                                                                - totalBytesRemaining,
                                                        timeRemaining,
                                                        averageVerifySpeed)
                                                );
                                    }
                                    startTime = currentTime;
                                    if (mCancelValidation)
                                        return true;
                                }
                                if (crc.getValue() != entry.mCRC32) {
                                    Log.e(Constants.TAG,
                                            "CRC does not match for entry: "
                                                    + entry.mFileName);
                                    Log.e(Constants.TAG,
                                            "In file: " + entry.getZipFileName());
                                    return false;
                                }
                            } finally {
                                if (null != dis) {
                                    dis.close();
                                }
                            }
                        }
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                    return false;
                }
            }
            return true;
        }
于 2012-05-01T05:00:08.163 に答える