Шаги по созданию APK-файла расширения
Я разработал приложение и успешно работаю.
Я использовал функцию Application Licensing в своем приложении. А теперь я собираюсь загрузить приложение в Google Play.
Пожалуйста, дайте мне знать шаги, как использовать лицензирование приложений и как создать APK файл расширения?
5 ответов
Файлы расширения снимают ограничение на загрузку более 50 МБ АПК. Это файлы, которые вы должны прикрепить при загрузке 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
Это все часть загрузки, теперь часть загрузки
Прежде всего, вам необходимо скачать дополнительный пакет 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/
поэтому вы должны быть очень осторожны, чтобы проверить все дела
- Обб уже скачал
- Доступная память
- скачал но не разархивировал
- Память для выбора (см. Случаи памяти)
Случаи памяти:
если вы берете любое новое устройство или, например, Micromax Funbook, то есть три памяти
- /data/data/ (внутренняя память телефона) getFilesDirectory ()
- / mnt / sdcard / (внутренняя sdcard телефона) Environment.getExternalStorageDirectory ()
- / mnt / extsd / (внешняя sdcard) / 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());
}
}
Во-первых, предположим, что вы выполняете миграцию, используя 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
это почтовый файл, содержащий helloworld.jpg
после создания zip-файла обратите внимание на размер файла: 2. затем создайте эту папку на SD-карте, если она не существует:
/ mnt / sdcard / Android / obb / {имя вашего пакета}/
т.е./mnt/sdcard/Android/obb/com.earth.helloworld/
затем загрузите ваш файл obb на свою SD-карту, например /mnt/sdcard/Android/obb/com.earth.helloworld/patch.1.com.earth.helloworld.obb
Затем создайте метод, чтобы получить файл расширения
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; }
Наконец, используйте эти две строки, чтобы получить helloworld.jpg
InputStream istr = getExpansionFile().getInputStream(strName);
Bitmap bitmap = BitmapFactory.decodeStream(istr);
Немного полезной информации для людей, которые заканчивают здесь в этом посте, так как есть некоторые вещи, которые изменились в работе расширений apk, а также в том случае, если вы используете Android Studio для работы библиотек.
ПРИМЕЧАНИЕ 1
Вы больше не можете использовать черновик, так как ссылка для получения файла расширения еще не активна. Сначала вы должны загрузить версию для Alpha или Beta с файлом расширения. (добавление файла расширения возможно только со второго apk, который вы загружаете и загружаете). Поэтому убедитесь, что вы видите файл расширения apk в списке, когда нажимаете на информацию в разделе публикации разработчика под APK.
ЗАМЕТКА 2
Если вы используете android studio и хотите использовать библиотеку загрузчика, не просто скопируйте имя пакета и java-файлы в каталог src вашего собственного приложения. Импортируйте библиотеку загрузчика в eclipse и выберите export => файлы сборки gradle. После этого вы можете импортировать библиотеку как модуль в Android Studio.
ЗАМЕТКА 3
Не уверен в этом, но я также думаю, что необходимо загрузить приложение хотя бы один раз через игровой магазин и получить доступ к нему с помощью учетной записи на тестовом устройстве. Поэтому, если вы работаете с альфа-версией, создайте тестовую группу Google + и добавьте в нее себя или другие тестовые устройства.
КСТАТИ
С этими библиотеками довольно легко реализовать загрузку расширения apk, просто убедитесь:
ваша деятельность (та, в которой вы хотите осуществить загрузку пакета расширения, когда загрузка не была выполнена автоматически) реализует IDownloaderClient.
Вы настраиваете сервис и получателя и настраиваете их в своем манифесте.
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).
Сначала получите файл расширения, используя методы, предоставленные в библиотеке, paremeters - это целые числа, которые представляют вашу основную версию apk расширения (версия apk, где был впервые добавлен необходимый пакет расширения) и версию патча apk.
ZipResourceFile expansionFile = APKExpansionSupport.getAPKExpansionZipFile(context, APKX_MAIN_APK, APKX_PATCH_APK);
видео
Для воспроизведения видео прямо из этого zipresourcefile:
AssetFileDescriptor a = expansionFile.getAssetFileDescriptor(pathToFileInsideZip);
Теперь из этого assetFileDescriptor вы можете получить FileDescriptor и использовать его в медиаплеере. Для правильного синтаксиса, чтобы ваш медиаплеер воспроизводил видео, также необходим второй и третий параметр. Будь то начальное смещение и длина, которые вы можете получить из AssetFileDescriptor.
player.setDataSource(a.getFileDescriptor(), a.getStartOffset(), a.getLength());
Другой
Для всего остального (например, изображений) вы можете просто получить входной поток файла zipresource:
expansionFile.getInputStream(pathToFileInsideZip);`
ТАКЖЕ убедитесь, что вы не сжимаете видео в zip, чтобы это работало! например, чтобы не сжимать.mp4 файлы:
zip -n .mp4 -r zipfile.zip . -x ".*" -x "*/.*"
Просто хочу добавить некоторые вещи, которые я изучил в процессе реализации этого:
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 для своего приложения: проект компиляции (':zip_file'). Это позволяет импортировать эти библиотеки в ваш проект.
Я надеюсь, что это полезно. Я в основном потратил часы, пытаясь реализовать (сложный) код загрузки библиотеки, который указан на сайте, и в конце концов я удалил все это и просто сохранил разрешения в манифесте, и он работает нормально.
В Eclipse вашего проекта щелкните правой кнопкой мыши и выполните следующие действия: Инструменты Android-> Экспорт пакета подписанных приложений -> ....