分发独立于 apk 的库
Posted
技术标签:
【中文标题】分发独立于 apk 的库【英文标题】:Distribute a library separate from apk 【发布时间】:2016-09-17 09:59:49 【问题描述】:我想在我的 android 应用中使用一个库,但希望这个库对用户来说是可选的。
为了使其成为可选,我想将库与 apk 分开分发。所以:
打算使用此选项的用户可以 从应用内下载库
那些不想使用这个的人可以得到一个更小的 apk 文件。
我想问一下,是否可以将库与 apk 分开分发?。
我看到一些游戏在安装后会下载文件。所以,我觉得这可能是可以实现的,但不知道如何实现。
注意:请记住以下几点:
类或方法仅在用户已下载库的情况下使用,在其他情况下不使用。
不要将库的分布与资源的分布混淆。所以请记住,我想单独分发库而不是资源。
【问题讨论】:
安卓游戏使用扩展文件:developer.android.com/google/play/expansion-files.html 你可以把它放在一个 OOB 文件中并以这种方式分发。 @Shark 如果可以通过 OBB 文件分发库,您能告诉我如何提供对库类的引用以便导入它们吗? 你会将一个库与什么都不做的存根方法捆绑在一起?很抱歉这么说,但需要更多信息。更具体地说 - 一个用例。 @Shark 该库仅在用户选择使用它的情况下使用,而不是在其他情况下使用。 【参考方案1】:我不认为你可以使用库作为扩展文件,因为如果你在项目中使用任何类,库的方法你必须导入它们,并且你不能在项目中不使用库的情况下导入它们,但我是不确定。
更多详情请查看以下链接。
https://developer.android.com/google/play/expansion-files.html
【讨论】:
类或方法仅在用户下载库的情况下使用,在其他情况下不使用。【参考方案2】: 您可以使用 APK 分发基本功能 如果用户选择,您的应用程序可以下载其他文件,包括库。如果它们不是扩展文件 (OBB),那么您应该小心托管它们。必须以类似的方式加载这些额外的库:
for (File pluginFile : pluginFiles)
try
JarFile jarFile = new JarFile(pluginFile);
Enumeration<? extends JarEntry> entries = jarFile.entries();
while (entries.hasMoreElements())
JarEntry entry = entries.nextElement();
if (entry.getName().endsWith(".class"))
URLClassLoader loader = URLClassLoader.newInstance(new URL[]pluginFile.toURI().toURL());
System.out.println(entry.getName());
Class<?> entryClass = loader.loadClass(entry.getName().replace(".class", "").replace("/", "."));
if (isPlugin(entryClass))
IPlugin plugin = (IPlugin)entryClass.newInstance();
plugins.add(plugin);
System.out.println("Added plugin \'" + plugin.getPluginId() + "\' from \'" + pluginFile.getName() + "\'");
catch (InstantiationException | ClassNotFoundException | IOException | IllegalAccessException e)
e.printStackTrace();
这假设您要加载 JAR 文件。
【讨论】:
抱歉,有些地方不明白这段代码的作用。但是想问一下与此相关的问题,1.此代码是否只需要运行一次,即在下载库之后或每次用户运行应用程序时? 2. 是否会像我将库捆绑在 apk 中一样工作,即具有相同的效率? 代码从 JAR 文件加载类,以便您的应用程序可以使用它们。 1. 每次用户启动应用时都需要运行这段代码。 2. 我想它会增加一点开销,所以会慢一点,但用户可能不会注意到它(除非这个库很大)。 谢谢。当用户下载库并完成后,执行代码以将类添加到 apk 或将库添加到 apk 安装中,就像它添加到与库捆绑的通常 apk 中一样,我能做些什么吗? 也许有,但我不知道。 好的。感谢您的帮助@helleye以上是关于分发独立于 apk 的库的主要内容,如果未能解决你的问题,请参考以下文章
Firebase 应用分发:“找不到 APK”(构建 AAB 时)