'How to check for android resources that are missing default values?
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?
Solution 1:[1]
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.)
Solution 2:[2]
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.
Solution 3:[3]
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|---|
Solution 1 | Brandon |
Solution 2 | Goltsev Eugene |
Solution 3 | Shogun Nassar |