lib 的内容如何最终出现在 Android *.apk 文件中?

How does the content of lib end up in a Android *.apk file?

Android 应用程序 apk 文件实际上是 zip。使用 (JNI),即本机代码意味着将 *.so 文件添加到您的 apk 中。我的问题是它们实际上是如何进入 apk 文件的?

到目前为止我知道,查看 example 这样的 *.so 是如何在 Java 代码中构建和使用的。我已经知道的是这些文件最终是如何像这样存储在 apk/zip 存档中的:

res/
assets/
META-INF/
lib/
  |<arch1>
        |libSharedNativeLib1.so
        |libSharedNativeLib2.so
  |<arch2>
        |libSharedNativeLib1.so
        |libSharedNativeLib2.so
AndroidManifest.xml
classes.dex
resources.arsc

我也知道条目 classes.dexAndroidManifest.xmlresources.arscassetsresMETA-INFO 是如何制作的。它是 aaptjarsigner 的连续。我唯一不知道的是现在 lib 已放入 apk。

背景

我喜欢保持简单。使用 Android StudioEclipse 之类的 IDE 似乎是一种很好的绕过这里的方式,因为它们使用户对实际 automagically 背景中发生的事情有些不知所措构建过程(在各种构建工具的帮助下完成,例如 ANT、Maven、Grandle、Groovy...)

虽然这些工具并没有什么坏处,但它们往往会减少“构建 apk”技巧所需的知识,因此似乎减少了有关手动实现相同方法的文档事物。当 zip 文件最终进入 apk/zip 存档时,了解 Grandle 实际做了什么会对我有很大帮助。

现在我已经测试过了,这似乎有效

zip -r appfile.apk lib

并测试似乎在安装 Android 系统时实际上确实复制并链接到正确的 lib*.so 本机应用程序的位置 至

root@armdev:/data/data/name.package # ls -l
total 12
drwxr-x--x    2 10142  10142  4.0K .
drwxrwx--x  103 1000   1000   8.0K ..
lrwxrwxrwx    1 1012   1012   42 lib -> /data/app/name.package/lib/arm

现在可以假设 Androids pm install appfile.apk 只是在 apk/zip 文件中查找 lib 文件夹结构并复制 lib*so 文件和符号链接他们到 /data/data/name.package/lib,但我真的很想知道是否还有更多内容,而不是仅仅依靠上面的 zip 命令的幸运。

我已经尝试了 aapt-A(对于资产)和 -S(对于资源),但都无法通过 [= 将 lib 文件夹包含到 apk 文件中19=].

,最终将打包到文件夹 lib//lib*.so

中的 apk 文件中

我想开发一些 Android 软件(*.apk 文件/应用程序),我不使用 IDE 之类的 Android Studio 或 Eclipse,也不使用构建工具作为Grandle、Maven 或 Ant ....

使用 zip 是非常安全的(直到 Android 的未来版本中引入了一些重大更改)。您可以使用 aapt,但它不接受漂亮的 recursive 标志。您可以查看提取共享库的系统 code。没有魔法,它会打开 ZIP (a.k.a.APK) 文件的内容 table,并查找与支持的 ABI 匹配的文件。