diff --git a/framework-t/src/android/net/TrafficStats.java b/framework-t/src/android/net/TrafficStats.java
index 5eed3b5..caf3152 100644
--- a/framework-t/src/android/net/TrafficStats.java
+++ b/framework-t/src/android/net/TrafficStats.java
@@ -17,8 +17,6 @@
 package android.net;
 
 import static android.annotation.SystemApi.Client.MODULE_LIBRARIES;
-import static android.net.NetworkStats.UID_ALL;
-import static android.os.Process.SYSTEM_UID;
 
 import static com.android.internal.annotations.VisibleForTesting.Visibility.PRIVATE;
 
@@ -188,8 +186,6 @@
     private static INetworkStatsService sStatsService;
     @GuardedBy("TrafficStats.class")
     private static INetworkStatsService sStatsServiceForTest = null;
-    @GuardedBy("TrafficStats.class")
-    private static int sMyUidForTest = UID_ALL;
 
     @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 130143562)
     private synchronized static INetworkStatsService getStatsService() {
@@ -202,12 +198,7 @@
     }
 
     /** @hide */
-    protected static int getMyUid() {
-        synchronized (TrafficStats.class) {
-            if (sMyUidForTest != UID_ALL) {
-                return sMyUidForTest;
-            }
-        }
+    private static int getMyUid() {
         return android.os.Process.myUid();
     }
 
@@ -224,18 +215,6 @@
     }
 
     /**
-     * Set myUid for test, or UID_ALL to reset.
-     *
-     * @hide
-     */
-    @VisibleForTesting(visibility = PRIVATE)
-    public static void setMyUidForTest(int myUid) {
-        synchronized (TrafficStats.class) {
-            sMyUidForTest = myUid;
-        }
-    }
-
-    /**
      * Snapshot of {@link NetworkStats} when the currently active profiling
      * session started, or {@code null} if no session active.
      *
@@ -1006,13 +985,6 @@
 
     /** @hide */
     public static long getUidStats(int uid, int type) {
-        // Perform a quick check on the UID to avoid unnecessary work.
-        // This mirrors a similar check on the service side, but is primarily for
-        // efficiency rather than security, as user-space checks can be bypassed.
-        final int myUid = getMyUid();
-        if (!isEntryValueTypeValid(type) || (myUid != SYSTEM_UID && myUid != uid)) {
-            return UNSUPPORTED;
-        }
         final StatsResult stats;
         try {
             stats = getStatsService().getUidStats(uid);
@@ -1024,9 +996,6 @@
 
     /** @hide */
     public static long getTotalStats(int type) {
-        if (!isEntryValueTypeValid(type)) {
-            return UNSUPPORTED;
-        }
         final StatsResult stats;
         try {
             stats = getStatsService().getTotalStats();
@@ -1038,9 +1007,6 @@
 
     /** @hide */
     public static long getIfaceStats(String iface, int type) {
-        if (!isEntryValueTypeValid(type)) {
-            return UNSUPPORTED;
-        }
         final StatsResult stats;
         try {
             stats = getStatsService().getIfaceStats(iface);
diff --git a/tests/unit/java/android/net/TrafficStatsTest.kt b/tests/unit/java/android/net/TrafficStatsTest.kt
deleted file mode 100644
index 6e8f3db..0000000
--- a/tests/unit/java/android/net/TrafficStatsTest.kt
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * Copyright (C) 2024 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net
-
-import android.net.NetworkStats.UID_ALL
-import android.net.TrafficStats.UNSUPPORTED
-import android.net.netstats.StatsResult
-import android.os.Build
-import android.os.Process.SYSTEM_UID
-import com.android.testutils.DevSdkIgnoreRule
-import com.android.testutils.DevSdkIgnoreRunner
-import org.junit.After
-import org.junit.Assert.assertEquals
-import org.junit.Before
-import org.junit.Test
-import org.junit.runner.RunWith
-import org.mockito.ArgumentMatchers.anyInt
-import org.mockito.Mockito.doReturn
-import org.mockito.Mockito.mock
-import org.mockito.Mockito.never
-import org.mockito.Mockito.verify
-
-@RunWith(DevSdkIgnoreRunner::class)
-@DevSdkIgnoreRule.IgnoreUpTo(Build.VERSION_CODES.S_V2)
-class TrafficStatsTest {
-    private val binder = mock(INetworkStatsService::class.java)
-    private val myUid = android.os.Process.myUid()
-    private val notMyUid = myUid + 1
-    private val mockSystemUidStatsResult = StatsResult(1L, 2L, 3L, 4L)
-    private val mockMyUidStatsResult = StatsResult(5L, 6L, 7L, 8L)
-    private val mockNotMyUidStatsResult = StatsResult(9L, 10L, 11L, 12L)
-    private val unsupportedStatsResult =
-            StatsResult(UNSUPPORTED.toLong(), UNSUPPORTED.toLong(),
-                    UNSUPPORTED.toLong(), UNSUPPORTED.toLong())
-
-    @Before
-    fun setUp() {
-        TrafficStats.setServiceForTest(binder)
-        doReturn(mockSystemUidStatsResult).`when`(binder).getUidStats(SYSTEM_UID)
-        doReturn(mockMyUidStatsResult).`when`(binder).getUidStats(myUid)
-        doReturn(mockNotMyUidStatsResult).`when`(binder).getUidStats(notMyUid)
-    }
-
-    @After
-    fun tearDown() {
-        TrafficStats.setServiceForTest(null)
-        TrafficStats.setMyUidForTest(UID_ALL)
-    }
-
-    private fun assertUidStats(uid: Int, stats: StatsResult) {
-        assertEquals(stats.rxBytes, TrafficStats.getUidRxBytes(uid))
-        assertEquals(stats.rxPackets, TrafficStats.getUidRxPackets(uid))
-        assertEquals(stats.txBytes, TrafficStats.getUidTxBytes(uid))
-        assertEquals(stats.txPackets, TrafficStats.getUidTxPackets(uid))
-    }
-
-    // Verify a normal caller could get a quick UNSUPPORTED result in the TrafficStats
-    // without accessing the service if query stats other than itself.
-    @Test
-    fun testGetUidStats_appCaller() {
-        assertUidStats(SYSTEM_UID, unsupportedStatsResult)
-        assertUidStats(notMyUid, unsupportedStatsResult)
-        verify(binder, never()).getUidStats(anyInt())
-        assertUidStats(myUid, mockMyUidStatsResult)
-    }
-
-    // Verify that callers with SYSTEM_UID can access network
-    // stats for other UIDs. While this behavior is not officially documented
-    // in the API, it exists for compatibility with existing callers that may
-    // rely on it.
-    @Test
-    fun testGetUidStats_systemCaller() {
-        TrafficStats.setMyUidForTest(SYSTEM_UID)
-        assertUidStats(SYSTEM_UID, mockSystemUidStatsResult)
-        assertUidStats(myUid, mockMyUidStatsResult)
-        assertUidStats(notMyUid, mockNotMyUidStatsResult)
-    }
-}
