Android - так много проблем с расширением библиотеки - PullRequest
17 голосов
/ 26 марта 2012

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

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

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

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

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

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

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

7. При выходе из загрузчика я получаю исключение из службы утечки.

8.При запутывании приложения происходит сбой из-за операций SQL, выполняемых через библиотеку. как и почему это? РЕДАКТИРОВАТЬ: это потому, что Google решил сделать некоторые операции отражения на части SQL (в файле "DownloadsDB.java"). чтобы исправить это, я попытался настроить proguard на игнорирование всей библиотеки (в любом случае, она с открытым исходным кодом), но это не сработало, поэтому я сам дал классы, которые он хочет, поэтому я заменил "DownloadsDB.class.getDeclaredClasses ()" на "new Class [] {MetadataColumns.class, DownloadColumns.class};" .

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

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


РЕДАКТИРОВАТЬ: кажется, 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();
  }
}

Ответы [ 2 ]

3 голосов
/ 18 апреля 2012

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

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

СейчасCRC работает для меня как шарм!

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

0 голосов
/ 01 мая 2012

Код не поддерживает проверку файлов 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;
        }
...