Шаги по созданию APK-файла расширения

Я разработал приложение и успешно работаю.

Я использовал функцию Application Licensing в своем приложении. А теперь я собираюсь загрузить приложение в Google Play.

Пожалуйста, дайте мне знать шаги, как использовать лицензирование приложений и как создать APK файл расширения?

5 ответов

Файлы расширения снимают ограничение на загрузку более 50 МБ АПК. Это файлы, которые вы должны прикрепить при загрузке apk. Каждое приложение может предоставить до 4 ГБ (2 ГБ - основной, 2 ГБ - патч) дополнительных данных для каждого APK.

Есть соглашение об именах, которое вы должны соблюдать при создании файлов расширения

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

нота:

  1. main- эти файлы без этого ваше приложение не будет запускаться
  2. patch- те файлы, которые являются дополнительными, без этого ваше приложение может работать
  3. expansion-version- версия, которую вы даете своему apk, чтобы файлы расширения другой версии не конфликтовали
  4. package-name-Это ваше уникальное имя пакета

.obb мы не добавляем, это неявно добавляется Google при загрузке

Предположим, у вас есть весь контент в вашем текущем каталоге, поэтому просто выберите весь контент и сделайте его с именем zip main.2.com.xyz.abc.zip и прикрепите его при загрузке apk

Это все часть загрузки, теперь часть загрузки

Прежде всего, вам необходимо скачать дополнительный пакет Google, нажав на SDK-Manager.

Теперь создайте новый проект из существующего источника и импортируйте market_licensing, play_apk_expansion по пути sdk-path/extras/google

Помните: бесплатное приложение не требует лицензирования, но необходима концепция расширения, вам просто не нужно беспокоиться, давая ссылку market_licensing на ваш проект, которым он будет управлять неявно.

play_apk_expansion содержит три проекта downloader_library, zip_file, downloader_sample,

Сам файл downloader_library со ссылкой на Market_licensing.

Теперь вам просто нужно сосредоточиться на downloader_sample сначала измените имя пакета (для тестирования) на имя вашего пакета (имя пакета совпадает с загруженным apk)

Очень важно

В SampleDownloaderActivity перейдите к...

private static final XAPKFile[] xAPKS = {
            new XAPKFile(
                    true, // true signifies a main file
                    2, // the version of the APK that the file was uploaded
                       // against
                    xxxxxxxxxxxL // the length of the zipfile in bytes right click on you expansion file and get the size in bytes, size must be same as zip size
            ),

    };

Теперь это действие загрузит файл расширения и сохранит его в sdcard/Android/obb/[main|patch].<expansion-version>.<package-name>.obb игнорируй obb, просто разархивируй этот файл куда хочешь (sdcard/Android/data рекомендуется, потому что он удаляет, когда ваше приложение будет удалено).

Есть последние устройства, которые загружают файлы расширения прямо из магазина Play, и они сохраняются в sdcard/Android/obb/ поэтому вы должны быть очень осторожны, чтобы проверить все дела

  1. Обб уже скачал
  2. Доступная память
  3. скачал но не разархивировал
  4. Память для выбора (см. Случаи памяти)

Случаи памяти:

если вы берете любое новое устройство или, например, Micromax Funbook, то есть три памяти

  • /data/data/ (внутренняя память телефона) getFilesDirectory ()
  • / mnt / sdcard / (внутренняя sdcard телефона) Environment.getExternalStorageDirectory ()
  • / mnt / extsd / (внешняя sdcard) / mnt / extsd

Надеюсь, что это поможет вам и будет соответствовать вашим требованиям.

И еще одна вещь использовать это ниже ZipHelper разархивировать содержимое.

ZipHelper.java

public class ZipHelper
{
    boolean zipError=false;

    public boolean isZipError() {
        return zipError;
    }

    public void setZipError(boolean zipError) {
        this.zipError = zipError;
    }

    public void unzip(String archive, File outputDir)
    {
        try {
            Log.d("control","ZipHelper.unzip() - File: " + archive);
            ZipFile zipfile = new ZipFile(archive);
            for (Enumeration e = zipfile.entries(); e.hasMoreElements(); ) {
                ZipEntry entry = (ZipEntry) e.nextElement();
                unzipEntry(zipfile, entry, outputDir);

            }
        }
        catch (Exception e) {
            Log.d("control","ZipHelper.unzip() - Error extracting file " + archive+": "+ e);
            setZipError(true);
        }
    }

    private void unzipEntry(ZipFile zipfile, ZipEntry entry, File outputDir) throws IOException
    {
        if (entry.isDirectory()) {
            createDirectory(new File(outputDir, entry.getName()));
            return;
        }

        File outputFile = new File(outputDir, entry.getName());
        if (!outputFile.getParentFile().exists()){
            createDirectory(outputFile.getParentFile());
        }

        Log.d("control","ZipHelper.unzipEntry() - Extracting: " + entry);
        BufferedInputStream inputStream = new BufferedInputStream(zipfile.getInputStream(entry));
        BufferedOutputStream outputStream = new BufferedOutputStream(new FileOutputStream(outputFile));

        try {
            IOUtils.copy(inputStream, outputStream);
        }
        catch (Exception e) {
            Log.d("control","ZipHelper.unzipEntry() - Error: " + e);
            setZipError(true);
        }
        finally {
            outputStream.close();
            inputStream.close();
        }
    }

    private void createDirectory(File dir)
    {
        Log.d("control","ZipHelper.createDir() - Creating directory: "+dir.getName());
        if (!dir.exists()){
            if(!dir.mkdirs()) throw new RuntimeException("Can't create directory "+dir);
        }
        else Log.d("control","ZipHelper.createDir() - Exists directory: "+dir.getName());
    }
}

Во-первых, предположим, что вы выполняете миграцию, используя helloworld.jpg из /assets/helloworld.jpg в свое расширение.

  1. создайте zip-файл, но со следующим шаблоном, заканчивая расширением.obb:
 `[main|patch].{expansion-version}.{package-name}.obb`

Например, если ваше имя pkg "com.earth.helloworld" и version = 1

тогда имя вашего выходного файла расширения должно быть:patch.1.com.earth.helloworld.obb
это почтовый файл, содержащий helloworld.jpg
после создания zip-файла обратите внимание на размер файла: 2. затем создайте эту папку на SD-карте, если она не существует:
/ mnt / sdcard / Android / obb / {имя вашего пакета}/
т.е./mnt/sdcard/Android/obb/com.earth.helloworld/

  1. затем загрузите ваш файл obb на свою SD-карту, например /mnt/sdcard/Android/obb/com.earth.helloworld/patch.1.com.earth.helloworld.obb

  2. Затем создайте метод, чтобы получить файл расширения

    public ZipResourceFile getExpansionFile() {
    
    String fileName = Helpers.getExpansionAPKFileName(this, false, 1);
    
            int filesize = 445461159;
    if (Helpers.doesFileExist(this, fileName, , false)) {
    
        try {
            return APKExpansionSupport.getAPKExpansionZipFile(
                    getBaseContext(), 1, 1);
    
        } catch (IOException e) {
            // TODO Auto-generated catch block
    
            e.printStackTrace();
        }
    }
    return null;       }
    
  3. Наконец, используйте эти две строки, чтобы получить helloworld.jpg
    InputStream istr = getExpansionFile().getInputStream(strName);

    Bitmap bitmap = BitmapFactory.decodeStream(istr);
    

Немного полезной информации для людей, которые заканчивают здесь в этом посте, так как есть некоторые вещи, которые изменились в работе расширений apk, а также в том случае, если вы используете Android Studio для работы библиотек.

ПРИМЕЧАНИЕ 1

Вы больше не можете использовать черновик, так как ссылка для получения файла расширения еще не активна. Сначала вы должны загрузить версию для Alpha или Beta с файлом расширения. (добавление файла расширения возможно только со второго apk, который вы загружаете и загружаете). Поэтому убедитесь, что вы видите файл расширения apk в списке, когда нажимаете на информацию в разделе публикации разработчика под APK.

ЗАМЕТКА 2

Если вы используете android studio и хотите использовать библиотеку загрузчика, не просто скопируйте имя пакета и java-файлы в каталог src вашего собственного приложения. Импортируйте библиотеку загрузчика в eclipse и выберите export => файлы сборки gradle. После этого вы можете импортировать библиотеку как модуль в Android Studio.

ЗАМЕТКА 3

Не уверен в этом, но я также думаю, что необходимо загрузить приложение хотя бы один раз через игровой магазин и получить доступ к нему с помощью учетной записи на тестовом устройстве. Поэтому, если вы работаете с альфа-версией, создайте тестовую группу Google + и добавьте в нее себя или другие тестовые устройства.

КСТАТИ

С этими библиотеками довольно легко реализовать загрузку расширения apk, просто убедитесь:

  1. ваша деятельность (та, в которой вы хотите осуществить загрузку пакета расширения, когда загрузка не была выполнена автоматически) реализует IDownloaderClient.

  2. Вы настраиваете сервис и получателя и настраиваете их в своем манифесте.

  3. BASE64_PUBLIC_KEY в классе обслуживания является правильным. Загрузите первый apk => посмотрите в Службы и API в консоли разработчика под вашим приложением => Лицензионный код для этого приложения.

Этот код используется, чтобы увидеть, можно ли найти файл расширения на устройстве:

boolean expansionFilesDelivered() {
    for (XAPKFile xf : xAPKS) {
        String fileName = Helpers.getExpansionAPKFileName(this, xf.mIsMain, xf.mFileVersion);
        Log.i(TAG, "Expansion filename " +fileName);
        if (!Helpers.doesFileExist(this, fileName, xf.mFileSize, false))
            return false;
    }
    return true;
}

Он использует класс XAPKS, представляющий файл расширения, будь то основной файл или файл исправления, имеющий определенный размер файла (в байтах) и связанный с версией apk (той, в которой он был впервые добавлен).

private static class XAPKFile {
        public final boolean mIsMain; // true
        public final int mFileVersion; //example 4
        public final long mFileSize; //example 126515695L
        // example => main expansion that was first introduced in apk version 4 and is 126515695 bytes in size

        XAPKFile(boolean isMain, int fileVersion, long fileSize) {
            mIsMain = isMain;
            mFileVersion = fileVersion;
            mFileSize = fileSize;
        }
    }

Также довольно легко читать файлы фильмов и другие материалы прямо из файла расширения, используя инструменты zip, предоставленные Google (com.android.vending.zipfile).

Сначала получите файл расширения, используя методы, предоставленные в библиотеке, paremeters - это целые числа, которые представляют вашу основную версию apk расширения (версия apk, где был впервые добавлен необходимый пакет расширения) и версию патча apk.

ZipResourceFile expansionFile = APKExpansionSupport.getAPKExpansionZipFile(context, APKX_MAIN_APK, APKX_PATCH_APK);

видео

Для воспроизведения видео прямо из этого zipresourcefile:

AssetFileDescriptor a = expansionFile.getAssetFileDescriptor(pathToFileInsideZip);

Теперь из этого assetFileDescriptor вы можете получить FileDescriptor и использовать его в медиаплеере. Для правильного синтаксиса, чтобы ваш медиаплеер воспроизводил видео, также необходим второй и третий параметр. Будь то начальное смещение и длина, которые вы можете получить из AssetFileDescriptor.

player.setDataSource(a.getFileDescriptor(), a.getStartOffset(), a.getLength());

Другой

Для всего остального (например, изображений) вы можете просто получить входной поток файла zipresource:

expansionFile.getInputStream(pathToFileInsideZip);`

ТАКЖЕ убедитесь, что вы не сжимаете видео в zip, чтобы это работало! например, чтобы не сжимать.mp4 файлы:

zip -n .mp4 -r zipfile.zip . -x ".*" -x "*/.*"

Просто хочу добавить некоторые вещи, которые я изучил в процессе реализации этого:

1) На данный момент вам не нужно реализовывать библиотеку загрузчиков и все содержимое XAPKFile, все, что вам нужно сделать, это скопировать / вставить все разрешения, которые перечислены на https://developer.android.com/google/play/expansion-files.html в файл манифеста. Может быть, вы привыкли, но Google Play Store выполняет загрузку и установку для вас. Единственная причина, по которой вам нужно будет выполнять фактическую загрузку в исходном коде, заключается в том, что пользователь вручную зашел в Android/obb и удалил ваши файлы расширения.

2) При загрузке файла.zip вам не нужно указывать его в соответствии с соглашением main.version.package.obb. Просто загрузите ваш.zip файл с его оригинальным именем, и он будет переименован для вас независимо.

3) Чтобы получить доступ к zip-файлу, перейдите в меню "Файл"> "Создать"> "Модуль импорта" и импортируйте библиотеку zip_file, которая находится в том же каталоге, что и библиотеки загрузчика и лицензирования. Обязательно добавьте свои зависимости в файл build.gradle для своего приложения: проект компиляции (':zip_file'). Это позволяет импортировать эти библиотеки в ваш проект.

Я надеюсь, что это полезно. Я в основном потратил часы, пытаясь реализовать (сложный) код загрузки библиотеки, который указан на сайте, и в конце концов я удалил все это и просто сохранил разрешения в манифесте, и он работает нормально.

В Eclipse вашего проекта щелкните правой кнопкой мыши и выполните следующие действия: Инструменты Android-> Экспорт пакета подписанных приложений -> ....

Другие вопросы по тегам