如何在android中生成扩展文件?

时间:2013-04-23 05:27:38

标签: android apk apk-expansion-files

我的项目超过50MB。我在原始文件夹中有一些图像和视频。如何生成扩展文件?我已经浏览了开发人员文档,但对我来说并不清楚。它令人困惑。任何人都可以帮助我。

我应该从项目中复制原始文件夹并将其粘贴到桌面上,然后使用google docs中给出的名称格式压缩整个文件夹? 例如:我的包名为“com.my.package”,版本代码为1,主扩展文件为。     我是否必须压缩整个原始文件夹并将其命名为“main.1.com.my.package.zip”

创建后,我需要从项目文件夹中删除原始文件夹,然后我需要更改项目中的代码以从存储位置访问文件。我怎么能这样做?

我使用以下代码访问raw文件夹中的文件。如何更改此设置以访问存储在SD卡中的扩展文件中的文件?

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

4 个答案:

答案 0 :(得分:2)

尽量减小尺寸。您可以在发布模式下启用proguard.ProGuard工具通过删除未使用的代码并使用语义模糊的名称重命名类,字段和方法来缩小,优化和混淆代码。 结果是较小的.apk文件,更难以进行逆向工程

您可以查看以下链接。

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

从ZIP文件中读取

使用APK扩展Zip库时,从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

答案 1 :(得分:1)

您可以将文件压缩到单个文件中,如果超过2 GB,则压缩为2个文件(每个文件最多2GB)。

另一种方法是创建自己的算法,将所有文件放在一个文件中。

答案 2 :(得分:0)

有两种类型的扩展文件,主要和补丁。您可以将所有数据(图像/文件)放在一个文件夹中。把它命名为 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文件夹中获取文件。

我自己成功完成了这项工作。希望它可以帮到你。

答案 3 :(得分:0)

以下是在Android中设置扩展文件所需的步骤:

  1. 首先,打开Android SDK Manager,展开Extras并下载:

    • Google Play许可库包
    • 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. 整合图书馆

    • 将下载程序库的源代码从<sdk>/extras/google/play_apk_expansion/downloader_library/src复制到您的项目中。
    • 将来源从<sdk>/extras/google/play_licensing/library/src复制到您的项目中。
    • 将来源从<sdk>/extras/google/google_market_apk_expansion/zip_file/复制到您的项目中。
  4. 现在,创建一个名为expansion的新包,并在包中创建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);
    
  7. 有关完整的详细信息和代码,请查看How to Set Up Android App to Support Expansion Files