Awaria procesu Androida przy użyciu WebViews w ViewPager z włączoną akceleracją sprzętową

Mam działanie z ViewPagerem, którego używam do przeglądania fragmentów zawierających „losowe” strony internetowe. Treść internetowa nie jest przeze mnie kontrolowana. Używam FragmentStatePagerAdapter i najnowszej biblioteki pomocniczej. Układ każdego fragmentu zawiera widok sieciowy, który ładuje „losową” stronę. Użytkownik może przewijać do przodu w nieskończoność.

Kiedy włączam przyspieszenie sprzętowe, po kilku przesunięciach pojawia się błąd seg (zrzut znajduje się poniżej). Przy wyłączonej akceleracji sprzętowej nie ma awarii, ale oczywiście przewijanie przeglądarki internetowej i przeglądanie pagera są bardzo nierówne. Poza tym nie mogę odtwarzać osadzonego wideo na stronach takich jak YouTube.

Awaria nie ma miejsca na określonych stronach. Różna jest także liczba przeciągnięć potrzebnych do odtworzenia awarii – czasem dzieje się to przy pierwszym przesunięciu, czasem potrzeba kilku, ale jest bardzo spójna. Sprawdziłem użycie pamięci podczas uruchamiania aplikacji i wydaje się, że jest w porządku (ram i vram) – w porządku w tym sensie, że nie sądzę, że zużywam za dużo i nie dostaję żadnych ostrzeżeń o niskim poziomie pamięci.

Natknąłem się na ten problem na wszystkich urządzeniach 3.0+, które próbowałem do tej pory:

  • toshiba regza z wersją 4.0.3
  • motorola xoon działa 3.2.1
  • telefon Galaxy Nexus z wersją 4.0.4 (fwiw, zdarza się to rzadziej na telefonie)

Czy jest to znany problem? Jakieś obejście?

07-02 15:12:30.187: I/DEBUG(111): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***

07-02 15:12:30.187: I/DEBUG(111): Build fingerprint: 'TOSHIBA/tostab05/tostab05:4.0.3/IML74K/05.3.0012:user/release-keys'

07-02 15:12:30.187: I/DEBUG(111): pid: 1538, tid: 1538  >>> xxx <<<

07-02 15:12:30.187: I/DEBUG(111): signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0000043e
07-02 15:12:30.187: I/DEBUG(111):  r0 0000000b  r1 02514ba0  r2 befbf378  r3 0000043e

07-02 15:12:30.187: I/DEBUG(111):  r4 020a43e8  r5 02070958  r6 00000000  r7 00000006

07-02 15:12:30.187: I/DEBUG(111):  r8 00000000  r9 020a2364  10 01d2d108  fp befbf6e4

07-02 15:12:30.187: I/DEBUG(111):  ip 409da55c  sp befbf330  lr 409c3487  pc 409c349a  cpsr 80000030

07-02 15:12:30.187: I/DEBUG(111):  d0  4488000044800000  d1  0000000044800000

07-02 15:12:30.187: I/DEBUG(111):  d2  4480000044801000  d3  00000000000000af

07-02 15:12:30.187: I/DEBUG(111):  d4  3f800000170000e0  d5  4480000044800000

07-02 15:12:30.187: I/DEBUG(111):  d6  4488000000000000  d7  4260000000000000

07-02 15:12:30.187: I/DEBUG(111):  d8  0000000000000000  d9  0000000300000038

07-02 15:12:30.187: I/DEBUG(111):  d10 00000000000002f0  d11 0000000000000000

07-02 15:12:30.187: I/DEBUG(111):  d12 0000000000000000  d13 0000000000000000

07-02 15:12:30.187: I/DEBUG(111):  d14 0000000000000000  d15 0000000000000000

07-02 15:12:30.187: I/DEBUG(111):  d16 0000000000000000  d17 3ff0000000000000

07-02 15:12:30.187: I/DEBUG(111):  d18 3fe0000000000000  d19 3fe000000112a880

07-02 15:12:30.187: I/DEBUG(111):  d20 3ff0000000000000  d21 8000000000000000

07-02 15:12:30.187: I/DEBUG(111):  d22 c000000000000000  d23 0000000000000000

07-02 15:12:30.187: I/DEBUG(111):  d24 0000000000000000  d25 3ff0000000000000

07-02 15:12:30.187: I/DEBUG(111):  d26 4010000000000000  d27 3ff0000000000000

07-02 15:12:30.187: I/DEBUG(111):  d28 0000000000000000  d29 3ff0000000000000

07-02 15:12:30.187: I/DEBUG(111):  d30 0000000000000000  d31 3ff0000000000000

07-02 15:12:30.187: I/DEBUG(111):  scr 80000013

07-02 15:12:30.335: I/DEBUG(111):          #00  pc 0000c49a  /system/lib/libhwui.so

07-02 15:12:30.343: I/DEBUG(111):          #01  pc 00010d3c  /system/lib/libhwui.so

07-02 15:12:30.343: I/DEBUG(111):          #02  pc 0000c682  /system/lib/libhwui.so

07-02 15:12:30.343: I/DEBUG(111):          #03  pc 00010d3c  /system/lib/libhwui.so

07-02 15:12:30.343: I/DEBUG(111):          #04  pc 0000c682  /system/lib/libhwui.so

07-02 15:12:30.343: I/DEBUG(111):          #05  pc 00010d3c  /system/lib/libhwui.so

07-02 15:12:30.343: I/DEBUG(111):          #06  pc 0000c682  /system/lib/libhwui.so

07-02 15:12:30.343: I/DEBUG(111):          #07  pc 00010d3c  /system/lib/libhwui.so

07-02 15:12:30.343: I/DEBUG(111):          #08  pc 0000c682  /system/lib/libhwui.so

07-02 15:12:30.343: I/DEBUG(111):          #09  pc 00010d3c  /system/lib/libhwui.so

07-02 15:12:30.343: I/DEBUG(111):          #10  pc 0000c682  /system/lib/libhwui.so

07-02 15:12:30.351: I/DEBUG(111):          #11  pc 00010d3c  /system/lib/libhwui.so

07-02 15:12:30.351: I/DEBUG(111):          #12  pc 00057874  /system/lib/libandroid_runtime.so
07-02 15:12:30.351: I/DEBUG(111):          #13  pc 0001ebf0  /system/lib/libdvm.so (dvmPlatformInvoke)
07-02 15:12:30.351: I/DEBUG(111):          #14  pc 00058eac  /system/lib/libdvm.so (_Z16dvmCallJNIMethodPKjP6JValuePK6MethodP6Thread)

07-02 15:12:30.351: I/DEBUG(111): code around pc:

07-02 15:12:30.351: I/DEBUG(111): 409c3478 f7fe6781 9010ffa3 f0044628 9f0df81f  .g......(F......

07-02 15:12:30.351: I/DEBUG(111): 409c3488 ab13aa12 920b3701 9711930e 900f3801  .....7.......8..

07-02 15:12:30.351: I/DEBUG(111): 409c3498 f853e2fe 98107b04 990d463a f7fe67a3  ..S..{..:F...g..

07-02 15:12:30.351: I/DEBUG(111): 409c34a8 2f23fedf 82f4f200 f017e8df 0037002e  ..#/..........7.

07-02 15:12:30.351: I/DEBUG(111): 409c34b8 0043003a 00810061 0095008c 00ad00a2  :.C.a...........

07-02 15:12:30.351: I/DEBUG(111): code around lr:

07-02 15:12:30.351: I/DEBUG(111): 409c3464 460db095 920c4604 0800f04f 4646930d  ...F.F..O.....FF

07-02 15:12:30.351: I/DEBUG(111): 409c3474 1080f8d0 f7fe6781 9010ffa3 f0044628  .....g......(F..

07-02 15:12:30.351: I/DEBUG(111): 409c3484 9f0df81f ab13aa12 920b3701 9711930e  .........7......

07-02 15:12:30.351: I/DEBUG(111): 409c3494 900f3801 f853e2fe 98107b04 990d463a  .8....S..{..:F..

07-02 15:12:30.351: I/DEBUG(111): 409c34a4 f7fe67a3 2f23fedf 82f4f200 f017e8df  .g....#/........

07-02 15:12:30.351: I/DEBUG(111): stack:

07-02 15:12:30.351: I/DEBUG(111):     befbf2f0  00000000  

07-02 15:12:30.351: I/DEBUG(111):     befbf2f4  befbf30c  [stack]

07-02 15:12:30.351: I/DEBUG(111):     befbf2f8  0237c55c  [heap]

07-02 15:12:30.351: I/DEBUG(111):     befbf2fc  befbf364  [stack]

07-02 15:12:30.351: I/DEBUG(111):     befbf300  409da430  /system/lib/libhwui.so

07-02 15:12:30.351: I/DEBUG(111):     befbf304  01d8c2d8  [heap]

07-02 15:12:30.351: I/DEBUG(111):     befbf308  409daa10  /system/lib/libhwui.so

07-02 15:12:30.351: I/DEBUG(111):     befbf30c  409c7d05  /system/lib/libhwui.so

07-02 15:12:30.351: I/DEBUG(111):     befbf310  00000000  

07-02 15:12:30.351: I/DEBUG(111):     befbf314  020a2364  [heap]

07-02 15:12:30.351: I/DEBUG(111):     befbf318  01d2d108  [heap]

07-02 15:12:30.351: I/DEBUG(111):     befbf31c  409c23f1  /system/lib/libhwui.so

07-02 15:12:30.351: I/DEBUG(111):     befbf320  020a43e8  [heap]

07-02 15:12:30.351: I/DEBUG(111):     befbf324  02070958  [heap]

07-02 15:12:30.351: I/DEBUG(111):     befbf328  df0027ad  

07-02 15:12:30.359: I/DEBUG(111):     befbf32c  00000000  

07-02 15:12:30.359: I/DEBUG(111): #00 befbf330  00000000  

07-02 15:12:30.359: I/DEBUG(111):     befbf334  3f800000  

07-02 15:12:30.359: I/DEBUG(111):     befbf338  00000000  

07-02 15:12:30.359: I/DEBUG(111):     befbf33c  44800000  /dev/ashmem/dalvik-heap (deleted)

07-02 15:12:30.359: I/DEBUG(111):     befbf340  00000000  

07-02 15:12:30.359: I/DEBUG(111):     befbf344  00000000  

07-02 15:12:30.359: I/DEBUG(111):     befbf348  3f800000  

07-02 15:12:30.359: I/DEBUG(111):     befbf34c  02370001  [heap]

07-02 15:12:30.359: I/DEBUG(111):     befbf350  00000000  

07-02 15:12:30.359: I/DEBUG(111):     befbf354  00000000  

07-02 15:12:30.359: I/DEBUG(111):     befbf358  befbf378  [stack]

07-02 15:12:30.359: I/DEBUG(111):     befbf35c  befbf378  [stack]

07-02 15:12:30.359: I/DEBUG(111):     befbf360  befbf6a0  [stack]

07-02 15:12:30.359: I/DEBUG(111):     befbf364  00000005  

07-02 15:12:30.359: I/DEBUG(111):     befbf368  befbf37c  [stack]

07-02 15:12:30.359: I/DEBUG(111):     befbf36c  0000000b  

07-02 15:12:30.359: I/DEBUG(111):     befbf370  01d8c2d8  [heap]

07-02 15:12:30.359: I/DEBUG(111):     befbf374  00000006  

07-02 15:12:30.359: I/DEBUG(111):     befbf378  44800000  /dev/ashmem/dalvik-heap (deleted)

07-02 15:12:30.359: I/DEBUG(111):     befbf37c  00000000  

07-02 15:12:30.359: I/DEBUG(111):     befbf380  44880000  /dev/ashmem/dalvik-heap (deleted)

07-02 15:12:30.359: I/DEBUG(111):     befbf384  020a43e8  [heap]

07-02 15:12:30.359: I/DEBUG(111):     befbf388  02070958  [heap]

07-02 15:12:30.359: I/DEBUG(111):     befbf38c  00000000  

07-02 15:12:30.359: I/DEBUG(111):     befbf390  409c7d05  /system/lib/libhwui.so

07-02 15:12:30.359: I/DEBUG(111):     befbf394  00000000  

07-02 15:12:30.359: I/DEBUG(111):     befbf398  020a2364  [heap]

07-02 15:12:30.359: I/DEBUG(111):     befbf39c  01d2d108  [heap]

07-02 15:12:30.359: I/DEBUG(111):     befbf3a0  befbf6e4  [stack]

07-02 15:12:30.359: I/DEBUG(111):     befbf3a4  409c7d41  /system/lib/libhwui.so

07-02 15:12:30.359: I/DEBUG(111): #01 befbf3a8  42600000  /dev/ashmem/dalvik-heap (deleted)

07-02 15:12:30.359: I/DEBUG(111):     befbf3ac  020a43e8  [heap]

07-02 15:12:30.359: I/DEBUG(111):     befbf3b0  00000040  

07-02 15:12:30.359: I/DEBUG(111):     befbf3b4  020a41a0  [heap]

07-02 15:12:30.359: I/DEBUG(111):     befbf3b8  02070958  [heap]

07-02 15:12:30.359: I/DEBUG(111):     befbf3bc  409c3685  /system/lib/libhwui.so

person Zack Foster    schedule 03.07.2012    source źródło


Odpowiedzi (1)


OK, znalazłem obejście i „przyczynę” awarii. Umieściłem „przyczynę” w cudzysłowie, ponieważ nie sądzę, że robię coś złego w moim oryginalnym kodzie.

W swoim fragmencie miałem następujący kod:

@Override
public void onCreate(Bundle savedInstanceState)
{
    ...
    setHasOptionsMenu(true);
    ...
}

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater)
{
    inflater.inflate(R.menu.options_menu, menu);
}

@Override
public void onPrepareOptionsMenu(Menu menu)
{
    ... // apply a menu strategy that enables/disables some items based on app state
}

Z jakiegoś powodu, jeśli usunę kod inflacji, awaria już nie występuje. Rozwiązaniem jest powiększenie menu na poziomie aktywności, a następnie zastosowanie strategii menu na poziomie fragmentu. Nie jestem pewien, dlaczego tak się dzieje. Jeśli to robi różnicę, obecnie nie używam ABSherlocka.

person Zack Foster    schedule 04.07.2012
comment
Nigdy bym nie zgadł, że problem tkwi w onCreateOptions.. Prawie się poddałem i wyłączyłem przyspieszenie sprzętowe, gdy znalazłem to pytanie. Wielkie dzięki! - person Mandar Limaye; 03.08.2012