Mein Projekt war ursprünglich nicht für Android gedacht, und seine Assets sind in der folgenden Verzeichnisstruktur organisiert (ich hoffe, dass die ASCII-Grafik einigermaßen gut wiedergegeben wird):
/
+- engine/
| +- src/
| | enginefile1.cpp
| | ...
| `- textures/
| texture1.tex
| ...
+- game/
| +- src/
| | gamefile1.cpp
| | ...
| +- textures/
| | gametexture1.tex
| | ...
| +- ios/
| | [various iOS-specific files]
| `- android/
| | build.xml
| | AndroidManifest.xml
| +- jni/
| | Android.mk
| +- assets/
| [other Android-specific files]
`- othergame/
Mein game/android/jni
Verzeichnis ist fast leer, da es Android.mk
auf die relativen Pfade der Quelldateien in engine/src
und verweist game/src
. Tatsächlich enthält es sogar die richtigen Makefile
s, sodass ich keine Änderungen vornehmen muss, Android.mk
wenn ich dem Projekt eine Quelldatei hinzufüge oder entferne.
Beide engine
und game
bieten Assets, die mit dem Android-Build ausgeliefert werden müssen. Ich möchte build.xml
auf diese Assets verweisen, ohne sie manuell kopieren zu müssen. Eine Regel, die die Assets beim Erstellen kopiert und dann löscht, wäre akzeptabel, aber natürlich würde ich eine Nullkopie-Lösung bevorzugen. Macht das Sinn? Wie haben andere dieses plattformübergreifende Build-Problem gelöst?
quelle
res
oderassets
) ist genau das, was ich nicht tun möchte. Wie ich in der Frage sagte, beidesengine
undgame
stellen Vermögenswerte zur Verfügung, die ich versenden möchte.assets
Verzeichnis zu kopieren , sodass Sie jede spielspezifische Verzeichnisstruktur beibehalten können. Wie für Windows-Symlinks: windows7home.net/how-to-create-symbolic-link-in-windows-7Die Ant-Build-Eigenschaft "asset.dir" ist für die Angabe des Namens des Assets-Verzeichnisses verantwortlich. Es ist standardmäßig "Assets", aber Sie können es in "../assets" ändern. Dadurch wird der Pfad des gesamten Verzeichnisses geändert. Wenn Sie jedoch über Android-spezifische Ressourcen verfügen, können Sie weiterhin das Verzeichnis "res" verwenden.
quelle
Wie seltsam, dass die anderen Antworten hier Ihre Frage nicht beantworten ... alle gehen davon aus, dass Sie nur ein Assets-Verzeichnis möchten, oder verweisen auf res / anstelle von Assets /.
Ich brauche auch mehr als ein Assets-Verzeichnis.
Ich habe
<aapt>
stundenlang mit dem Ameisenmodul gekämpft und schließlich aufgegeben und festgestellt, dass es einen viel einfacheren Weg gibt.Ich kopierte den
<target name="-package-resources"...>
Tag aus der Master - Build - Datei , dassant
Anwendungen,android_sdk_dir/tools/ant/build.xml
und den Tag in mein Projekt eingefügtbuild.xml
(Sie müssen den Tag einfügen direkt vor dem Masterbuild.xml
enthalten ist, wie die Kommentare am Ende des vorgefertigten Projektesbuild.xml
erklären) und fügte hinzu : Ein zweiter Abschnitt zum einfachen Ausführenzip
, um die Assets zur AP_-Datei hinzuzufügen (die sich${out.absolute.dir}/${resource.package.file.name}
an diesem Punkt in der Ant-Datei befindet):Diese Methode hat den Vorteil, dass Sie die Verzeichnisstruktur Ihrer Assets im Quellbaum und in der apk freier definieren können (da Sie
exec
zip
mehrere Male mit unterschiedlichen Argumenten arbeiten und sogarzip
ein Skript einschließen können, daszip
von mehreren aktuellen Verzeichnissen in Ihrem ausgeführt wird Quellbaum). Sie haben auch die Möglichkeit, die Komprimierung pro Datei zu steuern (zip verfügt über die Option -0, um die Komprimierung zu unterdrücken) und müssen nicht das eingeschränkte Nocompress-Tag verwenden, das nur für Erweiterungen gilt.Beachten Sie, dass diese
ant
XML-Datei VOR zipalign im Ant-Build-Prozess verfügbar ist, sodass wir weiterhin ein "zip-kompatibles" Archiv erhalten, das die Ausrichtungsanforderungen von APKs und Android Java erfüllt.In meinem Fall habe ich eine NDK-basierte App und möchte nur über C-Code auf diese Assets zugreifen (wobei jeder APK-Pfad in Ordnung ist). Wenn Sie die Standardaufrufe für Android Java-Assets verwenden müssen, um auf diese Elemente zuzugreifen, bin ich mir nicht sicher, ob sie sich in einem Pfad innerhalb der Zip-Datei mit dem Namen Assets befinden müssen oder nicht. In diesem Fall können Sie den obigen Trick anpassen, indem
exec
Sie ein Skriptcd
für den entsprechenden Quellbaumordner erstellen und dann ausführenzip
.quelle
Ich glaube nicht, dass Sie irgendetwas außerhalb von res / verwenden können, aber wenn Sie zusätzliche Kosten für Ihren Entwicklungszyklus mit einer Kopie vermeiden möchten, können Sie versuchen, sie stattdessen zu verschieben oder vielleicht sogar eine zu verwenden symlink ...
quelle
engine
Verzeichnis verbleiben müssen , das sich in einem separaten Repository befindet. Symlinks sind möglicherweise akzeptabel, aber ich bin nicht sicher, ob sie unter Windows gut funktionieren, und dann besteht immer noch das Problem, dass sie automatisch von synchronisiert werdenbuild.xml
.Wenn Sie ein Maven-Projekt im Gegensatz zu einem Ant-Projekt verwenden, können Sie den res-Ordner über die Konfigurationsoption resourceDirectory des android: apk mojo im android-maven-plugin einfach so neu definieren, wie Sie es möchten .
Leider hilft Ihnen diese Antwort möglicherweise nicht sehr, wenn Sie nicht bereit sind, von Ant auf Maven umzusteigen ...
quelle
Wenn Sie ein Unix-Betriebssystem verwenden, können Sie diese fest verknüpfen und Ihre Versionskontrolle anweisen, das
res/
Verzeichnis zu ignorieren .quelle