Toon posts:

[Android] DownloadManager download error WAITING_TO_RETRY

Pagina: 1
Acties:

Vraag


  • arjan1995
  • Registratie: Augustus 2011
  • Laatst online: 30-05 14:19
Mijn vraag
Bij mijn Android App, Oxygen Updater, lopen gebruikers sinds de laatste tijd massaal tegen het probleem aan dat downloads halverwege opnieuw worden gestart en hierdoor niet worden afgerond. Dit is frustrerend, kost veel data en zou niet mogen voorkomen (tenzij de verbinding van de gebruiker daadwerkelijk wegvalt).

Doel van dit topic
Met dit topic zou ik graag willen zorgen dat dit probleem wordt opgelost, ofwel via een nieuwe release van mijn app, danwel via een configuratie-oplossing die gebruikers moeten doorvoeren. Uiteraard wat dit probleem het beste oplost.

Relevante software en hardware die ik gebruik
- De app is ontwikkeld met de officiële Android SDK, de productieversie van de app target momenteel Android Oreo (API level: 28). Een update van de targetSDKVersion naar Android Pie (API level: 29) staat gepland maar lost dit probleem niet op.
- Android Studio 3.2.1 (nieuwste)
...

Wat ik al gevonden of geprobeerd heb
- Het herstarten komt omdat de DownloadManager API van het OS de volgende code afgeeft:

PAUSED_WAITING_TO_RETRY

De oorzaak hiervan staat waarschijnlijk in het volgende stukje logging:

09-21 17:45:00.956 18538-18649/? W/DownloadManager: [152] Stop requested with status HTTP_DATA_ERROR: Failed reading response: java.net.ProtocolException: unexpected end of stream
09-21 17:45:00.958 18538-18649/? D/DownloadManager: [152] Finished with status WAITING_TO_RETRY
09-21 17:45:47.253 18538-18686/? D/DownloadManager: [152] Starting
09-21 17:45:50.485 18538-18686/? D/DownloadManager: [152] Finished with status SUCCESS

"unexpected end of stream".

Maar: Waarom wordt die stream meerdere keren achter elkaar in mijn app geclosed? Terwijl eenzelfde gebruiker dezelfde URL wel met Chrome op zijn telefoon kan downoaden?

Voorbeeld URL die dit probleem heeft:
http://otafsc1.h2os.com/patch/amazone2/GLO/OnePlus2Oxygen/OnePlus2Oxygen_14.A.32_GLO_032_1710240102/OnePlus2Oxygen_14_OTA_031-032_patch_1710240102_88168229b9163dd.zip

Hieruit heb ik al zelf opgemaakt:
- De downloadlink is HTTP, dus het kan geen SSL of certificate fout zijn.
- De SDK website zegt hier niets over hoe je dit kan fixen
- Op StackOverflow werd als suggestie gegeven om de header Accept-Encoding: Identity toe te voegen. Dit maakt geen verschil

...

[Voor 1% gewijzigd door Creepy op 24-10-2018 09:39]

Beste antwoord (via arjan1995 op 08-11-2018 08:11)


  • P1nGu1n
  • Registratie: Juni 2011
  • Laatst online: 11:14

P1nGu1n

Developer

arjan1995 schreef op woensdag 24 oktober 2018 @ 13:45:
@P1nGu1n Ik ga daar zeker naar kijken, bedankt alvast voor je tips ;)

De operating_system_version is inderdaad de huidige OS versie. Versie 025 is inderdaad Oxygen OS 9.0 (dus ze proberen 9.0.1 te downloaden).

Maar toen 9.0 net uitkwam kreeg ik ook heel veel meldingen van mensen waarbij het downloaden mislukte (dus vanaf Android 8.x / Oxygen 5.x).
Graag gedaan, laat maar hier weten als je wat verder komt of vragen hebt :)

Ik heb nog wel de bron van de exception achterhaald: OkHttp. Dit is wat de Download manager onderwater blijkbaar gebruikt, om precies te zijn versie 2.7.5 (en die versie is ook gewoon op GitHub te vinden)

Deze specifieke exception wordt 3x opgegooid in Http1xStream: in de inner classses FixedLengthSink, FixedLengthSource en ChunkedSource

Als je dan gaat kijken naar het gebruik van die classes, zie je dat FixedLengthSink alleen wordt gebruikt voor request bodies, dus die kunnen we al wegstrepen. Zowel FixedLengthSource als ChunkedSource worden gebruikt voor response bodies. Het verschil is dat ChunkedSource wordt gebruikt als de response header "Transfer-Encoding" de waarde "chunked" heeft.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ curl -I -X GET http://otafsg1.h2os.com/patch/amazone2/GLO/OnePlus6Oxygen/OnePlus6Oxygen_22.O.26_GLO_026_1810042052/OnePlus6Oxygen_22_OTA_026_all_1810042052_42cba05cbb1e84.zip
HTTP/1.1 200 OK
Accept-Ranges:  none
Cache-Control: max-age=2592000
Content-Type: application/octet-stream
Date: Wed, 24 Oct 2018 12:33:00 GMT
Etag: "d753a87f581dcd82ec5f909887647f28-305"
Expires: Fri, 23 Nov 2018 12:33:00 GMT
Last-Modified: Tue, 09 Oct 2018 00:55:14 GMT
Server: ECAcc (amb/6B45)
x-amz-id-2: ExxESpyDYMgqP1ZwE3YM5mWyTKs8trs1hAjJ1COlgXlUzB/SnSLf+Fo+6AXaiNYH7pzWW2UHcys=
x-amz-request-id: 1C543A568530BEEB
X-Cache: HIT
Content-Length: 1595827787

Deze header is niet aanwezig. Conclusie, deze exception wordt opgegooid in FixedLengthSource, om de volgende rede:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@Override public long read(Buffer sink, long byteCount) throws IOException {
    if (byteCount < 0) throw new IllegalArgumentException("byteCount < 0: " + byteCount);
    if (closed) throw new IllegalStateException("closed");
    if (bytesRemaining == 0) return -1;

    long read = source.read(sink, Math.min(bytesRemaining, byteCount));
    if (read == -1) {
        unexpectedEndOfInput(); // The server didn't supply the promised content length.
        throw new ProtocolException("unexpected end of stream");
    }
    bytesRemaining -= read;
    if (bytesRemaining == 0) {
        endOfInput();
    }
    return read;
}

Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live.

Alle reacties


  • AnonymousWP
  • Registratie: April 2014
  • Niet online

AnonymousWP

Medewerker van Oxygen Updater

Misschien dat @P1nGu1n dit weet? Sorry voor de tag, maar ik weet toevallig dat jij Android-developer bent. :p

Medewerker van Oxygen Updater: discord.gg/5TXdhKJ


  • P1nGu1n
  • Registratie: Juni 2011
  • Laatst online: 11:14

P1nGu1n

Developer

Hmm, ik heb niet direct een idee. Op internet (StackOverflow, Google's issue tracker, Github, etc.) is er ook niet veel over te vinden. In de OkHttp issues zegt swankjessie dat mogelijk "The client isn't reading fast enough so the server truncates the response". In Google's issue tracker staat hetzelfde probleem, zonder oplossing, maar met reproduceerbaar scenario, misschien dat dat je kan helpen.

Is de app open source trouwens?

Heb je wat meer analytics, bijvoorbeeld:
  • Komt het alleen voor bij bepaalde Android versies
  • Treedt het bij specifieke merken op (in dit geval niet relevant denk ik, ik gok 100% OnePlus... :P)
  • Treedt het bij specifieke modellen op
  • Komt het alleen voor bij bepaalde ROMs (OxygenOS versie X, LineageOS X, etc.)
  • Is het begonnen na een bepaalde app versie (en was in die versie bijvoorbeeld de targetSdk veranderd)
  • Gebeurt het alleen als het scherm uit staat, of ook aan
  • Komt het voor bij zowel Wi-Fi als mobiel internet
Misschien dat je zo een patroon kan ontdekken, om vast te stellen waar het probleem zit. Mijn gevoel zegt dat het iets met doze/background limitations kan zijn. Helaas heb ik niet direct een oplossing voor je, maar ik probeer mee te denken, misschien dat je aan deze tips wat hebt.
AnonymousWP schreef op woensdag 24 oktober 2018 @ 02:31:
Misschien dat @P1nGu1n dit weet? Sorry voor de tag, maar ik weet toevallig dat jij Android-developer bent. :p
Geen probleem, ik vind het leuk als je me tagged in Android development/root/rom vragen, gewoon doen! :D

Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live.


  • arjan1995
  • Registratie: Augustus 2011
  • Laatst online: 30-05 14:19
Het lijkt vooral bij de OnePlus 6 te spelen, maar die heeft ook als enige een recente OS-update gehad, dus daar zijn veel mensen voor aan het downloaden.

Hieronder een lijstje van versies waarbij dit probleem sinds zondag (app versie 2.4.8) is opgetreden. Daarvoor hield ik dit niet bij.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
MariaDB [oxygen_updater]> select count(*), operating_system_version from  app_log where device_is_supported = true and error_message like '%WAITING_TO_RETRY%' group by operating_system_version;
+----------+--------------------------------------------+
| count(*) | operating_system_version                   |
+----------+--------------------------------------------+
|        7 | OnePlus3Oxygen_16.A.66_GLO_066_1807192301  |
|        7 | OnePlus3Oxygen_16.A.67_GLO_067_1808161433  |
|       18 | OnePlus3Oxygen_16.A.68_GLO_068_1809142124  |
|        1 | OnePlus3Oxygen_16.X.56_GLO_056_1807041934  |
|        2 | OnePlus3Oxygen_86.A.22_GLO_011_1607052050  |
|        3 | OnePlus3TOxygen_28.A.51_GLO_051_1704112011 |
|        1 | OnePlus3TOxygen_28.A.57_GLO_057_1710122300 |
|        1 | OnePlus3TOxygen_28.A.66_GLO_066_1807192258 |
|        4 | OnePlus3TOxygen_28.A.67_GLO_067_1808161449 |
|       30 | OnePlus3TOxygen_28.A.68_GLO_068_1809150204 |
|        9 | OnePlus3TOxygen_28.X.56_GLO_056_1807041932 |
|       53 | OnePlus5Oxygen_23.J.38_GLO_038_1808082017  |
|        4 | OnePlus5Oxygen_23.O.19_GLO_019_1710311604  |
|        4 | OnePlus5Oxygen_23.O.20_GLO_020_1712052226  |
|        1 | OnePlus5Oxygen_23.O.36_GLO_036_1806131715  |
|        2 | OnePlus5Oxygen_23.T.19_GLO_019_1808290141  |
|        4 | OnePlus5Oxygen_23.T.21_GLO_021_1809201249  |
|       49 | OnePlus5Oxygen_23.T.22_GLO_022_1810102009  |
|        1 | OnePlus5Oxygen_23.U.03_GLO_003_1711281620  |
|       35 | OnePlus5TOxygen_43.J.38_GLO_038_1808082017 |
|        1 | OnePlus5TOxygen_43.O.04_GLO_004_1711152324 |
|        4 | OnePlus5TOxygen_43.O.06_GLO_006_1712062242 |
|        5 | OnePlus5TOxygen_43.T.19_GLO_019_1808290116 |
|        2 | OnePlus5TOxygen_43.T.21_GLO_021_1809201145 |
|        4 | OnePlus5TOxygen_43.T.22_GLO_022_1810102008 |
|        1 | OnePlus5TOxygen_43.X.10_GLO_010_1804112056 |
|        3 | OnePlus6Oxygen_21.D.03_GLO_003_1806151557  |
|        1 | OnePlus6Oxygen_21.D.03_GLO_003_1807141357  |
|        6 | OnePlus6Oxygen_22.O.09_GLO_009_1805172226  |
|        1 | OnePlus6Oxygen_22.O.12_GLO_012_1806140300  |
|        7 | OnePlus6Oxygen_22.O.13_GLO_013_1807130145  |
|        9 | OnePlus6Oxygen_22.O.15_GLO_015_1808102118  |
|     1588 | OnePlus6Oxygen_22.O.25_GLO_025_1809150101  |
|       51 | OnePlus6Oxygen_22.O.26_GLO_026_1810042052  |
|       33 | OnePlus6Oxygen_22.W.10_GLO_010_1809290017  |
|       40 | OnePlus6Oxygen_22.W.12_GLO_012_1810121931  |
+----------+--------------------------------------------+
36 rows in set (2.32 sec)

  • P1nGu1n
  • Registratie: Juni 2011
  • Laatst online: 11:14

P1nGu1n

Developer

arjan1995 schreef op woensdag 24 oktober 2018 @ 13:10:
Het lijkt vooral bij de OnePlus 6 te spelen, maar die heeft ook als enige een recente OS-update gehad, dus daar zijn veel mensen voor aan het downloaden.

Hieronder een lijstje van versies waarbij dit probleem sinds zondag (app versie 2.4.8) is opgetreden. Daarvoor hield ik dit niet bij.

[...]
Vooral bij de OP6 dus. Het probleem treedt dus alleen op bij OxygenOS 9.0 (Android 9.0), en niet bij OxygenOS 5.x (dus Android 8.0)? Ter bevestiging, de 'operating_system_version' kolom is de huidige OS versie, niet de versie die de gebruiker wil downloaden, toch?

offtopic:
Ik draai zelf LineageOS 15.1 (Android 8.1) op mijn OP3, dus de versienummers van OxygenOS zeggen me niet zoveel meer. :P

Heb je al gekeken naar de andere punten die ik aanhaalde?
Kan je het zelf reproduceren trouwens, of zie je het alleen maar terug in je logs?

[Voor 5% gewijzigd door P1nGu1n op 24-10-2018 13:30]

Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live.


  • arjan1995
  • Registratie: Augustus 2011
  • Laatst online: 30-05 14:19
@P1nGu1n Ik ga daar zeker naar kijken, bedankt alvast voor je tips ;)

De operating_system_version is inderdaad de huidige OS versie. Versie 025 is inderdaad Oxygen OS 9.0 (dus ze proberen 9.0.1 te downloaden).

Maar toen 9.0 net uitkwam kreeg ik ook heel veel meldingen van mensen waarbij het downloaden mislukte (dus vanaf Android 8.x / Oxygen 5.x).

Acties:
  • Beste antwoord
  • +2Henk 'm!

  • P1nGu1n
  • Registratie: Juni 2011
  • Laatst online: 11:14

P1nGu1n

Developer

arjan1995 schreef op woensdag 24 oktober 2018 @ 13:45:
@P1nGu1n Ik ga daar zeker naar kijken, bedankt alvast voor je tips ;)

De operating_system_version is inderdaad de huidige OS versie. Versie 025 is inderdaad Oxygen OS 9.0 (dus ze proberen 9.0.1 te downloaden).

Maar toen 9.0 net uitkwam kreeg ik ook heel veel meldingen van mensen waarbij het downloaden mislukte (dus vanaf Android 8.x / Oxygen 5.x).
Graag gedaan, laat maar hier weten als je wat verder komt of vragen hebt :)

Ik heb nog wel de bron van de exception achterhaald: OkHttp. Dit is wat de Download manager onderwater blijkbaar gebruikt, om precies te zijn versie 2.7.5 (en die versie is ook gewoon op GitHub te vinden)

Deze specifieke exception wordt 3x opgegooid in Http1xStream: in de inner classses FixedLengthSink, FixedLengthSource en ChunkedSource

Als je dan gaat kijken naar het gebruik van die classes, zie je dat FixedLengthSink alleen wordt gebruikt voor request bodies, dus die kunnen we al wegstrepen. Zowel FixedLengthSource als ChunkedSource worden gebruikt voor response bodies. Het verschil is dat ChunkedSource wordt gebruikt als de response header "Transfer-Encoding" de waarde "chunked" heeft.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ curl -I -X GET http://otafsg1.h2os.com/patch/amazone2/GLO/OnePlus6Oxygen/OnePlus6Oxygen_22.O.26_GLO_026_1810042052/OnePlus6Oxygen_22_OTA_026_all_1810042052_42cba05cbb1e84.zip
HTTP/1.1 200 OK
Accept-Ranges:  none
Cache-Control: max-age=2592000
Content-Type: application/octet-stream
Date: Wed, 24 Oct 2018 12:33:00 GMT
Etag: "d753a87f581dcd82ec5f909887647f28-305"
Expires: Fri, 23 Nov 2018 12:33:00 GMT
Last-Modified: Tue, 09 Oct 2018 00:55:14 GMT
Server: ECAcc (amb/6B45)
x-amz-id-2: ExxESpyDYMgqP1ZwE3YM5mWyTKs8trs1hAjJ1COlgXlUzB/SnSLf+Fo+6AXaiNYH7pzWW2UHcys=
x-amz-request-id: 1C543A568530BEEB
X-Cache: HIT
Content-Length: 1595827787

Deze header is niet aanwezig. Conclusie, deze exception wordt opgegooid in FixedLengthSource, om de volgende rede:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@Override public long read(Buffer sink, long byteCount) throws IOException {
    if (byteCount < 0) throw new IllegalArgumentException("byteCount < 0: " + byteCount);
    if (closed) throw new IllegalStateException("closed");
    if (bytesRemaining == 0) return -1;

    long read = source.read(sink, Math.min(bytesRemaining, byteCount));
    if (read == -1) {
        unexpectedEndOfInput(); // The server didn't supply the promised content length.
        throw new ProtocolException("unexpected end of stream");
    }
    bytesRemaining -= read;
    if (bytesRemaining == 0) {
        endOfInput();
    }
    return read;
}

Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live.


  • arjan1995
  • Registratie: Augustus 2011
  • Laatst online: 30-05 14:19
Even een korte update: het probleem doet zich nog steeds voor. Ik heb - wanneer dit optreedt - een pop-up toegevoegd zodat gebruikers het bestand alsnog via de browser kunnen downloaden.

Maar omdat OnePlus zijn update-API heeft gewijzigd en de JSON body daarvan heeft encrypted , is de toekomst van de app onzeker. Er kunnen nu namelijk niet meer automatisch updates worden toegevoegd en handmatig toevoegen is voor mij teveel werk.

Het downloadprobleem gaat daarom (voorlopig) niet meer worden opgelost.

  • P1nGu1n
  • Registratie: Juni 2011
  • Laatst online: 11:14

P1nGu1n

Developer

arjan1995 schreef op donderdag 8 november 2018 @ 08:09:
Even een korte update: het probleem doet zich nog steeds voor. Ik heb - wanneer dit optreedt - een pop-up toegevoegd zodat gebruikers het bestand alsnog via de browser kunnen downloaden.

Maar omdat OnePlus zijn update-API heeft gewijzigd en de JSON body daarvan heeft encrypted , is de toekomst van de app onzeker. Er kunnen nu namelijk niet meer automatisch updates worden toegevoegd en handmatig toevoegen is voor mij teveel werk.

Het downloadprobleem gaat daarom (voorlopig) niet meer worden opgelost.
-O-

Het is niet mogelijk dit te decrypten?

Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live.


  • arjan1995
  • Registratie: Augustus 2011
  • Laatst online: 30-05 14:19
P1nGu1n schreef op donderdag 8 november 2018 @ 08:19:
[...]


-O-

Het is niet mogelijk dit te decrypten?
Heb inmiddels wel in hun code gekeken via JD-gui en ApkTool (SMALI), maar deze code is zeer slecht leesbaar en er zitten random variabelen in (AES padding), waardoor het voor mij erg lastig wordt. Ook lijkt me het me niet legaal om dit te decrypten.

Daarnaast: ik heb persoonlijk gezien niet zoveel zin meer om veel tijd in de app te steken, omdat ik het al erg druk heb met mijn werk en andere interesses.

Mochten er toch ontwikkelingen op dit gebied zijn en ik het probleem heb kunnen oplossen, dan laat ik het uiteraard weten!

[Voor 23% gewijzigd door arjan1995 op 13-11-2018 20:30. Reden: Correctie]

Pagina: 1


Tweakers maakt gebruik van cookies

Tweakers plaatst functionele en analytische cookies voor het functioneren van de website en het verbeteren van de website-ervaring. Deze cookies zijn noodzakelijk. Om op Tweakers relevantere advertenties te tonen en om ingesloten content van derden te tonen (bijvoorbeeld video's), vragen we je toestemming. Via ingesloten content kunnen derde partijen diensten leveren en verbeteren, bezoekersstatistieken bijhouden, gepersonaliseerde content tonen, gerichte advertenties tonen en gebruikersprofielen opbouwen. Hiervoor worden apparaatgegevens, IP-adres, geolocatie en surfgedrag vastgelegd.

Meer informatie vind je in ons cookiebeleid.

Sluiten

Toestemming beheren

Hieronder kun je per doeleinde of partij toestemming geven of intrekken. Meer informatie vind je in ons cookiebeleid.

Functioneel en analytisch

Deze cookies zijn noodzakelijk voor het functioneren van de website en het verbeteren van de website-ervaring. Klik op het informatie-icoon voor meer informatie. Meer details

janee

    Relevantere advertenties

    Dit beperkt het aantal keer dat dezelfde advertentie getoond wordt (frequency capping) en maakt het mogelijk om binnen Tweakers contextuele advertenties te tonen op basis van pagina's die je hebt bezocht. Meer details

    Tweakers genereert een willekeurige unieke code als identifier. Deze data wordt niet gedeeld met adverteerders of andere derde partijen en je kunt niet buiten Tweakers gevolgd worden. Indien je bent ingelogd, wordt deze identifier gekoppeld aan je account. Indien je niet bent ingelogd, wordt deze identifier gekoppeld aan je sessie die maximaal 4 maanden actief blijft. Je kunt deze toestemming te allen tijde intrekken.

    Ingesloten content van derden

    Deze cookies kunnen door derde partijen geplaatst worden via ingesloten content. Klik op het informatie-icoon voor meer informatie over de verwerkingsdoeleinden. Meer details

    janee