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 , dass ant
Anwendungen, android_sdk_dir/tools/ant/build.xml
und den Tag in mein Projekt eingefügt build.xml
(Sie müssen den Tag einfügen direkt vor dem Master build.xml
enthalten ist, wie die Kommentare am Ende des vorgefertigten Projektes build.xml
erklären) und fügte hinzu : Ein zweiter Abschnitt zum einfachen Ausführen zip
, 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):
<target name="-package-resources" depends="-crunch">
<!-- only package resources if *not* a library project -->
<do-only-if-not-library elseText="Library project: do not package resources..." >
<aapt executable="${aapt}"
command="package"
versioncode="${version.code}"
versionname="${version.name}"
debug="${build.is.packaging.debug}"
manifest="${out.manifest.abs.file}"
assets="${asset.absolute.dir}"
androidjar="${project.target.android.jar}"
apkfolder="${out.absolute.dir}"
nocrunch="${build.packaging.nocrunch}"
resourcefilename="${resource.package.file.name}"
resourcefilter="${aapt.resource.filter}"
libraryResFolderPathRefid="project.library.res.folder.path"
libraryPackagesRefid="project.library.packages"
libraryRFileRefid="project.library.bin.r.file.path"
previousBuildType="${build.last.target}"
buildType="${build.target}"
ignoreAssets="${aapt.ignore.assets}">
<res path="${out.res.absolute.dir}" />
<res path="${resource.absolute.dir}" />
<!-- <nocompress /> forces no compression on any files in assets or res/raw -->
<!-- <nocompress extension="xml" /> forces no compression on specific file extensions in assets and res/raw -->
</aapt>
<!--
NEW XML STARTS HERE
-->
<exec executable="zip" failonerror="true">
<arg value="-r" />
<arg value="${out.absolute.dir}/${resource.package.file.name}" />
<arg value="my_assets_directory_1" />
<arg value="my_assets_directory_2" />
<arg value="my_assets_directory_3" />
</exec>
<!--
NEW XML ENDS HERE
-->
</do-only-if-not-library>
</target>
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 sogar zip
ein Skript einschließen können, das zip
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 Skript cd
für den entsprechenden Quellbaumordner erstellen und dann ausführen zip
.
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.