2015-08-20 5 views
9

Kilka dni temu wydaliśmy aplikację w sklepie Play, która zajmuje się bitmapami wysokiej jakości i chodzi o ich edycję.Do bitmap.recycle() lub do bitmap.recycle()

Wszystko działo się dobrze, gdy zdaliśmy sobie sprawę, że 20% urządzeń dawało błędy pamięci. Sprawdziliśmy więc nasz kod i okazało się, że Android nie zwalnia pamięci natywnej używanej do przechowywania danych bitmapowych na niektórych urządzeniach. W tym przypadku powitaliśmy polecenie recycle.

Błędy w pamięci zniknęły (przynajmniej w urządzeniach hd). W każdym razie byliśmy szczęśliwi. Ale dzisiaj zaczęliśmy zauważać, że 50% urządzeń zaczęło podawać kolejny błąd: "Nie można skopiować zregenerowanej bitmapy".

Byliśmy zbulwersowani. Na dwóch bitmap.copy() linii w naszym kodzie, połowa z tych urządzeń nie może zrobić to dwie linie w synchroniczny:

Bitmap anotherBitmap = bitmap.copy(bitmap.getConfig(), true); 
bitmap.recycle(); 

więc usunęliśmy recyklingu i uwalniając kolejną aktualizację, postanowił ograniczyć rozmiary ekranu urządzenia, tak małe nie dają nam złą ocenę.

Oto moje pytanie. Dlaczego niektóre urządzenia mogą kopiować przed recyklingiem, a połowa nie?

Przeczytałem dokumentację związaną z bitmapami Google i już wiedziałem, w jaki sposób bitmapa jest przechowywana zarówno na kupie VM, jak i na rodzimej stercie, jak działa usuwanie śmieci poza błędami pamięci itp. Przykładowy kod Google zapewniający ładowanie i edytowanie dużych bitmap jest już prawie taki sam jak nasz.

Przeczytaj wiele blogów, wątków grupy Google, próbki kodu github ... Myślę, że nadal potrzebuję dobrej dokumentacji/książki o bitmapach Android.

PS: Już używamy inSampleSize do skalowania bitmap podczas ich dekodowania.

EDIT - Oto niektóre dane z raportów o awariach:

Wszystkie urządzenia są dla zakorzenione. W większości przypadków pamięć wynosi od 25% do 35%.

Manufacturers: 
57% LG 
31% Samsung 
10% Casper Via V5 (Turkey based company, sells rebranded Chinese phones) 

Devices: 
81% LG D855 (G3) 
18% LG D802TR (G2) 
---- 
66% Samsung SM N910C (Galaxy Note 4) 
20% Samsung SM A700F (Galaxy A7) 

Operating Systems: 
68% Android 5 
31% Android 4 

OS 5 Details 
69% Android 5.0 
30% Android 5.0.1 

OS4 Details 
66% Android 4.4.2 
33% Android 4.4.4 
+0

O ile pamiętam, czy bitmapa jest umieszczony w natywnym pamięci ma do czynienia z jakiej wersji Androida używasz, później wersje Androida nie przechowywać je w rodzimym barana i na tych nie powinieneś zadzwonić do recyklingu. Jeśli chodzi o to, co faktycznie dzieje się podczas kopiowania i recyklingu, zależy to od producenta i wersji Androida, czy możesz podać nieco więcej informacji na temat urządzenia i platformy? – JohanShogun

+0

Jednym z możliwych sposobów działania może być wywoływanie tylko wywołania zwrotnego na telefonach z brodą imbirową lub wcześniej (jeśli dane, z którymi telefony dostaną problem, potwierdzają, że w telefonach z problemami z pamięcią działa chleb imbirowy lub wcześniej). – JohanShogun

+0

Jeśli chodzi o dokumentację na temat map bitowych, najszybszym i najłatwiejszym rozwiązaniem jest sprawdzenie, w jaki sposób aosp robi rzeczy, niektórzy producenci dokonują zmian w otoczeniu (Samsung jest największym winowajcą), ale powinien dostarczyć wystarczających informacji o tym, jak to wszystko odbywa się na większości urządzeń, łatwo przeszukiwać aosp: http: // androidxref.com – JohanShogun

Odpowiedz

0

Czy jesteś pewien, że z jakiegoś powodu

bitmap.copy (..)

nie nazywa się dwa razy?

tj:

//first call Bitmap anotherBitmap = bitmap.copy(bitmap.getConfig(), true); bitmap.recycle();

[...]

// second call Bitmap anotherBitmap = bitmap.copy(bitmap.getConfig(), true); bitmap.recycle();

+1

tak. recykling jest używany tylko raz. używamy tej pierwszej kopii do efektów. Druga kopia jest tworzona do resetowania edytowanego obrazu, który jest tworzony z pierwszej kopii, a nie z oryginału. urządzenia posiadające wyjątek wskaźnika pustego informują, że problem dotyczy tej samej linii tej samej klasy. i tylko około 50% urządzeń ma awarię. pozostałe nie ma problemu z recyklingiem. obecnie zmieniliśmy proces edycji i usunęliśmy wszystkie razem. najprawdopodobniej przeniesiemy odczyt obrazu do narzędzia ndk w celu lepszego zarządzania pamięcią, ponieważ gb na Androidzie jest bałaganem w przypadku bitmap. – emrahgunduz

Powiązane problemy