unity - file android asset




/ res和/ assets目錄之間的區別 (6)

我知道res目錄中的文件可以從R.class訪問,而資產的行為類似於文件系統,但是我一般想知道何時最好使用其中一個。
任何人都可以幫助我了解資源和資產之間的真正差異嗎?


以下是一些關鍵點:

  1. 原始文件必須具有有效Java標識符的名稱,而“資產”中的文件沒有位置和名稱限制。 換句話說,它們可以分組在我們希望的任何目錄中
  2. 原始文件很容易從Java以及從XML引用(即您可以從清單或其他XML文件中原始引用文件)。
  3. 將資產文件保存在這里而不是資產/目錄中的方式與您在http://developer.android.com/tools/projects/index.html記錄的訪問方式不同。
  4. 在庫項目中定義的資源會自動導入到依賴庫的應用程序項目中。 對於資產,這不會發生; 資產文件必須存在於應用程序項目的資產目錄中
  5. 資產目錄更像是一個文件系統,它提供了更多的自由來放置任何你想要的文件。 然後您就可以訪問該系統中的每個文件,就像通過Java訪問任何文件系統中的任何文件時一樣。 像遊戲數據文件,字體,紋理等
  6. 與資源不同,資產可以組織到資產目錄中的子文件夾中。但是,您可以對資產執行的唯一操作是獲取輸入流。 因此,將字符串或位圖存儲在資產中沒有多大意義,但可以存儲自定義格式的數據,例如輸入修正字典或遊戲地圖。
  7. Raw可以通過生成R.java文件給你一個編譯時間檢查,但是如果你想將你的數據庫拷貝到私有目錄,你可以使用Assets來製作流媒體。

結論

  1. Android API包含一個非常舒適的資源框架,該框架也針對各種移動應用程序的大多數典型用例進行了優化。 您應該掌握資源並儘可能使用它們。
  2. 但是,如果您的特殊情況需要更大的靈活性,那麼Assets將為您提供一個較低級別的API,允許您以更高的自由度組織和處理您的資源。

像文件系統一樣使用資產來轉儲任何類型的文件。 並使用res來存儲它所做的,佈局,圖像,值。


如果您需要在Java代碼中的某處引用它們,則可以將文件放到“res”目錄中。

並且res文件夾中的所有文件都將在R文件中編入索引,這使得加載它們的速度更快(並且更容易!)。


我知道這是舊的,但只是為了說清楚,在官方的android文檔中有一個解釋:

來自http://developer.android.com/tools/projects/index.html

assets/

這是空的。 您可以使用它來存儲原始資產文件。 這裡保存的文件按原樣編譯為.apk文件,並保留原始文件名。 您可以像使用URI的典型文件系統一樣瀏覽此目錄,並使用AssetManager將文件作為字節流讀取。 例如,這對於紋理和遊戲數據來說是一個很好的位置。

res/raw/

對於任意的原始資產文件。 將資產文件保存在此處而不是位於assets /目錄中僅在您訪問它們的方式上有所不同。 這些文件由aapt處理,必須使用R類中的資源標識符從應用程序中引用。 例如,這是媒體的好地方,比如MP3或Ogg文件。


資產提供了一種在應用程序中包含文本,xml,字體,音樂和視頻等任意文件的方法。 如果您嘗試將這些文件包含為“資源”,Android會將它們處理到其資源系統中,您將無法獲取原始數據。 如果你想訪問數據,Assets是一種方法。


通過資源,內置支持可為不同語言,操作系統版本,屏幕方向等提供備選方案,如此處所述。 這些都不適用於資產。 而且,API的很多部分都支持使用資源標識符。 最後,資源的名稱變成了在編譯時檢查的常量字段名稱,因此代碼與資源本身之間不匹配的機會就會減少。 這些都不適用於資產。

那麼為什麼要有一個資產文件夾呢? 如果你想在運行時計算你想要使用的資產,這很容易。 使用資源時,您必須聲明可能使用的所有資源ID的列表,併計算列表中的索引。 (如果資源集在開發週期中發生變化,這是一種尷尬並引入了錯誤的機會。)(編輯:您可以使用getIdentifier通過名稱檢索資源ID,但這會失去編譯時檢查的好處。)資產也可以組織到一個不受資源支持的文件夾層次結構中。 這是管理數據的一種不同方式。 雖然資源涵蓋了大部分案例,但資產偶爾也會使用。

另一個區別是:在庫項目中定義的資源會自動導入到依賴庫的應用程序項目中。 對於資產,這不會發生; 資產文件必須存在於應用程序項目的資產目錄中。 [編輯:使用Android的新的基於Gradle的構建系統 (與Android Studio一起使用),這不再是事實。 庫項目的資產目錄打包到.aar文件中,因此庫項目中定義的資產將合併到應用程序項目中(因此,如果應用程序的/assets目錄位於引用的庫中,它們不必存在)。]

編輯:如果你想打包自定義字體與你的應用程序,又出現了另一種差異。 API調用可以通過存儲在文件系統或應用程序assets/目錄中的字體文件創建Typeface 。 但是沒有API可以通過res/目錄中存儲的字體文件(或者來自InputStream ,允許使用res/目錄)創建Typeface 。 [ 注意:使用Android O(現在可在Alpha預覽中使用),您將能夠將自定義字體作為資源。 請參閱here早已過期的功能說明。 但是,只要您的最低API級別為25或更低,您就必須堅持將自定義字體打包為資源而不是資源。]





android-assets