【问题标题】:Symbolic Link Creation in Android Within an Application's Asset Directory在应用程序的资产目录中在 Android 中创建符号链接
【发布时间】:2014-12-31 21:23:41
【问题描述】:

我似乎无法为这个特定问题找到可靠的答案。

我正在尝试以编程方式为同一应用程序资产目录中另一个位置的资产文件夹中的目录创建符号链接。本质上,我希望做与 Java.nio.Files 的 createSymbolicLink 方法相同的事情。

有没有一种可用的方法来使用 Android SDK 做到这一点?如果没有,在NDK中可以吗?

【问题讨论】:

  • 你指的是你的开发机器上的“资产文件夹”吗?或者您是指在运行时使用的资产?请记住,打包在您的 APK 中的资产仍保留在 APK 中,不会被解包,而只是从 APK 本身中读取出来的。另请注意,APK 文件是 ZIP 存档,并且 AFAIK 在 ZIP 存档中没有符号链接结构。

标签: java android android-ndk symlink


【解决方案1】:

对于 Android API 21 及更高版本,只需使用:

Os.symlink(originalFilePath,symLinkFilePath);

【讨论】:

  • 对于来自source的低版本Runtime.getRuntime().exec("ln -s /path/to/file /path/to/symlink")
【解决方案2】:

没有公共 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

【讨论】:

  • 不知何故我在我的谷歌搜索中错过了那个链接。我已经在这个特定项目中使用了一些本机代码,所以这可能会满足我的需求。谢谢。
  • 这对于其他目的可能很有趣,但它实际上并没有解决所提出的问题。一旦您将文件从资产复制到实际的文件系统文件中,创建符号链接而不是仅仅为副本提供所需的名称有什么意义?
  • 为什么它只接受符号链接文件的“getFilesDir”路径?除了那里,我不能把它放在其他任何地方。甚至不在其中的子文件夹中(它可以在那里创建文件,但任何其他应用程序都无法访问)。
  • @androiddeveloper 它就像任何其他类unix系统一样。您创建的文件与您的应用程序具有相同的 UID。其他应用程序无法访问这些文件,除非它们具有共享的 UID。此外,Android 上不允许在外部存储上创建符号链接。
  • @JaredRummler 它用于创建符号链接和共享它的唯一路径是在“getFilesDir”的确切路径中。为什么它不适用于此路径中的其他路径(子文件夹)?另外,我可以假设这种创建符号链接的方法适用于所有 Android 设备吗?我已经测试过了,它可以在 ICS (4.0.x) 之后的 Android 模拟器上运行。有没有更官方的方法来做到这一点?使用 JNI 选项会更安全吗?遗憾的是,我从未成功创建在 Android-Studio 上使用 JNI 的库/项目。
猜你喜欢
  • 1970-01-01
  • 2023-03-14
  • 2018-08-17
  • 1970-01-01
  • 1970-01-01
  • 2012-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多