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.dex
、AndroidManifest.xml
、resources.arsc
、assets
、res
和 META-INFO
是如何制作的。它是 aapt
、jarsigner
的连续。我唯一不知道的是现在 lib
已放入 apk。
背景
我喜欢保持简单。使用 Android Studio
和 Eclipse
之类的 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 匹配的文件。
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.dex
、AndroidManifest.xml
、resources.arsc
、assets
、res
和 META-INFO
是如何制作的。它是 aapt
、jarsigner
的连续。我唯一不知道的是现在 lib
已放入 apk。
背景
我喜欢保持简单。使用 Android Studio
和 Eclipse
之类的 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 匹配的文件。