2012-08-24 21 views
6

Mam WebView w mojej działalności i za pomocą Proguard do zaciemniania wydaje się rozbić mój WebView i nie rozumiem, dlaczego.Proguard przerywa Android WebView, dlaczego?

Kod jest dość prosty, mam plik HTML w moim katalogu res/raw, tutaj jest kod, który ładuje go dobrze podczas debugowania.

WebView mv = (WebView)findViewById(R.id.webView1); 
mv.loadUrl("file:///android_res/raw/wesite.html"); 

Jak tylko utworzę apk do wydania, uruchomię go przez proguard, to nie działa, po prostu nie mogę załadować strony.

Nie dodałem jeszcze niczego do pliku konfiguracyjnego proguard.

Odpowiedz

9

Proguard zaciemnia katalogów więc jeśli szukasz android_res/raw to chyba już nie zadzwonił, że!

Możesz dodawać reguły do ​​pliku proguard.cfg w projekcie, który spowoduje pominięcie niektórych plików. Ale w tym przypadku przeniesienie surowego zasobu do folderu zasobów może załatwić sprawę.

Problem polega na tym, że narzędzie FileLoader Webkit spróbuje załadować klasę R $ do rysowania za pomocą odbicia. Jeśli nie dodasz żadnej reguły keep do pliku proguard.cfg, nazwa klasy zostanie zmieniona, dlatego Webkit nie będzie mógł załadować twojego zasobu. (pobrane od Prevent Proguard to remove specific drawables).

Dlatego Android używa klasy systemu nazewnictwa R dla zasobów - identyfikator uniquie odnośnika zamiast odwoływania plików przez ich usytuowanie

Umieszczając plik do aktywów folderu, są z pominięciem systemu R klasa katalogowanie i wszystko powinno działać dobrze.

należy przenieść plik do folderu website.html aktywów i zadzwonić:

mv.loadUrl("file:///android_asset/wesite.html"); 

Jak sugeruje się w linku powyżej, powinno być możliwe, aby dodać poniższą regułę do pliku Proguard.cfg zamiast tego zatrzymaj lokalizację zasobów:

-keepclassmembers class **.R$* { 
    public static <fields>; 
} 

-keep class **.R$* 

Bare na uwadze, że zaciemnianie działa tak, jak robi to z jakiegoś powodu!

Nadzieja to pomaga

+1

Powyższe działa dla Proguard.cnf i przenosi witrynę do folderu zasobów. Jednak kod powinien wyglądać następująco: 'mv.loadUrl (" file: ///android_asset/wesite.html ");' ** Uwaga: ** '' Android_asset'''' 'android_assets'. Dziękuję za wyjaśnienie. – Ne0

+0

Nie musisz przechowywać wszystkich klas R i ich pól, powinno być możliwe wybieranie pewnych nazw zasobów, które naprawdę chcesz zachować, a resztę (na przykład układ | xml | wartości) należy zaciemnić. – TWiStErRob

-1

załadować pliki surowego folderu w WebView:

myWebView.loadUrl("file:///android_assets/myfile.html"); 
+0

To ładuje pliki z katalogu zasobów, a nie z surowego katalogu. Proszę przeczytać post. Problem polega na zaciemnianiu Progamów, a nie na kodzie. – Ne0

1

Wystarczy, aby wyjaśnić ten składnik aktywów vs debaty. Folder w katalogu projektu powinien być nazywany „Aktywa”, jak na google docs (patrz poniżej), podczas gdy dostęp do nich trzeba użyć „file: /// android_asset /”

aktywa/ ta jest pusta. Możesz go użyć do przechowywania plików zasobów surowych. Zapisywane tu pliki są kompilowane do pliku .apk tak jak jest, a oryginalna nazwa pliku jest zachowywana. Możesz poruszać się po tym katalogu w taki sam sposób, jak typowy system plików używający identyfikatorów URI i czytać pliki jako strumień bajtów przy użyciu AssetManager. Na przykład jest to dobra lokalizacja dla tekstur i danych gier.

Uwaga: nie mogę dodać żadnego komentarza, dlatego wysłałem to jako odpowiedź.

0

Wystarczy zaktualizować po tym, jak do tego postu wprowadzono nowszą wersję.

W Androidzie Studio (przynajmniej 1.0.1) nie ma różnicy w domyślnym poziomie zaciemniania podanym w kompilacji wydania, jeśli korzystasz z zasobów lub res dla multimediów. android_res/raw lub android_asset. I oboje nadal nazywali to.

Zrobiłem apktool na obu kompilacjach, zaskoczony najnowszym, używając android_res/raw, będąc większy. Rozmiar był spowodowany wyłącznie przez moje media. Oba nie były w ogóle zaciemniane, podobnie jak inne apki w sklepie z aplikacjami. Zasoby i xml nie były ani razu zaciemniane. Jedyną trudnością, jaką można by zautomatyzować, jest zamiana baksmali na Javę. Widziałem, że inne apki były lepiej zaciemnione, ale moje zachowały oryginalne nazwy klas, które im dałem, chociaż podzielone na kilka części.

Jestem nowy, aby chronić, preferując C++, ale rozumiem, że jest on domyślnie stosowany w kompilacjach wydań.

+0

zestaw 'minifyEnabled true' (nekrocomment dużo) – n00b