custom-google-signin-button icon indicating copy to clipboard operation
custom-google-signin-button copied to clipboard

drawable files are not accessible in Android 11. adding support for android 11?

Open chlegou opened this issue 4 years ago • 8 comments

Hi there, when deploying my app to production, i have seen this error in crashlytics happening to a user having an Android 11 Pixel 4 XL device. here is the error exception:

Caused by android.content.res.Resources$NotFoundException: File res/drawable/dark_theme_google_icon_selector.xml from drawable resource ID #0x7f080082
   at android.content.res.ResourcesImpl.loadDrawableForCookie(ResourcesImpl.java:876)
   at android.content.res.ResourcesImpl.loadDrawable(ResourcesImpl.java:659)
   at android.content.res.Resources.getDrawableForDensity(Resources.java:906)
   at android.content.res.Resources.getDrawable(Resources.java:845)
   at android.content.Context.getDrawable(Context.java:687)
   at android.view.View.setBackgroundResource(View.java:22717)
   at androidx.appcompat.widget.AppCompatButton.setBackgroundResource(AppCompatButton.java:84)
   at com.shobhitpuri.custombuttons.GoogleSignInButton.setButtonBackground(GoogleSignInButton.java:160)
   at com.shobhitpuri.custombuttons.GoogleSignInButton.setButtonParams(GoogleSignInButton.java:143)
   at com.shobhitpuri.custombuttons.GoogleSignInButton.init(GoogleSignInButton.java:100)
   at com.shobhitpuri.custombuttons.GoogleSignInButton.<init>(GoogleSignInButton.java:77)
   at java.lang.reflect.Constructor.newInstance0(Constructor.java)
   at java.lang.reflect.Constructor.newInstance(Constructor.java:343)
   at android.view.LayoutInflater.createView(LayoutInflater.java:854)
   at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:1006)
   at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:961)
   at android.view.LayoutInflater.rInflate(LayoutInflater.java:1123)
   at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:1084)
   at android.view.LayoutInflater.rInflate(LayoutInflater.java:1126)
   at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:1084)
   at android.view.LayoutInflater.rInflate(LayoutInflater.java:1126)
   at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:1084)
   at android.view.LayoutInflater.rInflate(LayoutInflater.java:1126)
   at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:1084)
   at android.view.LayoutInflater.rInflate(LayoutInflater.java:1126)
   at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:1084)
   at android.view.LayoutInflater.rInflate(LayoutInflater.java:1126)
   at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:1084)
   at android.view.LayoutInflater.inflate(LayoutInflater.java:682)
   at android.view.LayoutInflater.inflate(LayoutInflater.java:534)
   at android.view.LayoutInflater.inflate(LayoutInflater.java:481)
   at androidx.appcompat.app.AppCompatDelegateImpl.setContentView(AppCompatDelegateImpl.java:555)
   at androidx.appcompat.app.AppCompatActivity.setContentView(AppCompatActivity.java:161)
   at com.chlegou.bitbot.activity.MainActivity.onCreate(MainActivity.java:92)
   at android.app.Activity.performCreate(Activity.java:7802)
   at android.app.Activity.performCreate(Activity.java:7791)
   at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1306)
   at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3245)
   at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3409)
   at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83)
   at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
   at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2016)
   at android.os.Handler.dispatchMessage(Handler.java:107)
   at android.os.Looper.loop(Looper.java:214)
   at android.app.ActivityThread.main(ActivityThread.java:7356)
   at java.lang.reflect.Method.invoke(Method.java)
   at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)

Please add support for Android 11 devices.

Thanks.

chlegou avatar Jun 13 '20 09:06 chlegou

@chlegou Thanks for opening the issue. I tried to reproduce it using Android R simulator, Android Studio 4.0, latest Build Tools etc but couldn't reproduce it. Here was my configuration for the sample app code that is included in the master branch:

Project Level build.gradle

// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {
    repositories {
        jcenter()
        google()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:4.0.0'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        jcenter()
        google()
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

App level build.gradle:

apply plugin: 'com.android.application'
android {
    compileSdkVersion 30
    buildToolsVersion "30.0.0"
    defaultConfig {
        applicationId "com.shobhitpuri.googlecustomsigninbutton"
        minSdkVersion 16
        targetSdkVersion 30
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}
dependencies {
    implementation fileTree(include: ['*.jar'], dir: 'libs')

    // Uncomment this if you want to use the released sign-in library.
    implementation 'com.shobhitpuri.custombuttons:google-signin:1.1.0'

    androidTestImplementation('androidx.test.espresso:espresso-core:3.1.0', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    implementation 'androidx.appcompat:appcompat:1.1.0'
    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
    testImplementation 'junit:junit:4.12'
}

1- Can you include the top level build file and the app level build file for your project? 2- Please add the XML of your GoogleSignInButton. 3- Also can you try running the sample project with your build file configuration on Android 11 and see if it crashes? Use bugs/android-11-drawable-crash branch. https://github.com/shobhitpuri/custom-google-signin-button/tree/bugs/android-11-drawable-crash

shobhitpuri avatar Jun 13 '20 10:06 shobhitpuri

for me, it's working fine, it didn't happened for me (having android 7). Following the issue with the user getting the error, reinstalling the app solved the issue for him. so i believe it's a bug in installing the app.

chlegou avatar Jun 14 '20 17:06 chlegou

Thanks for the update @chlegou. Glad it worked out fine. Let me know if you see any other issue around it or the frequency of the error changes. For the time being I'm closing the issue. Feel free to reopen if it persists

shobhitpuri avatar Jun 14 '20 21:06 shobhitpuri

following this issue further, i have noticed other crashes:

This issue has 8 crashes affecting 5 users
devices: android 9, 8.1.0, 5.1

I'm now 100% sure that it's not related to Android 11 (being in Beta currently, made me think it's related to it when noticing the first crash report).

After peeking your source code, it's related to this:

i recommend using:

// needs a check that the drawable isn't null, otherwise having the image as default in xml
this.setBackgroundDrawable(ContextCompat.getDrawable(getContext(), googleIconImageSelector));

this is part of the the crash report, hopefully might helps you to improve it better:

........

Caused by java.lang.reflect.InvocationTargetException
	   at java.lang.reflect.Constructor.newInstance0(Constructor.java)
	   at java.lang.reflect.Constructor.newInstance(Constructor.java:334)
	   at android.view.LayoutInflater.createView(LayoutInflater.java:647)
	   at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:790)
	   at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:730)
	   at android.view.LayoutInflater.rInflate(LayoutInflater.java:863)
	   at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:824)
	   at android.view.LayoutInflater.rInflate(LayoutInflater.java:866)

........

Caused by android.content.res.Resources$NotFoundException: File res/drawable/dark_theme_google_icon_selector.xml from drawable resource ID #0x7f080082
	   at android.content.res.ResourcesImpl.loadDrawableForCookie(ResourcesImpl.java:820)
	   at android.content.res.ResourcesImpl.loadDrawable(ResourcesImpl.java:630)
	   at android.content.res.Resources.getDrawableForDensity(Resources.java:877)
	   at android.content.res.XResources.getDrawableForDensity(XResources.java:868)
	   at android.content.res.Resources.getDrawable(Resources.java:819)
	   at android.content.res.XResources.getDrawable(XResources.java:790)
	   at android.content.Context.getDrawable(Context.java:605)
	   at android.view.View.setBackgroundResource(View.java:20376)
	   at androidx.appcompat.widget.AppCompatButton.setBackgroundResource(AppCompatButton.java:84)
	   at com.shobhitpuri.custombuttons.GoogleSignInButton.setButtonBackground(GoogleSignInButton.java:160)
	   at com.shobhitpuri.custombuttons.GoogleSignInButton.setButtonParams(GoogleSignInButton.java:143)
	   at com.shobhitpuri.custombuttons.GoogleSignInButton.init(GoogleSignInButton.java:100)
	   at com.shobhitpuri.custombuttons.GoogleSignInButton.<init>(GoogleSignInButton.java:77)
	   at java.lang.reflect.Constructor.newInstance0(Constructor.java)
	   at java.lang.reflect.Constructor.newInstance(Constructor.java:334)
	   at android.view.LayoutInflater.createView(LayoutInflater.java:647)
	   at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:790)
	   at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:730)
	   at android.view.LayoutInflater.rInflate(LayoutInflater.java:863)


........

Caused by android.content.res.Resources$NotFoundException: Drawable (missing name) with resource ID #0x7f080063

........

Caused by android.content.res.Resources$NotFoundException: Unable to find resource ID #0x7f080063
	   at android.content.res.ResourcesImpl.getResourceName(ResourcesImpl.java:253)
	   at android.content.res.ResourcesImpl.loadDrawableForCookie(ResourcesImpl.java:760)
	   at android.content.res.ResourcesImpl.loadDrawable(ResourcesImpl.java:630)
	   at android.content.res.Resources.loadDrawable(Resources.java:886)
	   at android.content.res.TypedArray.getDrawableForDensity(TypedArray.java:953)
	   at android.content.res.TypedArray.getDrawable(TypedArray.java:928)
	   at android.content.res.XResources$XTypedArray.getDrawable(XResources.java:1363)
	   at android.graphics.drawable.StateListDrawable.inflateChildElements(StateListDrawable.java:177)
	   at android.graphics.drawable.StateListDrawable.inflate(StateListDrawable.java:122)
	   at android.graphics.drawable.DrawableInflater.inflateFromXmlForDensity(DrawableInflater.java:142)
	   at android.graphics.drawable.Drawable.createFromXmlInnerForDensity(Drawable.java:1295)
	   at android.graphics.drawable.Drawable.createFromXmlForDensity(Drawable.java:1254)
	   at android.content.res.ResourcesImpl.loadDrawableForCookie(ResourcesImpl.java:807)
	   at android.content.res.ResourcesImpl.loadDrawable(ResourcesImpl.java:630)
	   at android.content.res.Resources.getDrawableForDensity(Resources.java:877)
	   at android.content.res.XResources.getDrawableForDensity(XResources.java:868)
	   at android.content.res.Resources.getDrawable(Resources.java:819)
	   at android.content.res.XResources.getDrawable(XResources.java:790)
	   at android.content.Context.getDrawable(Context.java:605)
	   at android.view.View.setBackgroundResource(View.java:20376)
	   at androidx.appcompat.widget.AppCompatButton.setBackgroundResource(AppCompatButton.java:84)
	   at com.shobhitpuri.custombuttons.GoogleSignInButton.setButtonBackground(GoogleSignInButton.java:160)
	   at com.shobhitpuri.custombuttons.GoogleSignInButton.setButtonParams(GoogleSignInButton.java:143)
	   at com.shobhitpuri.custombuttons.GoogleSignInButton.init(GoogleSignInButton.java:100)
	   at com.shobhitpuri.custombuttons.GoogleSignInButton.<init>(GoogleSignInButton.java:77)
	   at java.lang.reflect.Constructor.newInstance0(Constructor.java)
	   at java.lang.reflect.Constructor.newInstance(Constructor.java:334)
	   at android.view.LayoutInflater.createView(LayoutInflater.java:647)
	   at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:790)
	   at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:730)
	   at android.view.LayoutInflater.rInflate(LayoutInflater.java:863)
	   at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:824)

...........

chlegou avatar Jun 19 '20 19:06 chlegou

Thanks @chlegou. I've reopened it for further investigation. Can you please add the XML where you are adding <com.shobhitpuri.custombuttons.GoogleSignInButton? And if you are manipulating it programmatically, please attach that code too. Thanks!

shobhitpuri avatar Jun 20 '20 07:06 shobhitpuri

Well, i believe it has nothing to do with it. but here it is anyway:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
	xmlns:app="http://schemas.android.com/apk/res-auto"
	xmlns:tools="http://schemas.android.com/tools"
	android:layout_width="match_parent"
	android:layout_height="match_parent"
	android:background="@color/grey_50"
	tools:context=".activity.MainActivity">

	...........

	<androidx.coordinatorlayout.widget.CoordinatorLayout
		android:layout_width="match_parent"
		android:layout_height="wrap_content"
		android:layout_above="@+id/footer"
		android:layout_below="@+id/header">

		<androidx.appcompat.widget.LinearLayoutCompat
			android:layout_width="match_parent"
			android:layout_height="wrap_content"
			android:layout_marginBottom="60dp"
			android:orientation="vertical"
			app:layout_behavior="com.google.android.material.appbar.AppBarLayout$ScrollingViewBehavior">

			<androidx.core.widget.NestedScrollView
				android:layout_width="match_parent"
				android:layout_height="match_parent"
				android:clipToPadding="false"
				android:scrollbars="none"
				android:scrollingCache="true">

				<androidx.appcompat.widget.LinearLayoutCompat
					android:layout_width="match_parent"
					android:layout_height="match_parent"
					android:orientation="vertical"
					tools:context=".activity.MainActivity">

					................

					<androidx.appcompat.widget.LinearLayoutCompat
						android:id="@+id/layout_sign_in"
						android:layout_width="match_parent"
						android:layout_height="wrap_content"
						android:background="@color/blue_50"
						android:gravity="center"
						android:orientation="vertical"
						android:padding="@dimen/spacing_large">

						<androidx.appcompat.widget.AppCompatTextView
							android:layout_width="wrap_content"
							android:layout_height="wrap_content"
							android:text="@string/message_login"
							android:textAppearance="@style/TextAppearance.AppCompat.Title"
							android:textIsSelectable="true" />

						<com.shobhitpuri.custombuttons.GoogleSignInButton
							android:id="@+id/btn_sign_in"
							android:layout_width="wrap_content"
							android:layout_height="wrap_content"
							android:layout_centerInParent="true"
							android:layout_marginTop="12dp"
							android:text="@string/common_signin_button_text_long"
							app:isDarkTheme="true" />

					</androidx.appcompat.widget.LinearLayoutCompat>
					
					..........
					
				</androidx.appcompat.widget.LinearLayoutCompat>
			</androidx.core.widget.NestedScrollView>
		</androidx.appcompat.widget.LinearLayoutCompat>
	</androidx.coordinatorlayout.widget.CoordinatorLayout>
</RelativeLayout>

Also, following the vector drawables errors further, i finally get this solution that is working reliably good so far after 3 days of annoying drawables crashes: (instead of the above solution i have mentioned earlier)

setting an image resource in XML layout file as a placeholder. then fetching the vector drawable using this method:

/**
 * This is a support method for API < 21 vector drawables.
 */
@Nullable
public static Drawable getVectorDrawable(int resId) {
    Drawable drawable = null;
    try {
        drawable = AppCompatResources.getDrawable(MainApp.getInstance().getApplicationContext(), resId);
    } catch (Exception ignored) {
    }
    return drawable;
}

if the drawable fetched by this method isn't null, i apply it from java. otherwise, it's the default placeholder affected from the xml layout which is image drawable not vector drawable.

This workaround is preventing app crashes so far.

chlegou avatar Jun 21 '20 11:06 chlegou

Thanks for looking into it further. I haven't been getting much time lately. If you have the solution and has been working fine in prod, please feel free to make a pull request to the repository.

Cheers!

On Sun., Jun. 21, 2020, 4:35 a.m. chlegou, [email protected] wrote:

Well, i believe it has nothing to do with it. but here it is anyway:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/grey_50" tools:context=".activity.MainActivity">

...........

<androidx.coordinatorlayout.widget.CoordinatorLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_above="@+id/footer" android:layout_below="@+id/header">

  <androidx.appcompat.widget.LinearLayoutCompat
  	android:layout_width="match_parent"
  	android:layout_height="wrap_content"
  	android:layout_marginBottom="60dp"
  	android:orientation="vertical"
  	app:layout_behavior="com.google.android.material.appbar.AppBarLayout$ScrollingViewBehavior">

  	<androidx.core.widget.NestedScrollView
  		android:layout_width="match_parent"
  		android:layout_height="match_parent"
  		android:clipToPadding="false"
  		android:scrollbars="none"
  		android:scrollingCache="true">

  		<androidx.appcompat.widget.LinearLayoutCompat
  			android:layout_width="match_parent"
  			android:layout_height="match_parent"
  			android:orientation="vertical"
  			tools:context=".activity.MainActivity">

  			................

  			<androidx.appcompat.widget.LinearLayoutCompat
  				android:id="@+id/layout_sign_in"
  				android:layout_width="match_parent"
  				android:layout_height="wrap_content"
  				android:background="@color/blue_50"
  				android:gravity="center"
  				android:orientation="vertical"
  				android:padding="@dimen/spacing_large">

  				<androidx.appcompat.widget.AppCompatTextView
  					android:layout_width="wrap_content"
  					android:layout_height="wrap_content"
  					android:text="@string/message_login"
  					android:textAppearance="@style/TextAppearance.AppCompat.Title"
  					android:textIsSelectable="true" />

  				<com.shobhitpuri.custombuttons.GoogleSignInButton
  					android:id="@+id/btn_sign_in"
  					android:layout_width="wrap_content"
  					android:layout_height="wrap_content"
  					android:layout_centerInParent="true"
  					android:layout_marginTop="12dp"
  					android:text="@string/common_signin_button_text_long"
  					app:isDarkTheme="true" />

  			</androidx.appcompat.widget.LinearLayoutCompat>
  			
  			..........
  			
  		</androidx.appcompat.widget.LinearLayoutCompat>
  	</androidx.core.widget.NestedScrollView>
  </androidx.appcompat.widget.LinearLayoutCompat>

</androidx.coordinatorlayout.widget.CoordinatorLayout> </RelativeLayout>

Also, following the vector drawables errors further, i finally get this solution that is working reliably good so far after 3 days of annoying drawables crashes: (instead of the above solution i have mentioned earlier)

setting an image resource in XML layout file as a placeholder. then fetching the vector drawable using this method:

/**

  • This is a support method for API < 21 vector drawables. */ @Nullable public static Drawable getVectorDrawable(int resId) { Drawable drawable = null; try { drawable = AppCompatResources.getDrawable(MainApp.getInstance().getApplicationContext(), resId); } catch (Exception ignored) { } return drawable; }

if the drawable fetched by this method isn't null, i apply it from java. otherwise, it's the default placeholder affected from the xml layout which is image drawable not vector drawable.

This workaround is preventing app crashes so far.

— You are receiving this because you modified the open/close state. Reply to this email directly, view it on GitHub https://github.com/shobhitpuri/custom-google-signin-button/issues/12#issuecomment-647116084, or unsubscribe https://github.com/notifications/unsubscribe-auth/AA22HX2ZCL32PVHX4MPA4A3RXXV63ANCNFSM4N45FHCA .

shobhitpuri avatar Jun 22 '20 00:06 shobhitpuri

Hi im also facing this issue... Can someone help me ?

indra452 avatar Jan 28 '23 13:01 indra452