2014-12-31 3 views
4

Я не могу найти надежного ответа на этот конкретный вопрос.Создание символической ссылки в Android в каталоге активов приложения

Я пытаюсь создать символическую ссылку программно из каталога в папке моих ресурсов в другом месте в каталоге ресурсов того же приложения. По сути, я хочу сделать то же самое, что и метод createSymbolicLink для Java.nio.Files.

Есть ли доступный способ сделать это с Android SDK? Если нет, возможно ли это в NDK?

+1

Вы имеете в виду вашу «папку с ресурсами» на вашей машине разработки? Или вы имеете в виду активы, когда они используются во время выполнения? Пожалуйста, имейте в виду, что активы, упакованные в вашем APK, остаются в APK и не распакованы, а просто считываются из самого APK. Также обратите внимание, что APK-файл представляет собой ZIP-архив, и AFAIK в архивах ZIP не содержит никакой символической конструкции. – CommonsWare

ответ

3

Для этого нет публичного API. Тем не менее, вы можете использовать грязное отражение, чтобы создать свою символическую ссылку. Я просто проверял следующий код и он работал для меня:

// static factory method to transfer a file from assets to package files directory 
AssetUtils.transferAsset(this, "test.png"); 

// The file that was transferred 
File file = new File(getFilesDir(), "test.png"); 
// The file that I want as my symlink 
File symlink = new File(getFilesDir(), "symlink.png"); 

// do some dirty reflection to create the symbolic link 
try { 
    final Class<?> libcore = Class.forName("libcore.io.Libcore"); 
    final Field fOs = libcore.getDeclaredField("os"); 
    fOs.setAccessible(true); 
    final Object os = fOs.get(null); 
    final Method method = os.getClass().getMethod("symlink", String.class, String.class); 
    method.invoke(os, file.getAbsolutePath(), symlink.getAbsolutePath()); 
} catch (Exception e) { 
    // TODO handle the exception 
} 

Быстрый поиск Google показал этот ответ, если вы не хотите использовать отражение: http://androidwarzone.blogspot.com/2012/03/creating-symbolic-links-on-android-from.html

+0

Как-то я пропустил эту ссылку в своих поисковых запросах Google. Я уже использую собственный код в этом конкретном проекте, так что это может удовлетворить мои потребности. Благодарю. – SBerg413

+0

Это может быть интересно для других целей, но на самом деле оно не затрагивает вопрос, который был задан. Как только вы копируете файл из активов в фактический файл файловой системы, в чем смысл создания символической ссылки, а не просто для копирования желаемого имени? –

+0

Почему он принимает только путь «getFilesDir» для файлов symlinks? Я не могу поместить его нигде, кроме него. Даже в подпапке внутри него (ну, возможно, он может создать файл там, но он недоступен для любого другого приложения). –

7

для Android API 21 и выше, просто использовать :

Os.symlink(originalFilePath,symLinkFilePath); 
+1

Для более низких версий 'Runtime.getRuntime(). Exec (" ln -s/path/to/file/path/to/symlink ")' из [ источник] (http://stackoverflow.com/a/41384476/3124150). – EmmanuelMess