Che strano che le altre risposte qui non rispondano alla tua domanda ... tutti presumono che tu voglia una sola directory degli asset, o fai riferimento a res / invece di assets /.
Ho anche bisogno di più di una directory di risorse.
Ho combattuto con il <aapt>
modulo formica per ore e ore e alla fine ho rinunciato e mi sono reso conto che c'è un modo molto più semplice.
Ho copiato il <target name="-package-resources"...>
tag dal file di build principale che ant
utilizza android_sdk_dir/tools/ant/build.xml
e incollato il tag nel mio progetto build.xml
(è necessario incollare il tag prima che il master build.xml
sia incluso, come build.xml
spiegano i commenti alla fine del progetto prefabbricato ), quindi ho aggiunto una seconda sezione da eseguire semplicemente zip
per aggiungere le risorse al file .ap_ (che si trova ${out.absolute.dir}/${resource.package.file.name}
a quel punto nel file ant):
<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>
Questo metodo ha il vantaggio di essere più libero di definire la struttura delle directory delle risorse nella struttura di origine e nell'apk (poiché è possibile exec
zip
più volte con argomenti diversi e persino avvolgere zip
uno script che viene eseguito zip
da più directory correnti nella propria albero dei sorgenti). Hai anche il controllo della compressione per file (zip ha un'opzione -0 per sopprimere la compressione) e non è necessario utilizzare il tag nocompress limitato, solo per estensione.
Nota che questo ant
xml arriva PRIMA di zipalign nel processo di compilazione della formica, quindi abbiamo ancora un archivio "compatibile con zip" che soddisfa le esigenze di allineamento di APK e Android Java.
Nel mio caso ho un'app basata su NDK e voglio accedere a queste risorse solo dal codice C (dove qualsiasi percorso apk è OK). Se è necessario utilizzare le chiamate degli asset Java Android standard per accedere a questi elementi, non sono sicuro che debbano essere o meno in un percorso all'interno dello zip denominato asset. In tal caso, è possibile adattare il trucco di cui sopra exec
inserendo uno script cd
nella cartella dell'albero dei sorgenti pertinente, quindi viene eseguito zip
.
res
oassets
) è esattamente ciò che non voglio fare. Come ho detto nella domanda, entrambiengine
egame
forniscono risorse che voglio spedire.