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 pro Android, který google Play stanoví. Tento limit závisí na verzi Androidu, na kterou váš APK cílí:

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

Aby se toto omezení vyřešilo, 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 APK a uloží se do umístění sdíleného úložiště (SD karta nebo oddíl USB připojitelný) na zařízení. Na několika starších zařízeních se rozšiřující soubory nemusí automaticky instalovat s 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 se považují 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. Obecně platí, že doporučený přístup k rozšiřujícím souborům je následující:

  • 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čeno 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 musí být nahrány ve stejnou dobu jako soubor APK. Google Play neumožňuje, aby se rozšiřující soubor nahrál do existujícího APK nebo aby se aktualizovaly existující sady APK. Pokud je nutné aktualizovat rozšiřující soubor, je nutné nahrát nový soubor APK s versionCode aktualizací.

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 .
  • package-name – Toto je název balíčku java-style aplikace.

Po stažení by se rozšiřující soubory neměly přesouvat, měnit, přejmenovávat ani odstraňovat z jejich umístění na zařízení. Uděláte to tak, že se rozšiřující soubory znovu stáhnou a staré soubory se odstraní. Kromě toho by adresář rozšiřujícího souboru měl obsahovat pouze soubory rozšiřujícího balíčku.

Rozšiřující soubory nenabízejí zabezpečení ani ochranu obsahu – jiné aplikace nebo uživatelé mohou 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 Android.OS.Environment.ExternalStorageDirectorysouboru .

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 ContentProvider. Android.Play.ExpansionLibrary obsahuje sestavení System.IO.Compression.Zip, které zahrnujeContentProvider, který umožní přímý přístup k souborům s určitými multimediálními soubory. Pokud jsou multimediální soubory zabalené do souboru ZIP, volání přehrávání médií mohou přímo používat soubory v souboru ZIP, aniž by bylo nutné rozbalit soubor ZIP. Multimediální soubory by se neměly komprimovat při přidání do souboru ZIP.

Formát FileName

Při stahování 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 součásti tohoto schématu jsou:

  • main nebo patch – Určuje, zda se jedná o hlavní nebo soubor rozšíření opravy. Může existovat jen jeden 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> – Toto je název balíčku java-style aplikace.

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

Proces stahování

Když je aplikace nainstalována z Google Play, rozšiřovací 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 tuto podmínku zvládla, musí zkontrolovat, jestli existují rozšiřující soubory, a v případě potřeby je stáhnout. Následující vývojový diagram zobrazuje doporučený pracovní postup tohoto procesu:

APK expansion flowchart

Při spuštění aplikace by se mělo zkontrolovat, jestli na aktuálním zařízení existují odpovídající rozšiřující soubory. Pokud ne, musí aplikace podat žádost o licencování aplikací Google Play. Tato kontrola se provádí pomocí knihovny pro ověřování licencí (LVL) a musí být provedena pro bezplatné i licencované aplikace. LvL se primárně používá placenými aplikacemi k vynucení licenčních omezení. Google však rozšířil LVL tak, aby se dal použít i s rozšiřujícími knihovnami. Bezplatné aplikace musí provést kontrolu LVL, ale můžou ignorovat omezení licencí. Požadavek 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 byly již staženy správné rozšiřující soubory.
  • Názvy souborů – Jedná se o název souboru (na aktuálním zařízení), do kterého se mají rozšiřující balíčky uložit.
  • Adresa URL ke stažení – adresa URL, která by se měla použít ke stažení rozšiřujících balíčků. Toto je jedinečné pro každé stahování a brzy po jeho poskytnutí vyprší platnost.

Po provedení kontroly LVL by aplikace měla stáhnout rozšiřující soubory s ohledem na následující body jako součást stahování:

  • Zařízení nemusí mít dostatek místa pro 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í uživatelských interakcí.
  • Během stahování na pozadí by se měl zobrazit indikátor průběhu.
  • Chyby, ke kterým dochází během stahování, jsou řádně zpracovány a obnovitelné.

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 jejich platnost.

Pokud se rozšiřující soubory nestáhli 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 ve službách Licencování Google zjistit názvy rozšiřujících souborů a adresu URL souborů ke stažení. Ohraničená služba pak stáhne soubory do vlákna na pozadí.

Pro usnadnění úsilí potřebného k integraci rozšiřujících souborů do aplikace společnost Google vytvořila 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 na zařízení autorizovaná k použití.
  • APK Rozšiřující knihovna ZIP (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 bez nutnosti rozbalit soubor ZIP.

Tyto knihovny byly přeneseny do C# a jsou k dispozici v rámci licence Apache 2.0. Pokud chcete 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.