【问题标题】:ZipEntry returns null When Calling for a Directory Inside an APK File调用 APK 文件内的目录时,ZipEntry 返回 null
【发布时间】:2019-05-29 02:26:38
【问题描述】:

我正在尝试设置一个函数,其中将 apk 文件放置在指定目录中,存储到数组 [] 中,然后通过一个 for-each 循环,创建一个 ZipFile 实例,然后创建一个 ZipEntry 来调用该库目录,并读取其中的文件名,以帮助确定哪些 apk 与当前连接到 PC 的 androids 设备兼容。这是我到目前为止的代码:

public File[] apkFileList;
private HashMap<String, File> apkInstallOptions = new HashMap<String, File>();

public void createAPKList() throws ZipException, IOException {
    apkFileList =  new File(".....(many dirs later)/APKDir/APKFiles").listFiles();
    System.out.println(apkFileList[apkFileList.length-1].getName());
    apkInstallOptions = storeAndSortFiles(apkFileList, apkInstallOptions);
}

private HashMap<String, File> storeAndSortFiles(File[] fileList, HashMap<String, File> storageList) throws ZipException, IOException{
    ZipFile apkDetails;
    for(File apk : fileList) {
        apkDetails = new ZipFile(apk);
        ZipEntry libFiles = apkDetails.getEntry("lib/");
        libFiles.isDirectory();
        InputStream inputStream = apkDetails.getInputStream(libFiles);
        BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));
        String line = null;
        while((line = br.readLine()) != null) {
            System.out.println(line);

        }

    }
    return storageList;
}

当我运行代码以测试到路径的映射是否正常时,我得到了正确的 apk 名称,但是当我尝试为 lib 目录调用 ZipEntry 时,它返回 Null。我不确定我忘记了什么以及我没有考虑添加什么来阅读里面的内容。我已经看到了提取 Zip/apk 文件然后读取的解决方案,但我只想读取 lib 目录中的内容。那可能吗?

在 APK 文件中看到的确实存在 lib 文件的屏幕截图(使用 7-Zip 进行查看):

【问题讨论】:

    标签: java android apk zip ipa


    【解决方案1】:

    zip 格式的目录不存在。它们被人为地显示在桌面工具中,但 zip 库仅显示存在的实际文件,不包括目录。

    因此,APK 中存在的文件将是:

    lib/arm64-v8a/libhello.so
    lib/armeabi-v7a/libhello.so
    

    但是liblib/armeabi-v7a 将没有条目。

    因此,您可以通过调用来测试 ZipEntry 是否位于“lib”目录下:

    zipEntry.getName().startsWith("lib/");
    

    【讨论】:

    • 更准确地说,zip 库中的目录有时表示为空文件,但它们不增加任何值,因此经常被删除。
    • 除了 zip 类之外,是否有其他类可以将目录存储在 zip 或 apk 文件夹中?目前,我正在考虑创建一个临时文件来存储提取的文件,读取所需的文件夹,然后删除临时文件,然后继续执行 for 循环。
    • 为什么需要存储目录条目?它们不会包含里面有哪些文件的信息。相反,只需检查zipEntry.getName().startsWith("lib/"),您就会知道该文件是否在该目录中。
    • 对不起,我认为我在上一条评论中没有说清楚。我想要的是读取 Lib 目录中的目录名称并将名称存储在字符串列表中。在 lib 下找到的名称不需要从 lib/ 中读取。 AndroidManifest.xml 会包含该排序信息吗?
    • 不支持获取与模式匹配的文件,但您可以按照接受的解决方案的建议浏览所有 zip 条目。我没有意识到您正在尝试使用该模式调用 ZipFile.getEntry() 。您显然需要浏览所有条目并按照我的建议比较条目的名称。抱歉没有更明确。
    猜你喜欢
    • 2019-05-21
    • 1970-01-01
    • 2015-03-08
    • 2013-09-04
    • 2013-09-26
    • 2016-09-27
    • 2014-01-09
    • 2017-06-22
    • 2014-08-30
    相关资源
    最近更新 更多