Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

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

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

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

Примечание:

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

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

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

enter image description here

Эта загружаемая часть, теперь загружающая часть

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

enter image description here

Теперь создайте новый проект из существующего источника и импортируйте 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 Store и хранится в sdcard/Android/obb/, поэтому вам нужно быть очень осторожным, чтобы проверить все случаи

  • Obb уже загружен
  • Доступная память
  • загружен, но не распакован.
  • Память для выбора (см. Случаи памяти)

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

если вы берете какое-либо новое устройство или, например, 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());
    }
}

Ответ 2

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

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

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

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

  1. затем загрузите файл obb на ваш SDK, например. /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);
    

Ответ 3

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

ПРИМЕЧАНИЕ 1

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

ПРИМЕЧАНИЕ 2

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

ПРИМЕЧАНИЕ 3

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

BTW

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

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

  • вы настроили службу и приемник и настроили их в своем манифесте.

  • BASE64_PUBLIC_KEY в классе сервиса верен. Загрузите first 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 patch.

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

Видео

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

AssetFileDescriptor a = expansionFile.getAssetFileDescriptor(pathToFileInsideZip);

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

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

Другое

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

expansionFile.getInputStream(pathToFileInsideZip);`

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

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

Ответ 4

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

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'). Это позволяет импортировать эти библиотеки в ваш проект.

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

Ответ 5

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