ZipEntry возвращает ноль при вызове каталога внутри файла APK - PullRequest
0 голосов
/ 28 мая 2019

Я пытаюсь настроить функцию, в которой apk-файлы помещаются в указанный каталог, сохраняются в массиве [], затем проходят цикл for-each, создают экземпляр ZipFile, затем создают ZipEntry для вызова библиотеки lib.и прочитайте имена файлов внутри, чтобы определить, какие apks совместимы для устройств 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, но когда я пытаюсь вызватьZipEntry для каталога lib, возвращает Null.Я не уверен, что я забыл и что я не собираюсь добавлять, чтобы прочитать содержимое внутри.Я видел решения, в которых файл Zip / apk был извлечен и затем прочитан, но я хочу только прочитать содержимое в каталоге lib.Это возможно?

Скриншот того, что внутри APK-файла видно, что файл lib существует (используется 7-Zip, чтобы заглянуть внутрь): enter image description here

1 Ответ

1 голос
/ 28 мая 2019

Каталоги не существуют в формате zip. Они искусственно отображаются в инструментах рабочего стола, но в zip-библиотеках отображаются только имеющиеся файлы, за исключением каталогов.

Таким образом, файлы, присутствующие в APK, будут:

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

Но не было бы записей для lib или lib/armeabi-v7a.

Таким образом, вы можете проверить, находится ли ZipEntry в каталоге "lib", вызвав:

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