我需要上传.apk
但超过了50 MB的限制。
我在文档和一些问题上阅读了这些内容,但我很难做到这一点。
有没有人有一些教程解释如何执行此操作(使用Android Studio)以及是否有某种方法可以使用Gradle来执行此操作?
答案 0 :(得分:30)
我已经在一些项目中完成了这项工作,但我从来没有想过一个简单的方法。
的说明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服务依赖项添加到build.gradle
dependencies {
compile 'com.google.android.gms:play-services:4.0.30'
}
打开SDK Manager并安装 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 < / strong>文件夹。
对于值文件夹中的所有文件,将文件中的内容合并到项目中的匹配文件中。
创建一个扩展 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;
在此处导入您自己的项目资源。
答案 1 :(得分:2)
以下是本文最后的人员的一些helfull信息,因为有些内容在apk扩展工作方式上有所改变,而且如果你使用Android Studio来使库工作。所以你需要播放服务库和下载器库。 (如果您想使用zip作为扩展文件并直接从zip中读取文件和电影而不解压缩,还可以使用zip工具。)
使用这些库,实现apk扩展下载非常容易,只需确保:
您的活动(您要实施下载的活动) 没有完成下载时扩展包的 自动)实现IDownloaderClient。
您设置了服务&amp;接收器并将其设置在清单中。
服务类中的BASE64_PUBLIC_KEY是正确的。上传 第一个apk =&gt;查看开发人员控制台中的Services和API 在你的app =&gt;下此应用的许可证代码。
此代码用于查看是否可以在设备上找到扩展文件:
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工具(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());
其他强>
对于所有其他内容(如图像),您只需获取zipresourcefile的输入流:
expansionFile.getInputStream(pathToFileInsideZip);`
另外请确保您不压缩zip中的视频以使其正常工作! 例如,不压缩.mp4文件:
zip -n .mp4 -r zipfile.zip . -x ".*" -x "*/.*"
注1
您不能再使用草稿了,因为获取扩展文件的链接尚未生效。您必须先使用扩展文件将版本上传到Alpha或Beta。 (只能从您上传的第二个apk中添加扩展文件)因此,请确保在单击APK下的开发人员发布部分中的详细信息时看到列出的apk扩展文件。
注2
如果您正在使用android studio并希望使用下载程序库,请不要只将程序包名称和java文件复制到您自己的应用程序src目录中。在eclipse中导入下载程序库并选择export =&gt; gradle构建文件。之后,您可以将该库导入为android studio中的模块。
注3
不确定这一点,但我认为至少需要通过Play商店下载应用程序一次,并且可以通过测试设备上的帐户访问该应用程序。因此,如果您正在使用alpha创建一个google +测试组并添加自己或其他测试设备。
答案 2 :(得分:2)
我刚刚成功制作了一个使用Android Studio扩展文件的应用。这样做是一项巨大的挑战。我的第一个建议是,如果你只想要一款大型应用程序,请将其用于Apple产品。 Apple非常适合大型应用程序。另一方面,Android几乎不可能使应用程序大于100Meg。
如果您确实希望制作一款大型Android应用,请先启动应用。但是不要使用大于22的compileSkdVersion发布任何版本的应用程序。稍后,我解释说扩展库不适用于更高版本,因此您的最终应用程序必须是22或更低版本。如果您确实发布了更高版本,则Google Store不会让您返回到第22版。在这种情况下,请放弃您的应用标识符并使用版本22制作新应用。
您需要的库和代码可以通过 tools-&gt; android-&gt; SDK Manager &#34;获得。在SDK工具标签上,选择并加载 Google Play APK扩展程序库和 Google Play许可库。在SDK Manager窗口的顶部,请注意 Android SDK位置:字段。下载后,您可以在 extras / google 下的SDK目录中找到这些文件。此时,您感兴趣的目录称为 market_apk_expansion 和 market_licensing 。
有关扩展文件的Android文档为您提供了将这些库链接到项目中的说明。我花了好几个小时尝试做这项工作。通常,Android Studio会做坏事。首先,当您输入的内容不正确时,它似乎永远不会给出错误消息。我有两次使扩展文件工作,我将库合并到我的应用程序中,并没有使用Android Studio的库功能。但是,将库放入您的应用程序并不容易。
首先,我应该解释一下这些库是旧的,不适用于最新的SDK版本。我能够使用22的 compileSdkVersion 来使用库。(请参阅模块的 build.gradle:app 。)targetSdkVersion应为22.并且在< strong>依赖你应该编译&com; android.support:appcompat-v7:22.2.1&#39; 。这将允许您使用DisplayWebpageActivity.class。我认为这是在版本23中添加的,但它似乎适用于这个版本的22.我还添加了 compile&#39; com.google.android.gms:play-services-appindexing:8.1.0&#39 ; 但我不知道这是否必要。
在我看来,普通人没有希望编写下载应用程序所需的代码。我使用了包含在&#34; extras&#34;中的示例代码。您可以在 / extras / google / market_apk_expansion / downloader_sample 中找到此示例。你需要做的是使这个示例应用程序(除了加载.obb文件之外什么都不做)成为应用程序的开始页面。向示例程序添加一个Intent,以便在存在.obb文件时调用应用程序的真实第一页。
示例程序包含一个&#34; res&#34;目录和三个.java文件。您需要将三个.java文件放入主java目录中。更改&#34; res&#34;的名称目录(到&#34; res2&#34;)并将其放入包含您的普通&#34; res&#34;的同一目录中。目录。让Android Studio同时识别&#34; res&#34;您将以下内容添加到&#34; build.gradle(模块:应用程序)&#34;文件:
sourceSets {
main {
res.srcDirs = ['src/main/res']
res.srcDirs += [ 'src/main/res2']
res.srcDirs += [ 'src/main/res3']
}
}
以上内容位于 android {} 部分。 &#34; res3&#34;将来自图书馆。
必须修复三个.java示例文件中的所有软件包名称和一些包含以匹配您的软件包名称。在&#34; res2&#34;将有一个与您的应用名称冲突的应用名称,因此请将其删除。您必须修复清单,以便它开始执行 SampleDownloaderActivity 。并修复SampleDownloaderActivity,以便在.obb文件存在时调用应用程序的开头。
Android文档建议您将.obb文件设为zip存档。我用我的第一个扩展文件应用程序做了这个。对于我的应用程序,这不起作用。我有很多小图片。这些图像已经压缩(.jpg)。访问任何图像都很慢,所以我最终制作了一个性能不佳的应用程序。
在第二个扩展应用程序中,我使用了&#34;补丁&#34;目录的文件,并将照片放入&#34; main&#34;文件。要访问照片,需要读取补丁文件并将其放入包含照片名称,位置和长度的字典中。这使应用程序可以找到主文件中图像的位置,该文件被视为随机访问文件。我需要的照片被复制到应用程序的存储空间中,并给出了正确的名称(xxx.jpg)。然后在HTML代码中访问这些照片。
这两个库也集成到了应用程序中。有一个&#34; res&#34;重命名为&#34; res3&#34;的目录并放入与常规&#34; res&#34;相同的目录中。目录。在我的app / src / main / java / com / developer / app_name目录中,我添加了一个&#34;下载程序&#34;和&#34;许可&#34;目录。我编写了一个程序,将库移动到目录中,同时修复包名和原始包名的其他情况。该程序只获得了一些需要更改的名称。继续努力使所有这些名称得到修复,同时忽略其他一些错误。许多引用&#34; res3&#34;在我添加如下导入语句之前,目录无效:
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 / Internal storage / Android / obb中完成的,我在其中创建了一个名为com.developer.app_name的文件夹。我发现我在计算机上看到的并不总是设备中的内容。有时我必须关闭和打开设备才能看到实际存在的内容。我花了很多时间试图理解为什么当我通过计算机看到它们时,应用程序找不到.obb文件。事实上,.obb文件并不存在。
你的app在使用和不带.obb文件的调试中工作,并且没有.obb文件它告诉你它们无法从商店获得,是时候把应用程序按顺序生产了完成测试。如果这是第一次上传到商店,则上传软件无法请求.obb文件。所以上传你的应用。然后,在尝试释放它之前,更改装载编号和版本号并再次上载。这次它会要求.obb文件。
答案 3 :(得分:0)
将它们添加为模块,或者将它们作为库导入eclipse,转到Android工作室并导入非android工作室项目..转到项目目录