Làm cách nào tôi có thể tham khảo tài sản Android trong các thư mục khác?


9

Dự án của tôi ban đầu không dành cho Android và tài sản của nó được tổ chức theo cấu trúc thư mục sau (Tôi hy vọng nghệ thuật ASCII thể hiện khá hợp lý):

/
+- engine/
 |    +- src/
 |     |      enginefile1.cpp
 |     |      ...
 |     `- textures/
 |            texture1.tex
 |            ...
+- game/
 |    +- src/
 |     |      gamefile1.cpp
 |     |      ...
 |    +- textures/
 |     |      gametexture1.tex
 |     |      ...
 |    +- ios/
 |     |      [various iOS-specific files]
 |     `- android/
 |           | build.xml
 |           | AndroidManifest.xml
 |           +- jni/
 |           |     Android.mk
 |           +- assets/
 |             [other Android-specific files]
 `- othergame/

Thư mục của tôi game/android/jnigần như trống rỗng vì Android.mktrỏ đến các đường dẫn tương đối của các tệp nguồn trong engine/srcgame/src. Trên thực tế, nó thậm chí bao gồm các Makefiles thích hợp để tôi không bao giờ phải sửa đổi Android.mkkhi tôi thêm hoặc xóa tệp nguồn vào dự án.

Cả hai enginegamecung cấp tài sản cần được vận chuyển với bản dựng Android. Tôi muốn build.xmltham khảo các tài sản này mà không cần phải sao chép chúng theo cách thủ công. Một quy tắc sao chép các tài sản tại thời điểm xây dựng sau đó xóa chúng sẽ được chấp nhận, nhưng tất nhiên tôi thích giải pháp sao chép bằng không. Điều này có nghĩa không? Làm thế nào những người khác giải quyết vấn đề xây dựng đa nền tảng này?

Câu trả lời:


1

Có, bạn hoàn toàn có thể sử dụng các tập tin trong các thư mục khác. Đặt tài sản bạn có vào assetsthư mục (anh chị em với resthư mục) và sử dụngAssetManager để truy cập chúng.

Để tải ảnh bitmap, bạn sẽ muốn BitmapFactoryvà bạn sẽ phải thực hiện thêm một số công việc nếu bạn có ý định tải hình ảnh phụ thuộc độ phân giải.

Hãy cẩn thận về việc tải Bitmap nhiều lần. Vì bạn sẽ xử lý các tệp xử lý tệp thô, có thể bạn sẽ muốn triển khai một số trình quản lý tài nguyên / bộ nhớ cho phép bạn nhanh chóng tra cứu các tham chiếu đến các đối tượng Bitmap hiện có và tương tự. Tùy thuộc vào kiến ​​trúc của bạn, bạn có thể cần thực hiện việc này WeakReferencesđể không kết thúc với toàn bộ dữ liệu trò chơi trong bộ nhớ. (Với tài nguyên Android bình thường, ResourceManagerxử lý tất cả điều này cho bạn.)


Đặt tài sản trong cùng thư mục (có thể là reshay assets) 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ả hai enginegamecung cấp tài sản mà tôi muốn gửi.
sam hocevar

Thêm một tập lệnh biên dịch trước để liên kết hoặc sao chép tài sản vào assetsthư mục, cho phép bạn giữ bất kỳ cấu trúc thư mục cụ thể nào của trò chơi. Đối với các liên kết của Windows: windows7home.net/how-to-create-symbolic-link-in-windows-7
Anm

Mặc dù một tập lệnh biên dịch trước có lẽ là giải pháp phù hợp nhất, nhưng thật tuyệt nếu câu trả lời của bạn đề cập đến nó, có thể cùng với một ví dụ ngắn, để nó có thể được chấp nhận. (lưu ý rằng tôi đang đưa ra nhận xét chính xác trong câu trả lời khác)
sam hocevar

1

Ant build property "property.dir" chịu trách nhiệm cung cấp tên của thư mục tài sản. Đó là "tài sản" theo mặc định, nhưng bạn có thể thay đổi nó thành một cái gì đó như "../assets". Điều này thay đổi đường dẫn của toàn bộ thư mục, nhưng nếu bạn có tài nguyên dành riêng cho Android, bạn vẫn có thể sử dụng thư mục "res".


1

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 antsử dụng android_sdk_dir/tools/ant/build.xmlvà 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.xmlbao gồm bản gốc, như các nhận xét ở cuối dự án được tạo trước build.xmlgiải thích), sau đó thêm một phần thứ hai chỉ đơn giản là zipthự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 zipnhiều lần với các đối số khác nhau và thậm chí bao bọc ziptrong 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 execmột tập lệnh cds vào thư mục cây nguồn có liên quan, sau đó chạy zip.


0

Ngoài đỉnh đầu, tôi không nghĩ bạn có thể sử dụng bất cứ thứ gì ngoài res /, nhưng nếu bạn đang muốn tránh chi phí tăng thêm cho chu kỳ phát triển của mình bằng một bản sao, bạn có thể thử di chuyển chúng thay thế hoặc thậm chí có thể sử dụng liên kết ...


Tôi chắc chắn không thể di chuyển các tập tin vì một số trong số chúng được chia sẻ trên các trò chơi và cần phải ở trong enginethư mục, trong một kho lưu trữ riêng biệt. Các liên kết tượng trưng có thể được chấp nhận nhưng tôi không chắc chúng hoạt động tốt trên Windows và sau đó vẫn còn vấn đề khiến chúng được tự động đồng bộ hóa build.xml.
sam hocevar

2
@Sam - Bạn có thể để các tệp vào vị trí trong kho lưu trữ của mình, nhưng tạo một bước biên dịch trước trong khung xây dựng của bạn (rõ ràng là tệp Ant build.xml) để sao chép các tệp vào các vị trí cần thiết cho dự án Android của bạn. Đây là thực tế phổ biến khi chia sẻ tài sản trong một trò chơi đa nền tảng. Xem tác vụ sao chép Ant: ant.apache.org/manual/T task / photo.html
Anm

Mặc dù một tập lệnh biên dịch trước có lẽ là giải pháp phù hợp nhất, nhưng thật tuyệt nếu câu trả lời của bạn đề cập đến nó, có thể cùng với một ví dụ ngắn, để nó có thể được chấp nhận. (lưu ý rằng tôi đang đưa ra nhận xét chính xác trong câu trả lời khác)
sam hocevar

0

Nếu bạn đang sử dụng dự án Maven trái ngược với dự án Ant, bạn có thể dễ dàng xác định lại thư mục res thành bất cứ điều gì bạn muốn thông qua tùy chọn cấu hình resourceDirectory của android: apk mojo trong android-maven-plugin .

  <plugin>
    <groupId>com.jayway.maven.plugins.android.generation2</groupId>
    <artifactId>android-maven-plugin</artifactId>
    <version>${android.maven.version}</version>
    <configuration>
      <resourceDirectory>${project.basedir}/res</resourceDirectory>
    </configuration>
    <extensions>true</extensions>
  </plugin>

Đáng buồn thay, trừ khi bạn sẵn sàng chuyển từ sử dụng Ant sang sử dụng Maven, câu trả lời này có thể không giúp bạn nhiều ...


0

Nếu bạn đang sử dụng hệ điều hành unix, bạn có thể liên kết chúng một cách khó khăn và báo cho kiểm soát phiên bản của bạn bỏ qua res/thư mục.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.