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();
}
}
Ответы
Ответ 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;
}