Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to check for android resources that are missing default values?

Tags:

android

lint

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?

like image 922
chessdork Avatar asked Aug 13 '17 16:08

chessdork


People also ask

How do I access resources on Android?

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.

What type of content is included in resources that are used in Android?

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.

How many types of resources are there in Android?

There are three types of resources that can provide your application with strings: String. XML resource that provides a single string.

What is a resource ID in android?

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.


2 Answers

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.)

like image 144
Brandon Avatar answered Nov 09 '22 22:11

Brandon


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.

like image 34
Goltsev Eugene Avatar answered Nov 10 '22 00:11

Goltsev Eugene