Android - так много проблем с библиотекой расширения - программирование
Подтвердить что ты не робот

Android - так много проблем с библиотекой расширения

Мне нужно использовать новую библиотеку расширения google-play (или рынка), и мне сложно с ней работать. я задаюсь вопросом, использует ли кто-нибудь еще его и замечает те же проблемы, которые я вижу, поэтому я был бы очень рад, если бы вы могли помочь исправить их:

1. Иногда я не получаю важные события (например, ошибки) обратно к активности загрузчика.

2.it не работает вообще на некоторых устройствах, таких как xoom. я думаю, я исправил это: Загрузить файлы расширений на планшете

3. Даже для идентичных устройств можно загрузить файл, а другой может всегда получать ошибку соединения. для некоторых устройств он никогда не сможет скачивать (даже не-корневые устройства, у которых есть приложение для игры в Google).

4.После завершения загрузки файл может быть поврежден, поэтому мне нужно снова проверить CRC и повторно загрузить все.

5.notification иногда открывает несколько экземпляров активности загрузчика при нажатии. Кроме того, я не понимаю, почему они оставляют уведомление в случае, если активность все еще отображается.

6. При возникновении ошибки и последующей обработке она не ждет, пока пользователь скажет ей возобновить. я не уверен, в каких случаях это происходит, но это действительно странно и непредсказуемо.

7.upon, оставляя активность загрузчика, я получаю исключение из протекающей службы.

8. запутывание приложения с помощью функции 8.upout происходит сбой из-за операций SQL, выполняемых через библиотеку. как и почему? EDIT: это потому, что Google решил сделать некоторые операции отражений на части SQL (в файле "DownloadsDB.java" ). чтобы исправить это, я попытался установить proguard, чтобы игнорировать всю библиотеку (она все равно открыта), но это не сработало, поэтому я сделал, чтобы дать классы, которые он хочет сам, так что я заменил "DownloadsDB.class.getDeclaredClasses()" на "новый класс [] {MetadataColumns.class, DownloadColumns.class};.

Я просто не понимаю, почему Google не мог просто опубликовать простой API, чтобы отправить намерение на рынок загрузить файл и проверить, нормально ли оно, или предоставить гораздо менее сложную библиотеку. из-за сложности, очень сложно найти и исправить свои ошибки.

Мой вопрос: кто-нибудь еще пробовал эту библиотеку, и кто-то еще успешно использовал его без каких-либо проблем? если это так, пожалуйста, опубликуйте решение...


EDIT: похоже, Google обновила свою библиотеку (до версии 2).

они заявляют о следующих изменениях:

  • Элемент списка
  • Патч файл теперь загружается.
  • Сотовые устройства теперь поддерживаются уведомлениями, подобными ICS
  • Проверка CRC (из примера) теперь поддерживает сжатые Zip файлы
  • Использование снятого отражения для облегчения обфускации
  • Устранена утечка службы
  • Непечатаемый символ удаляется из ZipResourceFile
  • Незначительные изменения форматирования.
  • Дополнительные комментарии и изменения к этому файлу

Я протестировал его сейчас, и кажется, что они почти там.

Единственная ошибка, которую я обнаружил, заключается в том, что если я обновляю файл расширения (и APK & filesize & CRC), загрузка начинается, но она не удаляет старый файл расширения.

также в уведомлении отображается текущее время, а не все, что может быть связано с загрузкой.

так как у меня есть только одно расширение, я делаю следующую проверку каждый раз, когда я получаю состояние 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();
  }
}
4b9b3361

Ответ 1

. Здравствуйте! Для проверки CRC Check Fail у меня тоже возникла проблема. То, что разрешило это для меня, было сделать архив моего файла расширения с 7zip в формате zip без сжатия вообще (store).

вот так: http://floy.fr/perso/floy/expfiles/crc.PNG

Теперь CRC работает как прелесть для меня!

Я согласен с тобой.. эта библиотека очень болезненна для использования.

Ответ 2

Код не поддерживает проверку файлов Zip, содержащих сжатые файлы. Замените цикл doInBackground из функции проверки, чтобы проверить правильность CRC в файлах Zip. Обратите внимание: вы не можете воспроизводить видео/аудиовоспроизведение из файлов, хранящихся в 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;
        }