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

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

Я использовал функцию лицензирования приложений в своем приложении. А теперь я собираюсь загрузить приложение на google play.

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


person user1414154    schedule 30.07.2012    source источник
comment
На сайте разработчика есть хорошая документация. APK Expansion Files. Вы проверили это? Это хорошо документировано с шагами.   -  person Lalit Poptani    schedule 30.07.2012
comment
Пожалуйста, дайте мне знать шаги для реализации лицензирования приложений. Я посмотрел на сайте разработчика. Тем не менее, мне нужна дополнительная помощь.   -  person user1414154    schedule 30.07.2012
comment
Ну что ты пробовал? с какой проблемой вы сталкиваетесь, что имеет значение.   -  person Lalit Poptani    schedule 30.07.2012
comment
@hotveryspicy Можете ли вы указать шаги для расширения APK?   -  person Dharmendra    schedule 30.07.2012
comment
По сути, я использую eclipse с помощью ADT, поэтому я разработал один проект библиотеки для рыночного лицензирования. и добавить проект библиотеки в мой проект приложения. внедрить исходный код лицензирования приложений в мой проект, где начальная точка проекта. Я создал один APK, загрузил его в Google Play и опубликовал. но не мог видеть в магазине Google Play.   -  person user1414154    schedule 30.07.2012
comment
@hotveryspicy: я ищу то же самое. Можете ли вы предоставить шаги для расширения APK? Изменить: проигнорируйте это, я нашел это в вашем ответе.   -  person Adil Soomro    schedule 30.07.2012
comment
@LalitPoptani мы сталкиваемся со многими ошибками в примере кода, те, кто пробует пример кода, могут получить эти ошибки stackoverflow.com/questions/11723814/   -  person LOG_TAG    schedule 01.08.2012
comment
@Subra лучше проверьте шаги, предоставленные hotveryspicy ниже.   -  person Lalit Poptani    schedule 01.08.2012
comment
Новые инструменты уже доступны, просто обновите свой SDK. developer.android.com/tools/help/jobb.html   -  person Idea Estiawan    schedule 18.11.2012
comment
@LalitPoptani я получаю эту ошибку пожалуйста, дайте мне знать, что ошибка, что я делаю?   -  person Goofy    schedule 26.02.2013
comment
Я не уверен, как это представляет собой ответ. Это должен быть комментарий.   -  person iwasrobbed    schedule 19.06.2013
comment
@ Лалит Поптани. Эта ссылка говорит вам, что делать, а не как делать. Очередной туториал по мусору от Google.   -  person    schedule 03.12.2014
comment
Документация, предоставленная Google, не была ни полезной, ни ясной. Рад, что этот вопрос был сохранен и ответы были предоставлены.   -  person daspianist    schedule 01.07.2019


Ответы (5)


Файлы расширения снимают ограничение на загрузку apk размером более 100 МБ. Вы должны прикрепить эти файлы при загрузке 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/ (внутренняя SD-карта телефона) Environment.getExternalStorageDirectory()
  • /mnt/extsd/ (внешняя SD-карта) /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());
    }
}
person Mohammed Azharuddin Shaikh    schedule 30.07.2012
comment
Я выполняю шаги, чтобы добавить код из SampleDownloadActivity в свою активность. - person user1414154; 30.07.2012
comment
после запуска кода такие ошибки, как 1›crc 2›панель загрузки, могут повлиять на ваш код. -of-android-apk-expansion-files" title="Проверка файла xapk не удалась в примере кода файлов расширения Android apk">stackoverflow.com/questions/11723814/ прокомментируйте, если возникнет такая же проблема, если я нашел решение дай знать.. - person LOG_TAG; 01.08.2012
comment
решение ошибки crc от hotveryspicy: stackoverflow.com/questions/10330283 / - person LOG_TAG; 01.08.2012
comment
щелкните правой кнопкой мыши файл расширения и получите размер в байтах, размер должен быть таким же, как размер zip, но какой размер мы должны указать? есть два типа размера файла 1> Размер на диске 2> Размер, который мы должны использовать? - person LOG_TAG; 01.08.2012
comment
@Subra игнорирует размер на диске, возьми другой. - person Mohammed Azharuddin Shaikh; 01.08.2012
comment
Спасибо! Вы думаете, что проверка файла XAPK не удалась из-за ошибки crc или размера файлов? stackoverflow.com/questions/11723814/ - person LOG_TAG; 01.08.2012
comment
Как правильно разархивировать или распаковать obb-файлы расширения APK Expansion Files? (sdcard/Android/data рекомендуется, потому что он удаляется при удалении вашего приложения). Я могу использовать этот goo.gl/OJfLk для распаковки? - person LOG_TAG; 02.08.2012
comment
@hotveryspicy спасибо, все работает! #coolverysweet проблема в том, что я должен удалить загруженный файл obb после распаковки, чтобы сэкономить место!! - person LOG_TAG; 07.08.2012
comment
@Goofy, пожалуйста, поделитесь, где вы застряли, например: LVL, проверка загрузки, распаковка / доступ к данным - person LOG_TAG; 26.02.2013
comment
я использую образец проекта, предоставленный в SDK, теперь я проверяю, существует ли файл obb, прежде чем загружать файл apk на рынок, теперь я добавил файл obb в Android/obb/com.abc.ss/main. 2.com.abc.ss.obb, но когда я запускаю пример приложения, он говорит, что неудачный ресурс загрузки не найден, но почему он загружается, поскольку я еще не загрузил его в консоль, а также файл obb уже присутствует - person Goofy; 26.02.2013
comment
@Goofy, может быть, вам нужно проверить размер файла, который вы упомянули в действии Sampledownloader! - person LOG_TAG; 26.02.2013
comment
@Subra, вы можете присоединиться сюда chat.stackoverflow.com/rooms/25141/ - person Goofy; 27.02.2013
comment
@hotveryspicy у меня возникла проблема при распаковке файла .obb. я получаю эту ошибку Не zip-файл. - person jeevamuthu; 08.05.2013
comment
Я потратил некоторое время на поиск пути sdk-path/extras/google при создании нового проекта из существующего источника. Мой sdk находился в папке my users/[username]/AppData/Local/Android/android-sdk/extras/google. Просто наведите указатель мыши на пакет в диспетчере SDK, и он покажет путь к нему. - person am_; 03.07.2013
comment
Я обнаружил, что нам нужно сделать zip-файл с нулевым сжатием. поэтому нам не нужно извлекать этот файл obb. см. этот stackoverflow.com/a/18953778/942224 - person Sanket Kachhela; 23.09.2013
comment
@SanketKachhela Да, но это когда вы имеете дело с медиафайлами, то есть с аудио/видео. Это не будет применяться к обычным файлам - person Mohammed Azharuddin Shaikh; 24.09.2013
comment
@hotveryspicy я тоже пробовал с изображениями. и это работает хорошо. - person Sanket Kachhela; 24.09.2013
comment
Этот блог кажется полезным слишком. Также этот пример - person Lalit Poptani; 25.07.2014
comment
Спасибо за объяснение. 1) Любая другая альтернатива есть или нет 2) мы можем или нет получить доступ к файлам obb напрямую без загрузки apk в магазин игр. - person Raj; 24.01.2018
comment
@AzharShaikh Вы написали эту строку в попытке использовать метод unZipEntry IOUtils.copy(inputStream, outputStream); Пожалуйста, объясните мне, что такое IOUtils Android Studio показывает ошибку. - person Nauman Shafique; 08.07.2018
comment
Могу ли я использовать звук уведомления из файла расширения? - person Pranav; 08.05.2019
comment
Еще один важный ключевой момент, в документах Google говорится: Google Play загружает ваши файлы расширения на устройство и сохраняет их в общем хранилище системы. Что произойдет, если устройство не имеет внешнего хранилища? он рухнет? @MohammedAzharuddinShaikh - person xSuperMu; 05.07.2020

Во-первых, предположим, что вы переносите файл helloworld.jpg из /assets/helloworld.jpg в расширение.

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

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

, то имя вашего выходного файла с расширением должно быть: patch.1.com.earth.helloworld.obb
представляет собой zip-файл, содержащий 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);
    
person RAY    schedule 05.01.2013
comment
Можете ли вы также предоставить класс Helpers? - person anhnt; 09.08.2015
comment
Спасибо за объяснение. 1) Любая другая альтернатива есть или нет 2) мы можем или нет получить доступ к файлам obb напрямую без загрузки apk в магазин игр. - person Raj; 24.01.2018

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

ПРИМЕЧАНИЕ 1

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

ПРИМЕЧАНИЕ 2

Если вы используете студию Android и хотите использовать библиотеку загрузчика, не просто копируйте имя пакета и java-файлы в каталог src вашего собственного приложения. Импортируйте библиотеку загрузчика в eclipse и выберите экспорт => файлы сборки 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).

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

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

Видео

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

AssetFileDescriptor a = expansionFile.getAssetFileDescriptor(pathToFileInsideZip);

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

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

Другое

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

expansionFile.getInputStream(pathToFileInsideZip);`

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

zip -n .mp4 -r zipfile.zip . -x ".*" -x "*/.*"
person Jordy    schedule 24.09.2014
comment
Спасибо за объяснение. 1) Любая другая альтернатива есть или нет 2) мы можем или нет получить доступ к файлам obb напрямую без загрузки apk в магазин игр. - person Raj; 24.01.2018

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

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 для вашего приложения: compile project(':zip_file'). Это позволяет вам импортировать эти библиотеки в свой проект.

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

person eric k atwood    schedule 14.02.2017
comment
Спасибо за объяснение. 1) Любая другая альтернатива есть или нет 2) мы можем или нет получить доступ к файлам obb напрямую без загрузки apk в магазин игр. - person Raj; 24.01.2018

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

person enjoy-writing    schedule 30.07.2012
comment
Пожалуйста, дайте мне знать шаги для реализации лицензирования приложений. Я посмотрел на сайте разработчика. Тем не менее, мне нужна дополнительная помощь. - person user1414154; 30.07.2012
comment
@ user1414154 Руководство по файлам расширений apk от Google очень хорошее, или перейдите к описанным выше деталям. В одной строке я могу сказать, что вы просто импортируете все библиотеки Marketlicensing, downloader_library, zip_file и пример кода из C:..\androidsdk\extras\google\play_apk_expansion\ downloader_sample из папки sdk C:...\android-sdk\extras\google и зайдите в свойства добавьте библиотеки в образец кода, перед загрузкой в ​​gplay измените имя пакета и добавьте код base64, размер файла расширения apk в байтах на SampleDownloaderService.java и устраните ошибку crc, если хотите! после запуска вы можете получить некоторые ошибки goo.gl/2JhWg - person LOG_TAG; 01.08.2012
comment
пользователь запросил файлы расширения apk, не экспортируя проект в apk. - person Jeongbebs; 24.04.2014
comment
это не о подписанном пользователе apk, спросите о файле расширения Apk. - person Buggy IdioT; 08.01.2015