Jak mogę uzyskać programowo kod wersji lub nazwę wersji mojego pliku APK z pliku AndroidManifest.xml po pobraniu i bez instalacji.
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="xxx.xx.xxx"
android:versionCode="1"
android:versionName="1.1" >
Na przykład chcę sprawdzić, czy nowa wersja jest załadowana do mojej usługi IIS, po zainstalowaniu jej na urządzeniu, jeśli nie jest to nowa wersja, nie chcę jej instalować.
android
android-manifest
apk
Big.Child
źródło
źródło
./aapt d badging release.apk | grep -Po "(?<=\sversion(Code|Name)=')([0-9.]+)"
2.6M
miejsce na dysku, możesz także napisać parser, aby przeanalizować plik apk, zaAXMLResource
który to będzie kosztować52k
. Zapoznaj się zOdpowiedzi:
Następujące działało dla mnie z wiersza poleceń:
UWAGA: aapt.exe znajduje się w
build-tools
podfolderze SDK. Na przykład:źródło
aapt
znajduje się w build-tools / XX w sdk.~/Library/Developer/Xamarin/android-sdk-macosx/build-tools/{version}
platformBuildVersionName
drukowane, gdy używam tego polecenia i dlaczego jest puste?aapt dump badging %1 pause
aby przeciągnąć i upuścić dowolną aplikacjęźródło
apk
zawartość bez instalowania aplikacji? @PatrickChoJeśli używasz wersji 2.2 i powyżej z Android Studio następnie w Android Studio użytku Build → Analyze APKnastępnie wybierz plik AndroidManifest.xml.
źródło
programmatically
To odpowiada na pytanie, zwracając w rezultacie tylko numer wersji. Jednak......
Jak wspomniano wcześniej, celem powinno być sprawdzenie, czy aplikacja na serwerze jest nowsza niż zainstalowana PRZED próbą jej pobrania lub zainstalowania. Najłatwiej to zrobić, umieszczając numer wersji w nazwie pliku apka hostowanego na serwerze, np
myapp_1.01.apk
Aby dokonać porównania, musisz ustalić nazwę i numer wersji aplikacji już zainstalowanych (jeśli jest zainstalowana). Będziesz potrzebował zrootowanego urządzenia lub sposobu instalacji aapt binarnego i busybox, jeśli nie są one jeszcze zawarte w ROM.
Ten skrypt pobierze listę aplikacji z twojego serwera i porówna z dowolnymi zainstalowanymi aplikacjami. Wynikiem jest lista oznaczona do aktualizacji / instalacji.
Jak ktoś zapytał, jak to zrobić bez użycia aapt. Możliwe jest również wyodrębnienie informacji apk za pomocą apktool i odrobiny skryptów. Ten sposób jest wolniejszy i nie jest prosty w Androidzie, ale będzie działał na systemach Windows / Mac lub Linux, o ile masz działającą konfigurację apktool.
Rozważ również folder upuszczania na swoim serwerze. Prześlij do niego apki, a zadanie cron zmieni nazwę i przeniesie je do folderu aktualizacji.
źródło
W tej chwili można to zrobić w następujący sposób
Ogólnie będzie to:
źródło
Teraz mogę pomyślnie pobrać wersję pliku APK z jego binarnych danych XML.
W tym temacie mam klucz do mojej odpowiedzi (dodałem również moją wersję kodu Ribo): Jak parsować plik AndroidManifest.xml w pakiecie .apk
Dodatkowo oto kod parsujący XML, który napisałem, a konkretnie w celu pobrania wersji:
Analiza XML
Porównanie wersji (widziane jako SystemPackageTools.compareVersions w poprzednim fragmencie) UWAGA: Ten kod jest inspirowany następującym tematem: Skuteczny sposób porównywania ciągów wersji w Javie
Mam nadzieję, że to pomoże.
źródło
W przypadku scenariusza aktualizacji alternatywnym podejściem może być posiadanie usługi sieci Web, która dostarcza bieżący numer wersji i sprawdzanie go zamiast pobierania całego apka tylko w celu sprawdzenia jego wersji. Zaoszczędziłoby to trochę przepustowości, byłoby nieco bardziej wydajne (znacznie szybsze do pobrania niż apk, jeśli cały apk nie jest potrzebny przez większość czasu) i znacznie prostsze do wdrożenia.
W najprostszej formie możesz mieć prosty plik tekstowy na swoim serwerze ...
http://some-place.com/current-app-version.txt
Wewnątrz tego pliku tekstowego jest coś podobnego
a następnie pobierz ten plik i porównaj z aktualnie zainstalowaną wersją.
Budowanie bardziej zaawansowanego rozwiązania tego polegałoby na wdrożeniu odpowiedniej usługi internetowej i wywołaniu interfejsu API przy uruchomieniu, który mógłby zwrócić trochę JSON, tj .
http://api.some-place.com/versionCheck
:źródło
źródło