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

Как сделать Android Expansion File с помощью Android Studio?

Мне нужно загрузить .apk, но он превышает 50 МБ.

Я читал об этом по документации и некоторым вопросам, но мне трудно выполнить эту работу.

Есть ли у кого-нибудь учебник, объясняющий, как это сделать (с помощью Android Studio), и если есть какой-то способ использовать Gradle для этого?

4b9b3361

Ответ 1

Я сделал это по нескольким проектам, но я никогда не понял простой способ. Инструкции в

http://developer.android.com/google/play/expansion-files.html

помог мне разобраться с основами, но я обнаружил, что части процесса (например, "проект обновления Android" ) не работают с Gradle.

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

Добавьте эти разрешения в AndroidManifest.xml

<uses-permission android:name="com.android.vending.CHECK_LICENSE"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES"/>

Добавить зависимость Службы Служб для сборки .gradle

dependencies {

    compile 'com.google.android.gms:play-services:4.0.30'
}

Откройте диспетчер SDK и установите Библиотека расширения Google Play APK и Библиотека лицензирования Google Play.

Скопируйте исходные файлы java из этих папок в папку source/main/java:

YOUR-ANDROID-SDK-FOLDER\extras\google\play_apk_expansion\zip_file\src

YOUR-ANDROID-SDK-FOLDER\extras\google\play_apk_expansion\downloader_library\src

YOUR-ANDROID-SDK-FOLDER\extras\google\play_licensing\library\src

Откройте

YOUR-ANDROID-SDK-FOLDER\extras\google\play_apk_expansion\downloader_library\res

Скопируйте drawable-hdpi, drawable-mdpi и макет в каталог источник/главная/res.

Для всех файлов в папках значения слияние содержимого из файла в соответствующий файл в вашем проекте.

Создайте класс, который расширяет android.content.BroadcastReceiver

Добавьте в свой манифест что-то подобное:

<receiver android:name="mypackage.MyReceiver"/>

Создайте класс, который расширяет com.google.android.vending.expansion.downloader.impl.DownloaderService

Добавьте в свой манифест что-то подобное:

<service android:name="mypackage.MyDownloaderService"/>

Скомпилируйте проект и найдите ошибки, относящиеся к

import com.android.vending.expansion.downloader.R;

Вместо этого импортируйте свои ресурсы проекта.

Ответ 2

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

С этими библиотеками довольно легко реализовать загрузку 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 "*/.*"

ПРИМЕЧАНИЕ 1

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

ПРИМЕЧАНИЕ 2

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

ПРИМЕЧАНИЕ 3

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

Ответ 3

Добавьте их в качестве модулей, или импортируйте их в eclipse в качестве библиотек, перейдите в студию Android и импортируйте проект студии без андроида. Перейдите в каталог проекта

Ответ 4

Мне просто удалось создать приложение, которое использует файлы расширения с Android Studio. Это монументальная задача. Мой первый совет: если вы просто хотите большое приложение, сделайте это для продукта Apple. Apple очень хорошо прикладывает большие приложения. С другой стороны, для Android почти невозможно сделать приложение размером более 100 мегабайт.

Если вы хотите создать большое приложение для Android, сначала запустите приложение. Но не выпускайте какую-либо версию приложения с compileSkdVersion больше 22. Позже я объясню, что библиотеки расширений не работают с более поздней версией, поэтому ваше окончательное приложение должно быть версии 22 или меньше. Если вы выпустите более позднюю версию, Google Store не позволит вам вернуться к версии 22. В этом случае отмените свой идентификатор приложения и создайте новое приложение с использованием версии 22.

Библиотеки и код, который вам нужен, можно получить через tools- > android- > SDK Manager ". На вкладке Инструменты SDK выберите и загрузите Библиотека расширения Google Play APK и Библиотека лицензирования Google Play. В верхней части окна диспетчера SDK обратите внимание на поле Android SDK Location:. После загрузки вы можете найти эти файлы в своем каталоге SDK в разделе extras/google. На этом этапе интересующие вас каталоги называются market_apk_expansion и market_licensing.

Документация на Android в файлах расширений дает вам инструкции по связыванию этих библиотек с вашим проектом. Я потратил часы, пытаясь сделать эту работу. Как правило, Android Studio делает плохие вещи. Во-первых, он никогда не дает сообщений об ошибках, когда то, что вы вводите, неверно. Оба раза, когда я получал файлы расширения для работы, я включил библиотеки в свое приложение и не использовал библиотечные функции Android Studio. Однако размещение библиотек в вашем приложении непросто.

Во-первых, я должен объяснить, что эти библиотеки старые и не работают с последними версиями SDK. Мне удалось заставить библиотеки работать с compileSdkVersion из 22 (см. build.gradle для модуля: приложение.) TargetSdkVersion должно быть 22. И под зависимостей, вам следует скомпилировать 'com.android.support:appcompat-v7:22.2.1'. Это позволит вам использовать DisplayWebpageActivity.class. Я думаю, что это было добавлено в версии 23, но, похоже, работает в этой версии 22. Я также добавил компилировать 'com.google.android.gms: play-services-appindexing: 8.1.0' но я не знаю, если это необходимо.

По моему мнению, нет простых людей, которые могли бы написать код, необходимый для загрузки приложения. Я использовал код из образца, который включен в "дополнительные". Этот образец находится в /extras/google/market_apk_expansion/downloader_sample. Что вам нужно сделать, так это сделать это приложение-образец (которое ничего не делает, а загружает файлы .obb), это первая страница вашего приложения. Добавьте намерение в примерную программу, чтобы она вызывала настоящую первую страницу вашего приложения, когда присутствуют файлы .obb.

Образец программы состоит из каталога "res" и трех файлов .java. Вам нужно поместить три файла .java в ваш основной каталог java. Измените имя каталога "res" (на "res2" ) и поместите его в тот же каталог, который содержит ваш обычный каталог "res" . Чтобы заставить Android Studio распознавать каталоги "res" , вы добавляете следующее в файл "build.gradle(Module: app)":

sourceSets {
    main {
        res.srcDirs = ['src/main/res']
        res.srcDirs += [ 'src/main/res2']
        res.srcDirs += [ 'src/main/res3']
    }
}

Вышеупомянутый раздел находится в разделе android {}. "Res3" будет получен из библиотек.

Все имена пакетов и некоторые из включений в трех файлах образца .java должны быть исправлены в соответствии с вашим именем пакета. В "res2" будет имя приложения, которое конфликтует с вашим именем приложения, поэтому удалите его. Вы должны исправить ваш манифест, чтобы он начал выполнять SampleDownloaderActivity. И исправьте SampleDownloaderActivity, чтобы он вызывал начало вашего приложения, когда там были файлы .obb.

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

Во втором приложении расширения я использовал файл "patch" для каталога и поместил фотографии в "основной" файл. Чтобы получить доступ к фотографии, файл исправления читается и помещается в словарь, содержащий имена фотографий, местоположения и длины. Это позволяет приложению находить, где изображение находится в главном файле, который рассматривается как файл произвольного доступа. Фотографии, которые мне нужны, копируются в хранилище для приложения и присваиваются именам (xxx.jpg). Затем фотографии попадают внутрь HTML-кода.

Две библиотеки также интегрированы в приложение. Существует каталог "res" , который переименовывается в "res3" и помещается в тот же каталог, что и в обычном каталоге res. В моем каталоге app/src/main/java/com/developer/app_name я добавил каталоги "загрузчика" и "лицензирования". Я написал программу для перемещения библиотек в свои каталоги, исправляя имена пакетов и другие вхождения исходного имени пакета. Программа получила только некоторые из имен, которые необходимо было изменить. Продолжайте исправлять все эти имена, игнорируя некоторые другие ошибки. Многие вещи, ссылающиеся на каталог "res3", не работали до тех пор, пока я не добавил оператор импорта следующим образом:

import com.developer.app_name.R;

В библиотеке лицензирования файл LicenseChecker.java содержит код, который будет сбой в SDK версии 22. Вы должны исправить этот код или использовать более старую версию SDK. Перейдите к строке 150. Прокомментируйте код, начинающийся с boolean bindResult = mContext до Context.BIND_AUTO_CREATE);. Замените его следующим:

Intent serviceIntent = new Intent(
    new String(Base64.decode("Y29tLmFuZHJvaWQudmVuZGluZy5saWNlbnNpbmcuSUxpY2Vuc2luZ1NlcnZpY2U=")));
serviceIntent.setPackage("com.android.vending");

В библиотеке есть еще несколько ошибок, в которых Android Studio дает хорошие рекомендации по их исправлению.

Во время отладки вы можете вручную поместить файлы .obb на свое устройство. На моем Android это делается в Nexus 5/Внутреннее хранилище /Android/obb, где я создаю папку с именем com.developer.app_name. Я обнаружил, что то, что я вижу на своем компьютере, - это не всегда то, что есть в устройстве. Иногда я должен выключить и выключить устройство, чтобы увидеть, что на самом деле существует. Я потратил много времени, пытаясь понять, почему приложение не могло найти файлы .bb, когда я мог видеть их через компьютер. На самом деле файлов .bb не было.

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