Do not initialize internal tracer if it has already been initialized.

Bug: b/68989834
Change-Id: I7bb02d58cef5c14c6433d1fc7a95b46ff2b27f6f
Reviewed-on: https://webrtc-review.googlesource.com/23280
Reviewed-by: Magnus Jedvert <magjed@webrtc.org>
Commit-Queue: Sami Kalliomäki <sakal@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#20696}
diff --git a/sdk/android/BUILD.gn b/sdk/android/BUILD.gn
index e1c4df2..b3a7894 100644
--- a/sdk/android/BUILD.gn
+++ b/sdk/android/BUILD.gn
@@ -568,6 +568,7 @@
       "instrumentationtests/src/org/webrtc/HardwareVideoEncoderTest.java",
       "instrumentationtests/src/org/webrtc/MediaCodecVideoEncoderTest.java",
       "instrumentationtests/src/org/webrtc/NetworkMonitorTest.java",
+      "instrumentationtests/src/org/webrtc/PeerConnectionFactoryTest.java",
       "instrumentationtests/src/org/webrtc/PeerConnectionTest.java",
       "instrumentationtests/src/org/webrtc/RendererCommonTest.java",
       "instrumentationtests/src/org/webrtc/SurfaceTextureHelperTest.java",
diff --git a/sdk/android/api/org/webrtc/PeerConnectionFactory.java b/sdk/android/api/org/webrtc/PeerConnectionFactory.java
index d4b158d..de09a7c 100644
--- a/sdk/android/api/org/webrtc/PeerConnectionFactory.java
+++ b/sdk/android/api/org/webrtc/PeerConnectionFactory.java
@@ -29,7 +29,9 @@
 
   private static final String TAG = "PeerConnectionFactory";
   private static final String VIDEO_CAPTURER_THREAD_NAME = "VideoCapturerThread";
+
   private final long nativeFactory;
+  private static volatile boolean internalTracerInitialized = false;
   private static Context applicationContext;
   private static Thread networkThread;
   private static Thread workerThread;
@@ -120,7 +122,7 @@
     NativeLibrary.initialize(options.nativeLibraryLoader);
     nativeInitializeAndroidGlobals(options.applicationContext, options.enableVideoHwAcceleration);
     initializeFieldTrials(options.fieldTrials);
-    if (options.enableInternalTracer) {
+    if (options.enableInternalTracer && !internalTracerInitialized) {
       initializeInternalTracer();
     }
   }
@@ -154,6 +156,17 @@
     return true;
   }
 
+  @Deprecated
+  public static void initializeInternalTracer() {
+    internalTracerInitialized = true;
+    nativeInitializeInternalTracer();
+  }
+
+  public static void shutdownInternalTracer() {
+    internalTracerInitialized = false;
+    nativeShutdownInternalTracer();
+  }
+
   // Field trial initialization. Must be called before PeerConnectionFactory
   // is created.
   // Deprecated, use PeerConnectionFactory.initialize instead.
@@ -172,10 +185,10 @@
   // Internal tracing initialization. Must be called before PeerConnectionFactory is created to
   // prevent racing with tracing code.
   // Deprecated, use PeerConnectionFactory.initialize instead.
-  @Deprecated public static native void initializeInternalTracer();
+  private static native void nativeInitializeInternalTracer();
   // Internal tracing shutdown, called to prevent resource leaks. Must be called after
   // PeerConnectionFactory is gone to prevent races with code performing tracing.
-  public static native void shutdownInternalTracer();
+  private static native void nativeShutdownInternalTracer();
   // Start/stop internal capturing of internal tracing.
   public static native boolean startInternalTracingCapture(String tracing_filename);
   public static native void stopInternalTracingCapture();
diff --git a/sdk/android/instrumentationtests/src/org/webrtc/PeerConnectionFactoryTest.java b/sdk/android/instrumentationtests/src/org/webrtc/PeerConnectionFactoryTest.java
new file mode 100644
index 0000000..01e618d
--- /dev/null
+++ b/sdk/android/instrumentationtests/src/org/webrtc/PeerConnectionFactoryTest.java
@@ -0,0 +1,62 @@
+/*
+ *  Copyright 2017 The WebRTC project authors. All Rights Reserved.
+ *
+ *  Use of this source code is governed by a BSD-style license
+ *  that can be found in the LICENSE file in the root of the source
+ *  tree. An additional intellectual property rights grant can be found
+ *  in the file PATENTS.  All contributing project authors may
+ *  be found in the AUTHORS file in the root of the source tree.
+ */
+
+package org.webrtc;
+
+import android.support.test.InstrumentationRegistry;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(AndroidJUnit4.class)
+public class PeerConnectionFactoryTest {
+  @SmallTest
+  @Test
+  public void testInitialize() {
+    PeerConnectionFactory.initialize(PeerConnectionFactory.InitializationOptions
+                                         .builder(InstrumentationRegistry.getTargetContext())
+                                         .createInitializationOptions());
+  }
+
+  @SmallTest
+  @Test
+  public void testInitializeTwice() {
+    PeerConnectionFactory.initialize(PeerConnectionFactory.InitializationOptions
+                                         .builder(InstrumentationRegistry.getTargetContext())
+                                         .createInitializationOptions());
+    PeerConnectionFactory.initialize(PeerConnectionFactory.InitializationOptions
+                                         .builder(InstrumentationRegistry.getTargetContext())
+                                         .createInitializationOptions());
+  }
+
+  @SmallTest
+  @Test
+  public void testInitializeTwiceWithTracer() {
+    PeerConnectionFactory.initialize(PeerConnectionFactory.InitializationOptions
+                                         .builder(InstrumentationRegistry.getTargetContext())
+                                         .setEnableInternalTracer(true)
+                                         .createInitializationOptions());
+    PeerConnectionFactory.initialize(PeerConnectionFactory.InitializationOptions
+                                         .builder(InstrumentationRegistry.getTargetContext())
+                                         .setEnableInternalTracer(true)
+                                         .createInitializationOptions());
+  }
+
+  @SmallTest
+  @Test
+  public void testInitializeWithTracerAndShutdown() {
+    PeerConnectionFactory.initialize(PeerConnectionFactory.InitializationOptions
+                                         .builder(InstrumentationRegistry.getTargetContext())
+                                         .setEnableInternalTracer(true)
+                                         .createInitializationOptions());
+    PeerConnectionFactory.shutdownInternalTracer();
+  }
+}
diff --git a/sdk/android/src/jni/pc/peerconnectionfactory_jni.cc b/sdk/android/src/jni/pc/peerconnectionfactory_jni.cc
index a1b9b5e..e34d1fd 100644
--- a/sdk/android/src/jni/pc/peerconnectionfactory_jni.cc
+++ b/sdk/android/src/jni/pc/peerconnectionfactory_jni.cc
@@ -93,7 +93,7 @@
 }
 
 JNI_FUNCTION_DECLARATION(void,
-                         PeerConnectionFactory_initializeInternalTracer,
+                         PeerConnectionFactory_nativeInitializeInternalTracer,
                          JNIEnv* jni,
                          jclass) {
   rtc::tracing::SetupInternalTracer();
@@ -132,7 +132,7 @@
 }
 
 JNI_FUNCTION_DECLARATION(void,
-                         PeerConnectionFactory_shutdownInternalTracer,
+                         PeerConnectionFactory_nativeShutdownInternalTracer,
                          JNIEnv* jni,
                          jclass) {
   rtc::tracing::ShutdownInternalTracer();