matomo-org / matomo-sdk-android

SDK for Android to measure your apps with Matomo. Works on Android phones, tablets, Fire TV sticks, and more!
BSD 3-Clause "New" or "Revised" License
388 stars 162 forks source link

Issue with Android reporting #308

Closed espritm closed 3 years ago

espritm commented 3 years ago

Hello, I am using Matomo for my platform with Android, iOS and web site. I have a prod environment and a dev environment. For the prod environment, everything works well. For the dev environment, the website and the iOS app works well, but I have an issue with Android : I cannot see any event or screen sent from the Android app to myDevEnv.com/piwik.php in myDevEnv.com/index.php

Note that I have tested with matomo.php, and piwik.php is working fine for the iOS app and the website.

Here is the code I use :


    public static void testTrack(Context context) {
        Tracker myTracker = TrackerBuilder.createDefault("https://myDevEnv.com/piwik.php", 4)
                .build(Matomo.getInstance(context));

        myTracker.setDispatchMode(DispatchMode.ALWAYS);
        myTracker.setOptOut(false);

        TrackHelper.track().event("trackEvent", "FabulousTestTrackMatomo").name("link").with(myTracker);

        TrackHelper.track().screen("Fabulous").title("TestScreenMatomo").with(myTracker);

        myTracker.dispatchBlocking();
    }

And here is the result of sniffing Http requests. We can see on myProdEnv that the request is correctly built and sent, but on myDevEnv the request is absolutely not built as if there was an error in the matomo sdk.

MyProdEnv : myprodenv

MyDevEnv : mydevenv

I don't have any logs in logcat, any verboses logs or uncaught exceptions :/

Please could you have any idea to help me with this issue ? I am working on it for 3 days :'( I was about to write a custom dispatcherFactory to be able to debug step by step, but as it is working on myProdEnv, I am not sure it would help.

d4rken commented 3 years ago

The URL in your screenshot looks different because one uses GET and the other POST.

https://github.com/matomo-org/matomo-sdk-android/blob/3080d186902968bde02a197274fe9d9efd91bb47/tracker/src/main/java/org/matomo/sdk/dispatcher/PacketFactory.java#L51-L52

https://github.com/matomo-org/matomo-sdk-android/blob/3080d186902968bde02a197274fe9d9efd91bb47/tracker/src/main/java/org/matomo/sdk/dispatcher/DefaultPacketSender.java#L26

The library uses Timber for logging, you can enable it like this: https://github.com/matomo-org/matomo-sdk-android/blob/master/exampleapp/src/main/java/org/matomo/demo/DemoApp.java#L41

espritm commented 3 years ago

Hello d4rken, Thank you for your answer !

I have activated the logs with Timber, and I can see the exception below :

V/MATOMO:DefaultPacketSender: Connection is open to https://mydevenv.com/piwik.php?_viewts=1625819134&idsite=4&send_image=0&res=1440x3040&e_a=FabulousTrackTestMatomo&e_c=trackEvent&_idvc=43&ua=Dalvik%2F2.1.0%20%28Linux%3B%20U%3B%20Android%2010%3B%20Android%20SDK%20built%20for%20x86%20Build%2FQSR1.200715.002%29&url=https%3A%2F%2Fmydevenv.com%2Fgateway%2Fandroid&rand=38977&rec=1&apiv=1&_idts=1625638860&cdt=2021-07-09%2010%3A39%3A16%2B0200&e_n=link&_id=a102da746fcf4290&new_visit=1&lang=en
V/MATOMO:DefaultPacketSender: Sending: Packet(type=GET, data=https://mydevenv.com/piwik.php?_viewts=1625819134&idsite=4&send_image=0&res=1440x3040&e_a=FabulousTrackTestMatomo&e_c=trackEvent&_idvc=43&ua=Dalvik%2F2.1.0%20%28Linux%3B%20U%3B%20Android%2010%3B%20Android%20SDK%20built%20for%20x86%20Build%2FQSR1.200715.002%29&url=https%3A%2F%2Fmydevenv.com%2Fgateway%2Fandroid&rand=38977&rec=1&apiv=1&_idts=1625638860&cdt=2021-07-09%2010%3A39%3A16%2B0200&e_n=link&_id=a102da746fcf4290&new_visit=1&lang=en)
E/MATOMO:DefaultPacketSender: Transmission failed unexpectedly.
    javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.
        at com.android.org.conscrypt.ConscryptFileDescriptorSocket.startHandshake(ConscryptFileDescriptorSocket.java:231)
        at com.android.okhttp.internal.io.RealConnection.connectTls(RealConnection.java:196)
        at com.android.okhttp.internal.io.RealConnection.connectSocket(RealConnection.java:153)
        at com.android.okhttp.internal.io.RealConnection.connect(RealConnection.java:116)
        at com.android.okhttp.internal.http.StreamAllocation.findConnection(StreamAllocation.java:186)
        at com.android.okhttp.internal.http.StreamAllocation.findHealthyConnection(StreamAllocation.java:128)
        at com.android.okhttp.internal.http.StreamAllocation.newStream(StreamAllocation.java:97)
        at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:289)
        at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:232)
        at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:465)
        at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:411)
        at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getResponseCode(HttpURLConnectionImpl.java:542)
        at com.android.okhttp.internal.huc.DelegatingHttpsURLConnection.getResponseCode(DelegatingHttpsURLConnection.java:106)
        at com.android.okhttp.internal.huc.HttpsURLConnectionImpl.getResponseCode(HttpsURLConnectionImpl.java:30)
        at org.matomo.sdk.dispatcher.DefaultPacketSender.send(DefaultPacketSender.java:97)
        at org.matomo.sdk.dispatcher.DefaultDispatcher$1.run(DefaultDispatcher.java:213)
        at java.lang.Thread.run(Thread.java:919)
     Caused by: java.security.cert.CertificateException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.
        at com.android.org.conscrypt.TrustManagerImpl.checkTrustedRecursive(TrustManagerImpl.java:658)
        at com.android.org.conscrypt.TrustManagerImpl.checkTrusted(TrustManagerImpl.java:507)
        at com.android.org.conscrypt.TrustManagerImpl.checkTrusted(TrustManagerImpl.java:426)
        at com.android.org.conscrypt.TrustManagerImpl.getTrustedChainForServer(TrustManagerImpl.java:354)
        at android.security.net.config.NetworkSecurityTrustManager.checkServerTrusted(NetworkSecurityTrustManager.java:94)
        at android.security.net.config.RootTrustManager.checkServerTrusted(RootTrustManager.java:89)
        at com.android.org.conscrypt.Platform.checkServerTrusted(Platform.java:224)
        at com.android.org.conscrypt.ConscryptFileDescriptorSocket.verifyCertificateChain(ConscryptFileDescriptorSocket.java:407)
        at com.android.org.conscrypt.NativeCrypto.SSL_do_handshake(Native Method)
        at com.android.org.conscrypt.NativeSsl.doHandshake(NativeSsl.java:387)
        at com.android.org.conscrypt.ConscryptFileDescriptorSocket.startHandshake(ConscryptFileDescriptorSocket.java:226)
        at com.android.okhttp.internal.io.RealConnection.connectTls(RealConnection.java:196) 
        at com.android.okhttp.internal.io.RealConnection.connectSocket(RealConnection.java:153) 
        at com.android.okhttp.internal.io.RealConnection.connect(RealConnection.java:116) 
        at com.android.okhttp.internal.http.StreamAllocation.findConnection(StreamAllocation.java:186) 
        at com.android.okhttp.internal.http.StreamAllocation.findHealthyConnection(StreamAllocation.java:128) 
        at com.android.okhttp.internal.http.StreamAllocation.newStream(StreamAllocation.java:97) 
        at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:289) 
        at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:232) 
        at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:465) 
        at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:411) 
        at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getResponseCode(HttpURLConnectionImpl.java:542) 
        at com.android.okhttp.internal.huc.DelegatingHttpsURLConnection.getResponseCode(DelegatingHttpsURLConnection.java:106) 
        at com.android.okhttp.internal.huc.HttpsURLConnectionImpl.getResponseCode(HttpsURLConnectionImpl.java:30) 
        at org.matomo.sdk.dispatcher.DefaultPacketSender.send(DefaultPacketSender.java:97) 
        at org.matomo.sdk.dispatcher.DefaultDispatcher$1.run(DefaultDispatcher.java:213) 
        at java.lang.Thread.run(Thread.java:919) 
     Caused by: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.
        at com.android.org.conscrypt.TrustManagerImpl.checkTrustedRecursive(TrustManagerImpl.java:658) 
        at com.android.org.conscrypt.TrustManagerImpl.checkTrusted(TrustManagerImpl.java:507) 
        at com.android.org.conscrypt.TrustManagerImpl.checkTrusted(TrustManagerImpl.java:426) 
        at com.android.org.conscrypt.TrustManagerImpl.getTrustedChainForServer(TrustManagerImpl.java:354) 
        at android.security.net.config.NetworkSecurityTrustManager.checkServerTrusted(NetworkSecurityTrustManager.java:94) 
        at android.security.net.config.RootTrustManager.checkServerTrusted(RootTrustManager.java:89) 
        at com.android.org.conscrypt.Platform.checkServerTrusted(Platform.java:224) 
        at com.android.org.conscrypt.ConscryptFileDescriptorSocket.verifyCertificateChain(ConscryptFileDescriptorSocket.java:407) 
        at com.android.org.conscrypt.NativeCrypto.SSL_do_handshake(Native Method) 
        at com.android.org.conscrypt.NativeSsl.doHandshake(NativeSsl.java:387) 
        at com.android.org.conscrypt.ConscryptFileDescriptorSocket.startHandshake(ConscryptFileDescriptorSocket.java:226) 
        at com.android.okhttp.internal.io.RealConnection.connectTls(RealConnection.java:196) 
        at com.android.okhttp.internal.io.RealConnection.connectSocket(RealConnection.java:153) 
        at com.android.okhttp.internal.io.RealConnection.connect(RealConnection.java:116) 
        at com.android.okhttp.internal.http.StreamAllocation.findConnection(StreamAllocation.java:186) 
        at com.android.okhttp.internal.http.StreamAllocation.findHealthyConnection(StreamAllocation.java:128) 
        at com.android.okhttp.internal.http.StreamAllocation.newStream(StreamAllocation.java:97) 
        at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:289) 
        at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:232) 
        at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:465) 
        at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:411) 
        at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getResponseCode(HttpURLConnectionImpl.java:542) 
        at com.android.okhttp.internal.huc.DelegatingHttpsURLConnection.getResponseCode(DelegatingHttpsURLConnection.java:106) 
        at com.android.okhttp.internal.huc.HttpsURLConnectionImpl.getResponseCode(HttpsURLConnectionImpl.java:30) 
        at org.matomo.sdk.dispatcher.DefaultPacketSender.send(DefaultPacketSender.java:97) 
        at org.matomo.sdk.dispatcher.DefaultDispatcher$1.run(DefaultDispatcher.java:213) 
        at java.lang.Thread.run(Thread.java:919) 
D/MATOMO:DefaultDispatcher: Failure while trying to send packet
D/MATOMO:DefaultDispatcher: Dispatched 0 events.

I understand there is a problem with SSL, but I cannot understand why it is working on myprodenv. Any idea or documentation I could read to find a solution please ? Or is there a particular thing to do with Matogo to configure SSL ?

d4rken commented 3 years ago

Might be a self-signed certificate? Closing due to not being an SDK issue.