Шаги по созданию файла расширения APK
Я разработал приложение и успешно работаю.
Я использовал функцию лицензирования приложений в своем приложении. И теперь я собираюсь загрузить приложение в Google Play.
Пожалуйста, дайте мне знать шаги, как использовать лицензирование приложений и как создать файл расширения APK?
Ответы
Ответ 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 файла обратите внимание на размер файла:
2. затем создайте эту папку на своей SD-карте, если она не существует:
/mnt/sdcard/Android/obb/ {имя вашего пакета}/
т.е.
/mnt/sdcard/Android/obb/com.earth.helloworld/
-
затем загрузите файл obb на ваш SDK, например.
/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);
Ответ 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- > Экспорт подписанного пакета приложений → ....