Betapa aneh bahwa jawaban lain di sini tidak menjawab pertanyaan Anda ... mereka semua menganggap Anda hanya menginginkan satu direktori aset, atau merujuk ke res / bukannya aset /.
Saya juga memerlukan lebih dari satu direktori aset.
Saya berkelahi dengan <aapt>
modul semut selama berjam-jam dan akhirnya menyerah dan menyadari ada cara yang jauh lebih mudah.
Saya menyalin <target name="-package-resources"...>
tag dari file master build yang ant
menggunakan,, android_sdk_dir/tools/ant/build.xml
dan menempelkan tag ke proyek saya build.xml
(Anda harus menempelkan tag tepat sebelum master build.xml
dimasukkan, seperti komentar di akhir proyek yang dibuat sebelumnya build.xml
menjelaskan), kemudian menambahkan bagian kedua untuk sekadar mengeks zip
untuk menambahkan aset ke file .ap_ (yang ${out.absolute.dir}/${resource.package.file.name}
saat itu ada di file semut):
<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>
Metode ini memiliki keuntungan bahwa Anda lebih bebas untuk menentukan struktur direktori dari aset Anda di pohon sumber dan di apk (karena Anda dapat exec
zip
beberapa kali dengan argumen yang berbeda, dan bahkan membungkus zip
dalam skrip yang berjalan zip
dari beberapa direktori saat ini di Anda pohon sumber). Anda juga memiliki kontrol kompresi per file (zip memiliki opsi -0 untuk menekan kompresi) dan tidak perlu menggunakan tag nocompress terbatas per ekstensi hanya.
Catatan ant
xml ini hadir SEBELUM zipalign dalam proses pembuatan semut, jadi kami masih mendapatkan arsip "kompatibel-zip" yang memenuhi kebutuhan pelurusan APK dan Android Java.
Dalam kasus saya, saya memiliki aplikasi berbasis NDK dan saya ingin mengakses aset ini hanya dari kode C (di mana setiap jalur apk OK). Jika Anda perlu menggunakan panggilan aset Java Android standar untuk mengakses item ini, saya tidak yakin apakah item tersebut harus berada di jalur di dalam zip yang bernama aset / atau tidak. Jika demikian, Anda dapat menyesuaikan trik di atas dengan exec
memasukkan skrip yang cd
ke folder hierarki sumber yang relevan, kemudian jalankan zip
.
res
atauassets
) adalah persis apa yang tidak ingin saya lakukan. Seperti yang saya katakan dalam pertanyaan, keduanyaengine
dangame
memberikan aset yang ingin saya kirimkan.