Thật kỳ lạ khi các câu trả lời khác ở đây không trả lời câu hỏi của bạn ... tất cả đều cho rằng bạn chỉ muốn một thư mục tài sản hoặc tham khảo res / thay vì tài sản /.
Tôi cũng cần nhiều hơn một thư mục tài sản.
Tôi đã chiến đấu với <aapt>
mô-đun kiến trong nhiều giờ và cuối cùng đã bỏ cuộc và nhận ra có một cách dễ dàng hơn nhiều.
Tôi đã sao chép <target name="-package-resources"...>
thẻ từ tệp xây dựng chính ant
sử dụng android_sdk_dir/tools/ant/build.xml
và dán thẻ vào dự án của tôi build.xml
(bạn phải dán thẻ ngay trước khi build.xml
bao gồm bản gốc, như các nhận xét ở cuối dự án được tạo trước build.xml
giải thích), sau đó thêm một phần thứ hai chỉ đơn giản là zip
thực thi để thêm các tài sản vào tệp .ap_ (nằm ${out.absolute.dir}/${resource.package.file.name}
tại điểm đó trong tệp 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>
Phương pháp này có lợi thế là bạn có thể tự do hơn trong việc xác định cấu trúc thư mục của tài sản của mình trong cây nguồn và trong apk (vì bạn có thể exec
zip
nhiều lần với các đối số khác nhau và thậm chí bao bọc zip
trong một tập lệnh chạyzip
từ nhiều thư mục hiện tại trong cây nguồn). Bạn cũng có quyền kiểm soát nén trên mỗi tệp (zip có tùy chọn -0 để triệt tiêu nén) và không cần sử dụng thẻ nocompress chỉ giới hạn, mỗi phần mở rộng.
Lưu ý điều này ant
xml này xuất hiện TRƯỚC zipalign trong quá trình xây dựng kiến, vì vậy chúng tôi vẫn nhận được kho lưu trữ "tương thích với zip" đáp ứng nhu cầu căn chỉnh của APK và Android Java.
Trong trường hợp của tôi, tôi có một ứng dụng dựa trên NDK và tôi chỉ muốn truy cập các tài sản này từ mã C (trong đó mọi đường dẫn apk đều ổn). Nếu bạn cần sử dụng các lệnh gọi tài sản Java tiêu chuẩn của Android để truy cập các mục này, tôi không chắc liệu chúng có phải nằm trong đường dẫn bên trong mã zip có tên tài sản / hay không. Nếu vậy, bạn có thể điều chỉnh thủ thuật ở trên bằng cách nhập exec
một tập lệnh cd
s vào thư mục cây nguồn có liên quan, sau đó chạy zip
.
res
hayassets
) là chính xác những gì tôi không muốn làm. Như tôi đã nói trong câu hỏi, cả haiengine
vàgame
cung cấp tài sản mà tôi muốn gửi.