I am curious about how to find android resources that are missing default values. For example, it is possible to define corner_radius
in dimens-sw600dp.xml
, without defining it in dimens.xml
. This would cause a runtime crash on any device whose smallest width is less than 600 dp.
In the above example, it's not obvious that the default value is missing. After aapt runs, you are able to reference the dimension in code and in xml, despite the missing default value. (via R.dimen.corner_radius
and @dimen/corner_radius
). The error is not discoverable until runtime.
Android Studio includes a lint check for missing translations, but doesn't seem to check for other resource types. Is there an easy way to check for other missing resources (dimens, layout, etc.) at build time?
Accessing Resources When your Android application is compiled, a R class gets generated, which contains resource IDs for all the resources available in your res/ directory. You can use R class to access that resource using sub-directory and resource name or directly resource ID.
Resources are the additional files and static content that your code uses, such as bitmaps, layout definitions, user interface strings, animation instructions, and more. You should always externalize app resources such as images and strings from your code, so that you can maintain them independently.
There are three types of resources that can provide your application with strings: String. XML resource that provides a single string.
For each type of resource, there is an R subclass (for example, R. drawable for all drawable resources) and for each resource of that type, there is a static integer (for example, R. drawable. icon ). This integer is the resource ID that you can use to retrieve your resource.
You can now depend on the MissingDefaultResource
lint rule (found here):
If a resource is only defined in folders with qualifiers like -land or -en, and there is no default declaration in the base folder (layout or values etc), then the app will crash if that resource is accessed on a device where the device is in a configuration missing the given qualifier.
As a special case, drawables do not have to be specified in the base folder; if there is a match in a density folder (such as drawable-mdpi) that image will be used and scaled. Note however that if you only specify a drawable in a folder like drawable-en-hdpi, the app will crash in non-English locales.
There may be scenarios where you have a resource, such as a -fr drawable, which is only referenced from some other resource with the same qualifiers (such as a -fr style), which itself has safe fallbacks. However, this still makes it possible for somebody to accidentally reference the drawable and crash, so it is safer to create a default dummy fallback in the base folder. Alternatively, you can suppress the issue by adding tools:ignore="MissingDefaultResource" on the element.
(This scenario frequently happens with string translations, where you might delete code and the corresponding resources, but forget to delete a translation. There is a dedicated issue id for that scenario, with the id ExtraTranslation.)
Actually, I found one way, not the best, but it's working.
Delete all other dimens.xml
files, except main one (i.e. v19, w820dp
etc).
After that just build your project - you will get a list of errors where dimension is missing now.
When you found problems, just revert deletion.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With