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

China☆狼群 提交于 2019-12-10 16:34:00

问题


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?


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




回答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.



来源:https://stackoverflow.com/questions/45662406/how-to-check-for-android-resources-that-are-missing-default-values

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!