2011-11-21 21 views
11

Jedna z naszych aplikacji zawiera kilka tysięcy małych plików danych, które obecnie pakujemy jako zasoby. Pomogłoby to naszemu kodowi, gdybyśmy mogli spakować je jako surowe zasoby. Próbowałem ustalić, jakie są ograniczenia dotyczące liczby zasobów, jakie aplikacja może mieć dla każdego typu, ale nie znalazłem żadnej dokumentacji na ten temat. Czy ktoś wie, jakie są ograniczenia dotyczące liczby zasobów Androida?Jakie są ograniczenia dotyczące liczby zasobów Androida?

Odpowiedz

10

Po wielu eksperymentach wydaje się, że można uzyskać zasoby o wartości do 16 bitów (65 536 zasobów) dla każdego rodzaju zasobów. (Mogą być dodatkowe bity zarezerwowane do wykorzystania w przyszłości, co zmniejszyłoby maksymalną liczbę zasobów, ale nie mogłem znaleźć żadnego dowodu na to.) Byłoby miło, gdyby ktoś mógł udzielić autorytatywnej odpowiedzi, ale po roku " m zrezygnowałem.

EDIT (patrz comment below by @B T): Na podstawie this answer by hackbod w innym wątku Wygląda na to, że istnieje rzeczywiście, 16 bitów dostępne, więc można mieć do 65.535 zasobów każdego typu (nie 65,536, ponieważ zerowy nie jest dostępny). Należy również pamiętać, że ten limit dotyczy tylko liczby zasobów dla pojedynczej konfiguracji (ustawienia narodowe, gęstość pikseli itp.). Odmiany zasobów dla różnych konfiguracji mają ten sam identyfikator zasobu i nie przyczyniają się do zliczania. Tak więc możesz faktycznie mieć więcej niż 65 535 zasobów dowolnego typu (np. Układ lub ciąg), ale nie dla żadnej konfiguracji.

+0

Program Aapt narzuca 16-bitowy limit dla każdego typu zasobu dla każdej aplikacji. Zasoby apklib dodają całkowitą liczbę deklaracji zasobów aplikacji. –

+0

@ JamesWald - Dzięki. Doszedłem do wniosku, że nie może to być więcej niż 16 bitów, ale nie byłem pewien, czy być może mieliśmy mniej. Czy możesz wskazać na jakąkolwiek dokumentację? –

+2

Musiałem przekopać się przez aaptor kodu źródłowego, ponieważ nie jest on udokumentowany. Najważniejsze 8 bitów wartości zasobu reprezentuje identyfikator pakietu. Kolejne najbardziej znaczące 8 bitów reprezentuje typ zasobu. Pozostawia to 16 bitów do adresowania zasobów. Zobacz makeResId() w https://android.googlesource.com/platform/frameworks/base.git/+/android-4.4_r1.1/tools/aapt/ResourceTable.h.Dodatkowo, linia 3817 https://android.googlesource.com/platform/frameworks/base.git/+/android-4.4_r1.1/tools/aapt/ResourceTable.cpp ustawia identyfikator pakietu na 127, dając nam bazę wartość 0x7f000000. –

0

Nie ma wyraźnej dokumentacji na temat tego, co wiem, ale można przyjąć rozsądne założenia, że ​​twórcy Androida zaprojektowali Androida odpowiednio do swoich zaleceń. Zalecają umieszczenie łańcuchów i rysunków w zasobach, które mogą dostarczyć różnych dla różnych ustawień regionalnych, rozmiarów ekranu, gęstości ekranu i orientacji. Ogromna liczba tych możliwości sugeruje mi, że spodziewają się, że aplikacje będą zawierać tysiące zasobów, a Ty będziesz dobrze dostarczać kilka tysięcy małych surowców.

+0

Problem polega na tym, że nie można liczyć różnych ustawień regionalnych, rozmiarów ekranu itp. Pojedynczego ciągu jako oddzielnych zasobów. W rzeczywistości zachodzą na siebie i używają tej samej wartości identyfikatora zasobu. To, co mnie martwi, jest całkiem proste: ile bitów identyfikatora zasobu jest dostępnych dla każdego typu zasobu? Wiele bitów jest zarezerwowanych do identyfikacji samego typu zasobu, więc z pewnością nie jest to 32-bitowy. Od przeglądania niektórych plików R.java wydaje się, że jest to najwyżej 16 bitów dla dowolnego typu zasobów. Jeśli mamy tak dużo, możemy przetrwać, ale mniej, a my możemy mieć problemy. –

+0

To dobra uwaga. Może najlepszym sposobem jest po prostu spróbować. Możesz napisać szybką aplikację do generowania plików, może 1.txt, 2.txt, aż do konfigurowalnego numeru, może z tym samym numerem co zawartość pliku. Następnie wykonaj to samo, aby wygenerować trochę prostej javy, aby odczytać zasób w systemie Android i może wyrzucić wyjątek lub coś, jeśli się nie powiedzie. Można nawet bezpośrednio wygenerować test JUnit. – kabuko

0

Uwzględniając automatycznie klasę R i wartość zasobów użytych w api, zakładam gdzieś w okolicy Integer.MAX_INTEGER ciąg znaków, ciąg i id układu każdego.

+0

Nie ma sposobu, żeby to się zgadzało. Każda wartość int w R ma co najmniej połowę bitów zarezerwowanych dla flag różnego rodzaju (dla typu zasobu, niezależnie od tego, czy jest to identyfikator systemu lub użytkownika, i kto wie, co jeszcze). Tak jak powiedziałem w innym komentarzu, zwykłe spojrzenie na dobrze zapełnione R sugeruje, że dostępnych jest maksymalnie 16 bitów do rozróżnienia między zasobami dowolnego typu. –

Powiązane problemy