Soubory rozšíření APK

Některé aplikace (například některé hry) vyžadují více prostředků a prostředků, než je možné poskytnout v maximálním limitu velikosti aplikace androidu uloženém Google Play. Tento limit závisí na verzi Androidu, na kterou je váš soubor APK zacílený:

  • 100 MB pro sady API, které cílí na Android 4.0 nebo vyšší (úroveň rozhraní API 14 nebo vyšší).
  • 50 MB pro sady API, které cílí na Android 3.2 nebo nižší (úroveň rozhraní API 13 nebo vyšší).

Pokud chcete toto omezení překonat, Google Play bude hostovat a distribuovat dva rozšiřující soubory , aby spolu s APK, což aplikaci umožňuje nepřímo překročit tento limit.

Na většině zařízení se při instalaci aplikace stáhnou rozšiřující soubory spolu s apkem a uloží se do sdíleného umístění úložiště (karta SD nebo oddíl usb-mountable) na zařízení. Na několika starších zařízeních se rozšiřující soubory nemusí automaticky instalovat pomocí APK. V těchto situacích je nutné, aby aplikace obsahovala kód, který stáhne rozšiřující soubory při prvním spuštění aplikací uživatelem.

Rozšiřující soubory jsou považovány za neprůhledné binární objekty blob (obb) a mohou mít velikost až 2 GB. Android neprovádí žádné speciální zpracování těchto souborů po jejich stažení – soubory mohou být v libovolném formátu, který je vhodný pro aplikaci. Koncepční je doporučený přístup k rozšiřujícím souborům následujícím způsobem:

  • Hlavní rozšíření – Tento soubor je primární rozšiřující soubor pro prostředky a prostředky, které se nevejdou do limitu velikosti APK. Hlavní rozšiřující soubor by měl obsahovat primární prostředky, které aplikace potřebuje, a měly by se zřídka aktualizovat.
  • Rozšíření opravy – To je určené pro malé aktualizace hlavního rozšiřujícího souboru. Tento soubor lze aktualizovat. Je zodpovědností aplikace provádět všechny potřebné opravy nebo aktualizace z tohoto souboru.

Rozšiřující soubory se musí nahrávat současně s nahranými soubory APK. Google Play neumožňuje nahrání rozšiřujícího souboru do existujícího souboru APK nebo pro aktualizace stávajících sad API. Pokud je nutné aktualizovat rozšiřující soubor, musí se nový soubor APK nahrát s aktualizovaným souborem versionCode .

Rozšíření úložiště souborů

Když se soubory stáhnou do zařízení, uloží se ve sdíleném úložišti/ Androidu/obb/package-name:

  • shared-store – toto je adresář určený uživatelem Android.OS.Environment.ExternalStorageDirectory .
  • název balíčku – toto je název balíčku ve stylu Java aplikace.

Po stažení by se rozšiřující soubory neměly přesunout, změnit, přejmenovat nebo odstranit ze svého umístění na zařízení. Uděláte to tak, že se soubory rozšíření znovu stáhnou a staré soubory se odstraní. Adresář rozšiřujících souborů by navíc měl obsahovat pouze soubory rozšiřujících balíčků.

Rozšiřující soubory neobsahují zabezpečení ani ochranu obsahu – jiné aplikace nebo uživatelé můžou přistupovat k jakýmkoli souborům uloženým ve sdíleném úložišti.

Pokud je nutné rozbalit rozšiřující soubor, měly by být rozbalené soubory uloženy v samostatném adresáři, například v souboru .Android.OS.Environment.ExternalStorageDirectory

Alternativou k extrahování souborů z rozšiřujícího souboru je čtení prostředků nebo prostředků přímo z rozšiřujícího souboru. Rozšiřující soubor není nic víc než soubor ZIP, který lze použít s odpovídajícím ContentProvidersouborem . Android.Play.ExpansionLibrary obsahuje sestavení ,System.IO.Compression.Zip, který zahrnujeContentProvider, který umožní přímý přístup k souborům s přímým přístupem k některým mediálním souborům. Pokud jsou multimediální soubory zabalené do souboru ZIP, mohou volání přehrávání médií přímo používat soubory v souboru ZIP, aniž by bylo nutné rozbalit soubor ZIP. Při přidání do souboru ZIP by se multimediální soubory neměly komprimovat.

Formát FileName

Po stažení rozšiřujících souborů použije Google Play k pojmenování rozšíření následující schéma:

[main|patch].<expansion-version>.<package-name>.obb

Tři komponenty tohoto schématu jsou:

  • main nebo patch – Určuje, jestli se jedná o hlavní nebo rozšiřující soubor opravy. Může existovat jenom jedna z nich.
  • <expansion-version> – Jedná se o celé číslo, které odpovídá versionCode souboru APK, ke kterému byl soubor poprvé přidružen.
  • <package-name> – Jedná se o název balíčku ve stylu Java aplikace.

Pokud je například apk verze 21 a název balíčku je mono.samples.helloworld, hlavní rozšiřující soubor bude pojmenován main.21.mono.samples.helloworld.

Proces stahování

Když je aplikace nainstalována z Google Play, rozšiřující soubory by měly být staženy a uloženy spolu s APK. V některých situacích k tomu nemusí dojít nebo mohou být odstraněny rozšiřující soubory. Aby aplikace zvládla tuto podmínku, musí zkontrolovat, jestli rozšiřující soubory existují, a pak je v případě potřeby stáhnout. Následující vývojový diagram zobrazuje doporučený pracovní postup tohoto procesu:

Vývojový diagram rozšíření APK

Když se aplikace spustí, měla by zkontrolovat, jestli na aktuálním zařízení existují odpovídající rozšiřující soubory. Pokud tomu tak není, musí aplikace požádat o licencování aplikací Google Play. Tato kontrola se provádí pomocí knihovny LVL (License Verification Library) a musí být provedena pro bezplatné i licencované aplikace. LVL je primárně používán placenými aplikacemi k vynucení licenčních omezení. Google ale rozšířil LVL tak, aby se dal použít i s rozšiřujícími knihovnami. Bezplatné aplikace musí provádět kontrolu LVL, ale mohou ignorovat omezení licencí. Žádost LVL zodpovídá za poskytnutí následujících informací o rozšiřujících souborech, které aplikace vyžaduje:

  • Velikost souboru – Velikosti souborů rozšíření se používají jako součást kontroly, která určuje, zda již byly staženy správné rozšiřující soubory.
  • Názvy souborů – toto je název souboru (na aktuálním zařízení), do kterého se musí rozšiřující balíčky uložit.
  • Adresa URL pro stažení – adresa URL , která by se měla použít ke stažení rozšiřujících balíčků. To je jedinečné pro každé stahování a vyprší krátce po jeho poskytnutí.

Po provedení kontroly LVL by aplikace měla stáhnout rozšiřující soubory, a to s ohledem na následující body v rámci stahování:

  • Zařízení nemusí mít dostatek místa k uložení rozšiřujících souborů.
  • Pokud Wi-Fi není k dispozici, měl by mít uživatel povoleno pozastavit nebo zrušit stahování, aby se zabránilo nežádoucím poplatkům za data.
  • Rozšiřující soubory se stáhnou na pozadí, aby se zabránilo blokování interakcí uživatelů.
  • Zatímco stahování probíhá na pozadí, měl by se zobrazit indikátor průběhu.
  • Chyby, ke kterým dochází během stahování, se dají řádně zpracovat a obnovit.

Přehled architektury

Když se spustí hlavní aktivita, zkontroluje, jestli se stahují rozšiřující soubory. Pokud se soubory stáhnou, musí se zkontrolovat platnost.

Pokud rozšiřující soubory nebyly staženy nebo pokud jsou aktuální soubory neplatné, je nutné stáhnout nové rozšiřující soubory. V rámci aplikace se vytvoří ohraničená služba. Když je spuštěna hlavní aktivita aplikace, používá ohraničovanou službu k provedení kontroly u služeb Licencování Google, aby zjistil názvy rozšiřujících souborů a adresu URL souborů ke stažení. Ohraničovaná služba pak stáhne soubory na vlákně na pozadí.

Aby se usnadnilo úsilí potřebné k integraci rozšiřujících souborů do aplikace, Google vytvořil několik knihoven v Javě. Příslušné knihovny jsou:

  • Downloader Library – Jedná se o knihovnu, která snižuje úsilí potřebné k integraci rozšiřujících souborů do aplikace. Knihovna stáhne rozšiřující soubory ve službě na pozadí, zobrazí oznámení uživatelů, zpracuje problémy s připojením k síti, obnoví stahování atd.
  • Knihovna LVL (License Verification Library) – knihovna pro provádění a zpracování volání služeb licencování aplikací. Dá se také použít k provádění kontrol licencování, abyste zjistili, jestli je aplikace oprávněná k použití na zařízení.
  • APK Expand Zip Library (volitelné) – Pokud jsou rozšiřující soubory v souboru ZIP, bude tato knihovna fungovat jako poskytovatel obsahu a umožní aplikaci číst prostředky a prostředky přímo ze souboru ZIP, aniž by museli rozbalit soubor ZIP.

Tyto knihovny byly portovány do C# a jsou k dispozici v rámci licence Apache 2.0. Chcete-li rychle integrovat rozšiřující soubory do existující aplikace, můžete tyto knihovny přidat do existující aplikace Xamarin.Android. Kód je k dispozici v Android.Play.ExpansionLibrary na GitHubu.