Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

"API Not Initialized" error in --release build only #16

Open
enricodente opened this issue Feb 28, 2021 · 14 comments
Open

"API Not Initialized" error in --release build only #16

enricodente opened this issue Feb 28, 2021 · 14 comments

Comments

@enricodente
Copy link

Platform: Android
Cordova: 10.0.0

While compiling --debug version, everything works fine.
Only when compiled as --release I get this error at app startup, when initializing Chromecast plugin, of course anything related to Chromacast is not working after the error.

Anyone else experienced this issue?

{
  "code":"unknown",
  "description":"api_not_initialized null",
  "details":{}
}
@Lindsay-Needs-Sleep
Copy link

That is interesting. o.o

Can you give more details? (stack trace?)
Any output in ADB?

@enricodente
Copy link
Author

It is hard to get debug output because it's a release version, so the usual way I have to get some output does not work (chrome devices).

Any hint on how I could get some additional info on a release build?

@Lindsay-Needs-Sleep
Copy link

Lindsay-Needs-Sleep commented Mar 1, 2021 via email

@enricodente
Copy link
Author

enricodente commented Mar 2, 2021

This happens for Android release only, on iOS I have the release up and running on App Store with no issues whatsoever.

So I assume you are not having the same issue in release builds on Android, correct?

I will try a minimal app to check whether the problem comes from my build setup or other plugins/elements in my current project.

@Lindsay-Needs-Sleep
Copy link

Lindsay-Needs-Sleep commented Mar 3, 2021 via email

@enricodente
Copy link
Author

That is a good point. I will try that for sure, this weekend I will be able to test.

I will try with 4.4.6 (October 2020) and see if that helps.

@enricodente
Copy link
Author

Still no luck. I've been trying for quite a while today experimenting with different versions of SDK too (reverted up to 17.0). Also tried adding some dependencies that were removed back.

Tried both on a Xiaomi device (Android 10) and an AOSP device (Android 9), same results. Debug build works perfectly fine, release will fail to initialize.

AFAIK the main difference between debug and release build is on debug logs and connection blocking (release version will follow more strictly connection blocking rules). I have guessed it might have to do with a connection issue to Google servers, at init stage, as the plugin is looking to access my custom receiver, but I even tried to add for test purposes, the error still persists.

Are you able to have a test to check whether the issue can be replicated or not?

@Lindsay-Needs-Sleep
Copy link

AFAIK the main difference between debug and release build is on debug logs and connection blocking (release version will follow more strictly connection blocking rules). I have guessed it might have to do with a connection issue to Google servers, at init stage, as the plugin is looking to access my custom receiver, but I even tried to add for test purposes, the error still persists.

This is interesting, definitely sounds like a promising route.

I think this issue is actually happening for me too. (I just have too much on my plate and didn't notice >.<)

Our Sentry has a bunch of errors related to chromecast init, and it's only happening on android devices.

Unfortunatley, the error logging isn't set up completely correctly and I'm just getting "failed to init [Object object]"

I will investigate more. I've updated the log, hopefully I will get better info back. I will see if I can find out when this error started and correlate it with changes.

Will post back in a couple hours!

@Lindsay-Needs-Sleep
Copy link

Lindsay-Needs-Sleep commented Mar 7, 2021

So got my logs to work properly, I am getting the same error as you:

Error during chrome.cast.initialize:{"code":"unknown","description":"api_not_initialized null","details":{}}

Code:

        chrome.cast.initialize(apiConfig, function () {
            _apiReady = true;
        }, function (err) {
            console.error(err);
            err = err.message || err;
            utils.logToSentry('Error during chrome.cast.initialize:' + utils.getString(err));
        });

The first instance of this error (in the [Object object] format), only started 11 days ago. (Feb 25, 2021)

This is strange because I haven't done anything to anything for months. (as you can see with the outstanding issues and PR's o.o;;)

So Google must've done something remotely. :/

It seems to affect a very wide range of android devices:
image

The release build works on my test device though of course. Samsung tablet, SM-T350, Android 7.1.1. :/

@Lindsay-Needs-Sleep
Copy link

Since it looks like the native code for initialize can only return success, that means we have to look to the javascript....

  1. This is where the error should be coming from.
  2. Fixed this minor error on the branch android-init-issue (this just fixes the format of the error we're receiving).
    But I did also add a stack trace to the error details. (I don't think it will be much help though).
  3. The reason this error is happening is because chrome.cast.isAvailable === false (this is the interesting part).

image

This is where isAvailabe get's set to true. So this is never happening. :/

image

The events correspond to events fired from the native side. So for some reason Android isn't firing the SETUP event for these devices.

Full flow:

  • chrome.cast.js - on load always does execute('setup', ..., which should always make it to the native side
  • Chromecast.java > boolean execute( should forward the call (without fail) to
  • Chromecast.java > boolean setup( I suspect this is where it actually barfs

The only thing that looks like it could actually barf is that maybe connection doesn't exist.

image

The only way connection doesn't exist is if the native side barfed on plugin initialization.

image

There are a number of things that could go wrong here....

image

Unfortunately that's all the time I have for digging today...

If we had access to the native logs when running in release mode and the error happens that would be interesting.

The only other thing I can think to try right now is to:

  • Empty out the pluginInitialize function
  • Put that content in another function, maybe in boolean setup, and then see if we can back error from the try/catch to be returned the javascript side

@enricodente
Copy link
Author

I successfully applied your changes on the error reporting and now I correctly get the whole details from the error.

Then following the stack trace, I get to the same result as you explained super clearly in your previous post, but I am not so skilled to work on the Java portion of the code.

What I can tell you is that I tried to remove the check on chrome.cast.isAvailable, and of course it returns another error, so there is actually an issue to be solved at init/setup phase. If you could try to trace the error back in the code, I can still try to analyze what's happening in the code to find out which section could be involved in differences between debug and release builds.

Thank you very much for your commitment!

@enricodente
Copy link
Author

enricodente commented Mar 9, 2021

Hi Lindsay,

I was thinking of all the extra stuff happening when switching from debug to release, and I finally found the issue reading the official Google Docs, assuming you have Proguard plugin installed.
Reference: https://developers.google.com/cast/docs/android_sender#other-ide

First test I did: uninstall Proguard plugin, and Chromecast starts working in release.
Second test: add proguard-project.txt in the project root folder, with the content showed in the documentation linked above, still having some issues to solve the issue in a final way, but working on it.

Unless you are not using Proguard, I would say the issue should be close to be solved!
It might be worth to update the documentation for the plugin to warn about this compatibility issue, and how to solve it, once we find the final solution.

@Lindsay-Needs-Sleep
Copy link

Lindsay-Needs-Sleep commented Mar 10, 2021 via email

@ghenry22
Copy link

https://www.npmjs.com/package/cordova-plugin-proguard
this might help to enable proguard and setup the customization file more easily?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants