【问题标题】:Android NDK (with SDL) build infrastructure clarificationAndroid NDK(带 SDL)构建基础架构说明
【发布时间】:2014-12-20 23:24:57
【问题描述】:

我对使用 Android、Java、NDK 和 SDL 构建东西还比较陌生。但是我一直在构建一个示例项目,其中有很多我觉得很困惑。

这是我的文件结构的打印输出 - 供参考:

MyProj
-android-project      //I created this to dump android-specific junk into
--src                 //java source files
--jni                 //"java native interface" - c/c++ source files
--AndroidManifest.xml //packaged with .apk to inform OS of various details of app
--bin                 //binary files?
---AndroidManifest.xml //Copy of AndroidManifest.xml in above dir?
---AndroidManifest.xml.d
---SDLActivity-debug-unaligned.apk
---SDLActivity-debug-unaligned.apk.d
---SDLActivity-debug.apk
---SDLActivity.ap_
---SDLActivity.ap_.d
---build.prop
---classes
---classes.dex
---classes.dex.d
---dexedLibs
---proguard.txt
---res
---rsLibs
---rsObj
--gen                 //no idea
--libs                //no idea
--obj                 //no idea
--res                 //no idea
--build.xml           //points to files regarding build config
--default.properties  //auto-generated?
--local.properties    //auto-generated?
--project.properties  //auto-generated?

所以,我有几个具体的问题,但如果我对任何假设有误,或者有一些您认为我可能遗漏的信息,我将非常感谢您了解!

无论如何-

“bin”文件夹:

我假设“bin”用于二进制文件......对吗?但好像不是。它包含 AndroidManifest.xml 的副本(为什么?)、其他一些文本内容、我的项目的 .apk 以及一堆我也不明白的文件夹。它还有一堆附加了“.d”的东西的副本(例如,“AndroidManifest.xml.d”)。为什么? 另外,如果我擦除这个文件夹,ndk-build 会失败。所以这里似乎有与构建相关的配置文件? (编辑:这是由于我的makefile错误-也感谢上帝。那部分真的没有意义...... ) 我想我的问题是:bin 文件夹的作用是什么? .d 文件是什么?哪些文件可以安全删除(在构建期间生成)?

'gen'、'libs'、'obj'、'res' 文件夹:

对这些正在发生的事情进行高级概述也会有所帮助。 :) 另外,这些中的哪些可以安全删除(在构建过程中自动生成)?

编辑: 在进一步的实验中,“gen”似乎可以安全地被擦除,并且会在构建过程中自动重新generated。

我认为可以安全地假设 'libs' 无​​法安全清除,但仍不清楚它究竟做了什么。

看起来 'obj' 也可以安全地清除 - 尽管它需要更长的构建过程,编译所有 SDL 代码等。似乎包含 SDL 的中间构建文件。

'res' 无法安全清除。仍然不知道里面有什么/它做了什么。

*.properties 文件

如果这些是自动生成的,为什么它们位于项目的根目录?我假设它们是构建过程的一些中间文件?

edit:它们都它们是自动生成的,但似乎它们不能被删除,否则构建过程将失败。它会告诉你使用'android update-project'自动生成关于'sdk.dir'(什么?)的东西(但stackoverflow搜索告诉你使用'android update project -s -t“android-19”-p .',但是由于目标无效,这也不起作用,所以我应该输入'android list targets'来找出目标,但该列表是空的,呃。所以我只是通过git重新检查了这些文件,它再次工作。所以是的 - 仍然不知道它们是什么,它们是如何生成的,它们为什么在它们所在的位置等等......

TL;DR:

感觉整个构建基础架构非常不明确/过于复杂。我错过了哪些可能对所有这些点击有所帮助的部分?

我想如果有任何好的文档来源/解释这一切到底发生了什么,我很乐意被引导到它。我发现的大部分内容都采用“哦,你想为 android 构建一些东西?嗯,点击这里,然后这里,然后这里,然后你去!它已经建成了!”的形式,我宁愿有告诉我发生了什么以及为什么/如何。

抱歉,这篇文章有点草率 - 非常感谢您回答任何问题/指向任何进一步学习的资源!

【问题讨论】:

  • “感觉整个构建基础设施都非常不明确/过于复杂” - 确实如此,而且情况变得更糟。等到ant 出现未知/无法解释的问题。或者你想不通为什么没有将原生库复制到 APK 中,或者...

标签: java build android-ndk sdl


【解决方案1】:

是的,这是一团糟。这很混乱,因为这个单一的目录树包含了 IDE 项目、交叉编译和打包的所有组织需求,而 Android 内部没有人认为保持它的整洁很重要。

如果您的 AndroidManifest.xml 有额外的副本,请忽略它们。它们应该只是包装过程的一部分。

bin 视为您的输出目录,而不仅仅是二进制文件。你真正关心的只有 apk。

.d 是最常用于目录的扩展名。因此,如果构建过程必须创建一个目录来保存有助于根据单个输入文件指导后续步骤的文件,那么它可以只在输入文件之后命名该目录并在其上加上 .d

gen 作为构建过程的一部分生成。删除是安全的,但您通常不需要这样做。

libs 是链接到您的应用所需的本地库。在某些情况下,您会将想要使用的 Java jar 放入其中。

obj 用于编译器创建的目标文件。链接器需要这些来实际创建应用程序的本机二进制文件。删除这些并重新运行编译器是安全的,但这是您正在执行的完全重新编译。

res 用于应用资源文件。 Android 需要一些文件,您可以在其中添加更多文件,以便在 Java 代码中使用。

如果您使用的是 SDL 2.0,您还应该有一个 assets 目录,其中包含您的本机代码引用的数据文件。

它确实说某些构建文件是自动生成的......但生成它们的不是您的构建。

我(勉强地)使用 Eclipse 构建我的 Android 应用程序,但您也可以使用 antndk-buildadb 在命令行上执行所有相同的操作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-13
    • 1970-01-01
    • 2018-12-31
    • 1970-01-01
    相关资源
    最近更新 更多