the play obb maximum google files checking birds angry and android download google-play expansion

android - maximum - play store apk obb



Android-tantos problemas con la biblioteca de expansión (2)

Necesito usar la nueva biblioteca de expansión de Google Play (o mercado) y tengo dificultades con eso. Me pregunto si alguien más lo está usando y me doy cuenta de los mismos problemas que puedo ver, así que me encantaría que lo ayudes a solucionarlo:

1. a veces no obtengo eventos importantes (errores, por ejemplo) de nuevo en la actividad del descargador.

2. no funciona en absoluto en algunos dispositivos, como xoom. Creo que lo he arreglado: descargar archivos de expansión en la tableta

3. Incluso para dispositivos idénticos, uno puede descargar el archivo y el otro siempre puede obtener un error de conexión. para algunos dispositivos, nunca podrá descargar (incluso los dispositivos no rooteados que tienen la aplicación Google-Play).

4. Después de que se complete la descarga, el archivo se puede corromper, así que necesito usar CRC check y volver a descargar todo de nuevo.

5. La notificación a veces abre múltiples instancias de la actividad del descargador al presionarla. Además, no entiendo por qué dejan la notificación en caso de que todavía se muestre la actividad.

6. Cuando se produce un error y luego se maneja, no espera que el usuario le diga que reanude. No estoy seguro de en qué casos ocurre, pero es realmente extraño e impredecible.

7. Después de abandonar la actividad del descargador, obtengo una excepción de un servicio de fugas.

8. Después de ofuscar la aplicación, se bloquea debido a las operaciones de SQL realizadas a través de la biblioteca. como y porque es eso EDIT: esto se debe a que Google decidió realizar algunas operaciones de reflexión en la parte de SQL (en el archivo "DownloadsDB.java"). Para solucionarlo, he intentado configurar Proguard para que ignore toda la biblioteca (de todas formas es de código abierto), pero no funcionó, así que lo que hice fue dar las clases que quiero por mí mismo, así que reemplazó "DownloadsDB.class.getDeclaredClasses ()" con "new Class [] {MetadataColumns.class, DownloadColumns.class};" .

simplemente no entiendo por qué no podría Google simplemente publicar una API simple para enviar un intento al mercado de descargar el archivo y comprobar si está bien, o proporcionar una biblioteca mucho menos compleja. Debido a la complejidad, es muy difícil encontrar y corregir sus errores.

Mi pregunta es: ¿Alguien más ha probado esta biblioteca y otra persona ha tenido éxito en usarla sin ningún problema? Si es así, por favor publique la solución ...

EDITAR: parece que Google ha actualizado su biblioteca (a la versión 2).

ellos reclaman los siguientes cambios:

  • Elemento de lista
  • El archivo de parche ahora se descarga.
  • Los dispositivos Honeycomb ahora son compatibles con notificaciones similares a ICS
  • La verificación CRC (de la muestra) ahora admite archivos comprimidos Zip
  • Uso del reflejo eliminado para permitir ofuscación fácil.
  • Fuga de servicio reparada
  • Carácter no imprimible eliminado de ZipResourceFile
  • Cambios menores de formato
  • Comentarios adicionales y ediciones a este archivo

Lo he probado ahora, y parece que ya casi están allí.

el único error que he encontrado es que si actualizo el archivo de expansión (y el APK y el tamaño de archivo y CRC), la descarga se inicia pero no elimina el archivo de expansión anterior.

Además, la notificación muestra la hora actual en lugar de, bueno, cualquier otra cosa que pueda estar relacionada con la descarga.

por ahora, ya que solo tengo una expansión, hago la siguiente verificación cada vez que obtengo el estado STATE_COMPLETED del servicio. Espero que no tenga ningún otro problema:

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(); } }


. Hola ! Para el CRC Check Fail, también he experimentado el problema. Lo que lo resolvió para mí fue hacer el archivo de mi archivo de expansión con 7zip, en formato zip sin ninguna compresión (tienda).

así: http://floy.fr/perso/floy/expfiles/crc.PNG

¡Ahora el CRC está trabajando como un encanto para mí!

Estoy de acuerdo contigo ... esta biblioteca es muy dolorosa de usar ...


El código no admite la validación de archivos Zip que contienen archivos comprimidos. Reemplace el bucle doInBackground de la función de validación para que valide los CRC en archivos Zip correctamente. Tenga en cuenta que no puede transmitir video / audio desde archivos almacenados comprimidos en archivos 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; }