generator-rn-toolbox icon indicating copy to clipboard operation
generator-rn-toolbox copied to clipboard

Android production build `MissingDefaultResource` lint error.

Open lpikora opened this issue 5 years ago • 7 comments

When building Android app for production build I get this lint error. Its because generator builds only folders drawable-land-xxxx and drawable-port-xxx. There should be build also default drawable-xxxx folders I think.

Temporary solution is suppress this lint error adding this code to android/app/build.gradle

application {
....
 lintOptions{
   disable 'MissingDefaultResource'
 }
}

More info about lint error (source: http://tools.android.com/tips/lint-checks)

MissingDefaultResource

Summary: Missing Default

Priority: 6 / 10 Severity: Fatal Category: Correctness

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

lpikora avatar Dec 05 '18 18:12 lpikora

That can be the solution.

Here's what the doc say.

Providing the best device compatibility with resources ... Likewise, if you provide different layout resources based on the screen orientation, you should pick one orientation as your default. For example, instead of providing layout resources in layout-land/ for landscape and layout-port/ for portrait, leave one as the default, such as layout/ for landscape and layout-port/ for portrait.

jjchula avatar Dec 25 '18 10:12 jjchula

since I upgraded Android Studio I have the same problem :-( To solve also I have inserted in build.gradle:

lintOptions{
    disable 'MissingDefaultResource'
}

Is this sufficient, or will there be problems with the App? Thanks!

nobady90 avatar Feb 06 '19 15:02 nobady90

I tried disabling and the app crashes on starts because it cannot find the resource :( did you find a different workaround?

acatalina avatar Apr 05 '19 15:04 acatalina

+1, wondering which devices this will cause launch crashes on

1pocketaces1 avatar Apr 06 '19 23:04 1pocketaces1

Made a drawable-xxx with the image inside and things are working again. Maybe the tool should do the same?

thinklinux avatar Apr 22 '19 05:04 thinklinux

How can I locate a "declaration in the base folder"? I triggered this issue by renaming a layout (activity_display to activity_displayFriend) using Refactor->Rename...; apparently that didn't adjust the "base folder". I don't want to silence the lint error, because it flags a real problem, as @acatalina reported.

Quiigi avatar Feb 16 '20 13:02 Quiigi

The MissingDefaultResource error is obtusely named. The real issue is that resource file names, *.xml, cannot contain upper case letters. That is in contrast to Java files, where mixed case is typical, e.g., MainActivity.java.

Quiigi avatar Feb 21 '20 14:02 Quiigi