java - 调用 APK 文件内的目录时 ZipEntry 返回 null

标签 java android apk zip ipa

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

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 查看内部): enter image description here

最佳答案

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

APK 中存在的文件例如:

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

但是不会有 liblib/armeabi-v7a 的条目。

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

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

关于java - 调用 APK 文件内的目录时 ZipEntry 返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56332648/

相关文章:

java - RxJava 比较来自两个可观察对象的不同项目 (java 7)

java - 如何切换到 Intellij 中的另一个颠覆分支?

java - 演示中未显示转换按钮

android - 我可以更改我在 Google Play 上发布的应用程序的包名吗

android - 在多台设备上安装我的 Beta Android 应用程序进行测试

java - 理解装饰器设计模式

java - PipeLine释放资源lambda

android - 我如何在android shell中进行计算

安卓 |从 mysql 更新 sqlite 或使用更新的 sqlite 数据库更新应用程序?

java - Android中AAR、JAR、DEX、APK的区别