Как создать файлы расширения в Android?

У меня есть проект размером более 50 МБ. У меня есть несколько изображений и видео в необработанной папке. Как я могу создать файл расширения? я просмотрел документ разработчика, но он не ясен для меня. Это сбивает с толку. Может ли кто-нибудь помочь мне в этом.

Должен ли я скопировать исходную папку из проекта и вставить ее на рабочий стол, а затем заархивировать всю эту папку с форматом имени, указанным в документах Google? пример: у меня есть имя пакета «com.my.package», с кодом версии 1 и основным файлом расширения. мне нужно заархивировать всю необработанную папку и указать имя как «main.1.com.my.package.zip»

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

Я использовал приведенный ниже код для доступа к файлам в необработанной папке. как я могу изменить это, чтобы получить доступ к файлам из файлов расширения, хранящихся на SD-карте?

String path1 = "android.resource://" + getPackageName() + "/" + R.raw.e4;

person user1903270    schedule 23.04.2013    source источник
comment
возможный дубликат файла расширения Android   -  person Simon    schedule 23.04.2013
comment
Я использовал этот код. InputStream fileStream = extensionFile.getInputStream(background/flower.png); Но я получаю сообщение об ошибке в flower.png, ошибка заключается в том, что цветок не может быть преобразован в переменную.   -  person user1903270    schedule 23.04.2013
comment
Для тех, кто беспокоится об ограничении в 50 МБ, теперь установлено 100 МБ. Может быть достаточно, чтобы избавиться от файлов расширения. 100 МБ - это много с proguard и сокращением ресурсов, большинство приложений, вероятно, имеют размер 100 МБ или меньше, за исключением больших приложений и игр.   -  person Zoe    schedule 28.07.2017


Ответы (4)


Постарайтесь максимально уменьшить размер. Вы можете включить proguard в режиме выпуска. Инструмент ProGuard сокращает, оптимизирует и запутывает ваш код, удаляя неиспользуемый код и переименовывая классы, поля и методы с семантически неясными именами. В результате получается файл .apk меньшего размера, который сложнее реконструировать.

Вы можете проверить ссылку ниже.

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

Чтение из ZIP-файла

При использовании библиотеки APK Expansion Zip Library для чтения файла из ZIP обычно требуется следующее:

// Get a ZipResourceFile representing a merger of both the main and patch files
ZipResourceFile expansionFile = APKExpansionSupport.getAPKExpansionZipFile(appContext,
    mainVersion, patchVersion);

// Get an input stream for a known file inside the expansion file ZIPs
InputStream fileStream = expansionFile.getInputStream(pathToFileInsideZip);

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

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

Редактировать:

Ознакомьтесь с Учебником по ссылке

http://ankitthakkar90.blogspot.in/2013/01/apk-expansion-files-in-android-with.html

person Raghunandan    schedule 23.04.2013
comment
DexGuard также является другим инструментом сжатия, но я думаю, что он лучше защищает код (анти-реверс-инжиниринг). Создано теми же людьми, которые сделали proguard - person Zoe; 09.05.2017

Вы можете просто заархивировать файлы в один файл, а если он превышает 2 ГБ, заархивировать в 2 файла (каждый до 2 ГБ).

Альтернативой является создание собственного алгоритма объединения всех файлов в один файл.

person android developer    schedule 23.04.2013
comment
An alternative is that you create your own algorithm for putting all of the files together into a single file. - Какой тип алгоритма? Если вы просто поместите файлы в один файл .zip и конвертируете его в .obb при загрузке в Google Play, как вы реализуете алгоритм? И кроме того, какова именно цель этого алгоритма? - person Zoe; 08.05.2017
comment
@LunarWatcher Существует множество алгоритмов, которые вы можете придумать или выбрать, чтобы сжать или, по крайней мере, сохранить несколько файлов в один. Целью может быть лучшая безопасность/сжатие. - person android developer; 08.05.2017
comment
Значит, цель алгоритма — хранить несколько файлов в одном файле и сжимать их до минимального размера? - person Zoe; 08.05.2017
comment
@LunarWatcher Это то, что я написал алгоритм для объединения всех файлов в один файл. Уровень сжатия и алгоритм - это то, что вам нужно выбрать, если хотите. - person android developer; 08.05.2017

Вот шаги, необходимые для настройки файлов расширения в Android:

  1. Сначала откройте Android SDK Manager, разверните Extras и загрузите:

    • Google Play Licensing Library package
    • Пакет библиотеки расширений Google Play APK
  2. Объявите следующие разрешения в AndroidManifest.xml.

    <!-- Required to access Google Play Licensing -->  
    <uses-permission android:name="com.android.vending.CHECK_LICENSE" />
    
    <!-- Required to download files from Google Play -->  
    <uses-permission android:name="android.permission.INTERNET" />
    
    <!-- Required to keep CPU alive while downloading files (NOT to keep screen awake) -->  
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    
    <!-- Required to poll the state of the network connection  
        and respond to changes -->
    <uses-permission  
        android:name="android.permission.ACCESS_NETWORK_STATE" />
    
    <!-- Required to check whether Wi-Fi is enabled -->  
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
    
    <!-- Required to read and write the expansion files on shared storage -->  
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />  
    
  3. Интеграция библиотек

    • Copy the source for the Downloader Library from <sdk>/extras/google/play_apk_expansion/downloader_library/src to your project.
    • Скопируйте исходники из <sdk>/extras/google/play_licensing/library/src в свой проект.
    • Скопируйте исходники из <sdk>/extras/google/google_market_apk_expansion/zip_file/ в свой проект.
  4. Теперь создайте новый пакет с именем extension и создайте DownloaderService.java внутри пакета.

    // DownloaderService.java
    public class DownloaderService extends com.google.android.vending.expansion.downloader.impl.DownloaderService {  
        public static final String BASE64_PUBLIC_KEY = "<<YOUR PUBLIC KEY HERE>>"; // TODO Add public key
        private static final byte[] SALT = new byte[]{1, 4, -1, -1, 14, 42, -79, -21, 13, 2, -8, -11, 62, 1, -10, -101, -19, 41, -12, 18}; // TODO Replace with random numbers of your choice
    
        @Override
        public String getPublicKey() {
            return BASE64_PUBLIC_KEY;
        }
    
        @Override
        public byte[] getSALT() {
            return SALT;
        }
    
        @Override
        public String getAlarmReceiverClassName() {
            return DownloaderServiceBroadcastReceiver.class.getName();
        }
    }
    
  5. Создайте DownloaderServiceBroadcastReceiver.java расширение BoradcastReceiver, которое запустит службу загрузки, если файлы необходимо загрузить.

    // DownloaderServiceBroadcastReceiver.java
    public class DownloaderServiceBroadcastReceiver extends android.content.BroadcastReceiver {  
        @Override
        public void onReceive(Context context, Intent intent) {
            try {
                DownloaderClientMarshaller.startDownloadServiceIfRequired(context, intent, DownloaderService.class);
            } catch (PackageManager.NameNotFoundException e) {
                e.printStackTrace();
            }
        }
    }
    
  6. Запустите загрузку из своей активности, если файлы расширения недоступны.

    Intent launchIntent = MainActivity.this.getIntent();
    Intent intentToLaunchThisActivityFromNotification = new Intent(MainActivity.this, MainActivity.this.getClass());
    intentToLaunchThisActivityFromNotification.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
    intentToLaunchThisActivityFromNotification.setAction(launchIntent.getAction());
    
    if (launchIntent.getCategories() != null) {
        for (String category : launchIntent.getCategories()) {
            intentToLaunchThisActivityFromNotification.addCategory(category);
        }
    }
    
    // Build PendingIntent used to open this activity from notification
    PendingIntent pendingIntent = PendingIntent.getActivity(MainActivity.this, 0, intentToLaunchThisActivityFromNotification, PendingIntent.FLAG_UPDATE_CURRENT);
    // Request to start the download
    int startResult = DownloaderClientMarshaller.startDownloadServiceIfRequired(this, pendingIntent, DownloaderService.class);
    

Полную информацию и код см. на странице . Как настроить приложение Android для поддержки файлов расширения.

person Sapan Diwakar    schedule 26.04.2015

Существует 2 типа файлов расширения, основной и патч. Вы можете поместить все свои данные (изображения/файлы) в одну папку. Назовите его как main.1.com.my.package. Здесь main указывает на его основной файл расширения. Если это исправление, чем имя, то patch.1...
1 — это код версии в вашем манифесте, чем имя вашего пакета. Заархивируйте этот файл и переименуйте этот заархивированный файл с расширением .obb. Удалите .zip с конца, так что теперь ваш файл расширения готов с именем main.1.com.my.package.obb.

Вы должны загрузить этот файл с фиктивным приложением на рынок. Затем вам нужно загрузить этот файл с кодировкой (вы можете получить образец из библиотеки загрузки в sdk/extras/google/play_apk_expansion)
Этот файл загружается на месте в мобильном телефоне mnt/sdcard/android/obb

Затем вы можете использовать этот файл, разархивировать файлы, сохранить его в любом другом месте и использовать.

Вы больше не можете получать файлы из папки Raw, если используете файл расширения.

Я успешно сделал это сам. Надеюсь, это поможет вам.

person djk    schedule 26.06.2013
comment
Для локального тестирования obbs, могу ли я просто передать файл adb на устройство без части загрузки/загрузки?? Пока мне не везет с креплением OBB. Я пытаюсь выяснить, не потому ли это, что я пропустил танец загрузки и скачивания... Хотя я использую NDK. - person kakyo; 14.08.2013
comment
да, локальное тестирование возможно, закинув файл в папку obb. но некоторые устройства маршрутов имеют только этот доступ к push-файлу.. если вы проверили условие для повторной загрузки, если файл есть, вы можете протестировать приложение. - person djk; 15.08.2013