When should I use the assets as opposed to raw resources in Android?

AndroidAndroid ResourcesAndroid Assets

Android Problem Overview


I'm in the mid of my Android studies, and I just covered the Assets and Raw resources. I'm trying to understand the reason for using Raw resources vs. Assets.

  1. They both provide with an uncompiled resource input stream.

  2. It seems that Assets provide much more flexibility and functionality than Raw resources.

    a. You can create folder structures under assets but not under raw

    b. You can list all resources dynamically in the assets folder but not in the raw folder.

So, why would I use Raw resources in Android?

Android Solutions


Solution 1 - Android

The main differences between the raw folder and the assets folder.

  • Since raw is a subfolder of Resources (res), Android will automatically generate an ID for any file located inside it. This ID is then stored in the R class that will act as a reference to a file, meaning it can be easily accessed from other Android classes and methods and even in Android XML files. Using the automatically generated ID is the fastest way to have access to a file in Android.

  • The assets folder is an “appendix” directory. The R class does not generate IDs for the files placed there, which is less compatible with some Android classes and methods. File access in the assets folder is slower since you will need to get a handle to it based on a String. However some operations are more easily done by placing files in this folder, like copying a database file to the system’s memory. There’s no (easy) way to create an Android XML reference to files inside the Assets folder.

Solution 2 - Android

From the Android documentation, the raw/ directory is used for:

> Arbitrary files to save in their raw form. To open these resources with a raw InputStream, call Resources.openRawResource() with the resource ID, which is R.raw.filename. > >However, if you need access to original file names and file hierarchy, you might consider saving some resources in the assets/ directory (instead of res/raw/). Files in assets/ are not given a resource ID, so you can read them only using AssetManager.


In one line, the files in the raw/ directory are not compiled by the platform, are assigned a resource ID and cannot be grouped into sub-folders whereas if you want the otherwise use the assets/ directory.

Solution 3 - Android

Adding to the answers given above...

/res/strings,/res/layout,/res/xml files etc all gets compiled into binary format. But if you place files, including XML files, in the /res/raw/ directory instead, they don’t get compiled into binary format.

> One big advantage of using assets over raw resources is the > file:///android_asset/ Uri prefix.This is useful for loading an > asset into a WebView. For example, for accessing an asset located in > assets/foo/index.html within your project, you can call > loadUrl("file:///android_asset/foo/index.html") loading that HTML > into the WebView.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionMortalusView Question on Stackoverflow
Solution 1 - Androiduser370305View Answer on Stackoverflow
Solution 2 - AndroidPrinceView Answer on Stackoverflow
Solution 3 - AndroidShubhamhackzView Answer on Stackoverflow