Que estranho as outras respostas aqui não responderem à sua pergunta ... todas elas assumem que você deseja apenas um diretório de ativos ou se refere a res / em vez de assets /.
Também preciso de mais de um diretório de ativos.
Lutei com o <aapt>
módulo ant por horas e horas e finalmente desisti e percebi que havia uma maneira muito mais fácil.
Copiei a <target name="-package-resources"...>
tag do arquivo de construção mestre que ant
usa, android_sdk_dir/tools/ant/build.xml
e colei a tag no meu projeto build.xml
(você deve colar a tag imediatamente antes da build.xml
inclusão do mestre , como build.xml
explicam os comentários no final do projeto pré-fabricado ) e, em seguida, adicionei uma segunda seção para simplesmente exec zip
para adicionar os ativos ao arquivo .ap_ (que está ${out.absolute.dir}/${resource.package.file.name}
nesse ponto no arquivo 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>
Esse método tem a vantagem de você ser mais livre para definir a estrutura de diretórios de seus ativos na árvore de origem e no apk (pois é possível exec
zip
várias vezes com argumentos diferentes e até envolver zip
um script que é executado a zip
partir de vários diretórios atuais em seu diretório). árvore de origem). Você também tem o controle de compactação por arquivo (o zip tem uma opção -0 para suprimir a compactação) e não precisa usar a tag nocompress limitada por extensão apenas.
Observe que esse ant
xml vem ANTES do zipalign no processo de criação de formigas, por isso ainda temos um arquivo "compatível com zip" que atende às necessidades de alinhamento de APKs e Java Android.
No meu caso, eu tenho um aplicativo baseado em NDK e desejo acessar esses ativos apenas do código C (onde qualquer caminho do apk estiver OK). Se você precisar usar as chamadas padrão dos ativos Java Android para acessar esses itens, não tenho certeza se eles devem ou não estar em um caminho dentro do zip denominado ativos / não. exec
Nesse caso, você pode adaptar o truque acima, inserindo um script cd
na pasta da árvore de origem relevante e executando zip
.
res
ou nãoassets
) é precisamente o que eu não quero fazer. Como eu disse na pergunta, tantoengine
egame
fornecer activos que eu quero para enviar.