Как сделать файл расширения Android с помощью Android Studio?

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

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

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

4 ответов


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

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"/>

добавить зависимость Play Services для сборки.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 и планировка в ваш проект source/main/res.

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

создать класс, который расширяет android.содержание.Приемник BroadcastReceiver

что-то добавить как это к вашему манифесту:

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

создать класс, который расширяет com.гуглить.андроид.продажа.расширение.загрузчик.impl.DownloaderService

добавьте что-то вроде этого в свой манифест:

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

скомпилируйте проект и найдите ошибки, связанные с

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

импортируйте свои собственные ресурсы проекта здесь.


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

С этими библиотеками довольно легко реализовать расширение 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.андроид.продажа.zip-файл).

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

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

видео

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

AssetFileDescriptor a = expansionFile.getAssetFileDescriptor(pathToFileInsideZip);

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

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

другое

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

expansionFile.getInputStream(pathToFileInsideZip);`

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

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

Примечание 1

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

примечание 2.

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

Примечание. 3

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


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

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

библиотеки и код, которые вам нужны, можно получить через инструменты - > android - > SDK Manager". На вкладке Инструменты SDK выберите и загрузите Google Play apk библиотека расширения и Google Play Библиотека Лицензирования. В верхней части окна SDK Manager обратите внимание на Android SDK расположение:compile ' com.андроид.поддержка:совместимости приложений-В7:22.2.1'. Это позволит вам использовать DisplayWebpageActivity.класс. Я думаю, что это было добавлено в версии 23, но, похоже, работает в этом версия от 22. Я также добавил compile ' com.гуглить.андроид.gms: play-services-appindexing: 8.1.0' но я не знаю, нужно ли это.

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

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

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 предполагает, что вы делаете свой .obb файл zip архив. Я сделал это с моим первым приложением расширения файла. Для моего приложения это не сработало. У меня было много маленьких картинок. Эти изображения уже были сжаты (.формат JPG.) Доступ к любому изображению был медленным, поэтому я закончил тем, что плохо выполнял приложение.

во втором приложении расширения я использовал файл " патч "для каталога и поместил фотографии в" основной " файл. Для доступа к фотографии файл патча считывается и помещается в словарь, содержащий имена фотографий, местоположения и длины. Это позволяет приложению найти, где изображение в главном файле, который рассматривается как файл произвольного доступа. Фотографии, которые мне нужны, копируются в хранилище для приложения и дают их собственные имена (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 to контексте.BIND_AUTO_CREATE);. Замените его следующим:

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

есть несколько других ошибок в библиотеке, где Android Studio дает хорошие предложения о путях их исправления.

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

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


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