diff options
| author | 2023-07-25 22:25:56 +0000 | |
|---|---|---|
| committer | 2023-07-25 22:25:56 +0000 | |
| commit | 642e4c0b55e53fa1eeeb325a642a88fac48cdbd2 (patch) | |
| tree | 40d1c64fcd82a17687d5ab00feefeebdc788e9fa | |
| parent | f155938dc9e3ac93dc7b9d29c1a82e323a6b02a9 (diff) | |
| parent | d6201fa4497425eba3c37f907fd4e56715b43301 (diff) | |
Merge "Enable perfetto tracing for non-autogenerated AIDL names" into udc-qpr-dev
| -rw-r--r-- | core/java/android/os/Binder.java | 25 | ||||
| -rw-r--r-- | core/tests/coretests/src/android/os/AidlTest.java | 33 |
2 files changed, 34 insertions, 24 deletions
diff --git a/core/java/android/os/Binder.java b/core/java/android/os/Binder.java index 00676f3cb746..01e8fea1019d 100644 --- a/core/java/android/os/Binder.java +++ b/core/java/android/os/Binder.java @@ -926,16 +926,19 @@ public class Binder implements IBinder { * @hide */ @VisibleForTesting - public final @NonNull String getTransactionTraceName(int transactionCode) { + public final @Nullable String getTransactionTraceName(int transactionCode) { + final boolean isInterfaceUserDefined = getMaxTransactionId() == 0; if (mTransactionTraceNames == null) { - final int highestId = Math.min(getMaxTransactionId(), TRANSACTION_TRACE_NAME_ID_LIMIT); + final int highestId = isInterfaceUserDefined ? TRANSACTION_TRACE_NAME_ID_LIMIT + : Math.min(getMaxTransactionId(), TRANSACTION_TRACE_NAME_ID_LIMIT); mSimpleDescriptor = getSimpleDescriptor(); mTransactionTraceNames = new AtomicReferenceArray(highestId + 1); } - final int index = transactionCode - FIRST_CALL_TRANSACTION; - if (index < 0 || index >= mTransactionTraceNames.length()) { - return mSimpleDescriptor + "#" + transactionCode; + final int index = isInterfaceUserDefined + ? transactionCode : transactionCode - FIRST_CALL_TRANSACTION; + if (index >= mTransactionTraceNames.length() || index < 0) { + return null; } String transactionTraceName = mTransactionTraceNames.getAcquire(index); @@ -1300,19 +1303,9 @@ public class Binder implements IBinder { final boolean hasFullyQualifiedName = getMaxTransactionId() > 0; final String transactionTraceName; - if (tagEnabled && hasFullyQualifiedName) { + if (tagEnabled) { // If tracing enabled and we have a fully qualified name, fetch the name transactionTraceName = getTransactionTraceName(code); - } else if (tagEnabled && isStackTrackingEnabled()) { - // If tracing is enabled and we *don't* have a fully qualified name, fetch the - // 'best effort' name only for stack tracking. This works around noticeable perf impact - // on low latency binder calls (<100us). The tracing call itself is between (1-10us) and - // the perf impact can be quite noticeable while benchmarking such binder calls. - // The primary culprits are ContentProviders and Cursors which convenienty don't - // autogenerate their AIDL and hence will not have a fully qualified name. - // - // TODO(b/253426478): Relax this constraint after a more robust fix - transactionTraceName = getTransactionTraceName(code); } else { transactionTraceName = null; } diff --git a/core/tests/coretests/src/android/os/AidlTest.java b/core/tests/coretests/src/android/os/AidlTest.java index 5f54b093e5e5..d0c3470c4c1f 100644 --- a/core/tests/coretests/src/android/os/AidlTest.java +++ b/core/tests/coretests/src/android/os/AidlTest.java @@ -28,12 +28,14 @@ public class AidlTest extends TestCase { private IAidlTest mRemote; private AidlObject mLocal; + private NonAutoGeneratedObject mNonAutoGenerated; @Override protected void setUp() throws Exception { super.setUp(); mLocal = new AidlObject(); mRemote = IAidlTest.Stub.asInterface(mLocal); + mNonAutoGenerated = new NonAutoGeneratedObject("NonAutoGeneratedObject"); } private static boolean check(TestParcelable p, int n, String s) { @@ -84,6 +86,12 @@ public class AidlTest extends TestCase { } } + private static class NonAutoGeneratedObject extends Binder { + NonAutoGeneratedObject(String descriptor) { + super(descriptor); + } + } + private static class AidlObject extends IAidlTest.Stub { public IInterface queryLocalInterface(String descriptor) { // overriding this to return null makes asInterface always @@ -194,7 +202,7 @@ public class AidlTest extends TestCase { TestParcelable[] a1, TestParcelable[] a2) { return null; } - + public void voidSecurityException() { throw new SecurityException("gotcha!"); } @@ -396,7 +404,7 @@ public class AidlTest extends TestCase { assertEquals("s2[1]", s2[1]); assertEquals("s2[2]", s2[2]); } - + @SmallTest public void testVoidSecurityException() throws Exception { boolean good = false; @@ -407,7 +415,7 @@ public class AidlTest extends TestCase { } assertEquals(good, true); } - + @SmallTest public void testIntSecurityException() throws Exception { boolean good = false; @@ -420,7 +428,7 @@ public class AidlTest extends TestCase { } @SmallTest - public void testGetTransactionName() throws Exception { + public void testGetTransactionNameAutoGenerated() throws Exception { assertEquals(15, mLocal.getMaxTransactionId()); assertEquals("booleanArray", @@ -430,12 +438,21 @@ public class AidlTest extends TestCase { assertEquals("parcelableIn", mLocal.getTransactionName(IAidlTest.Stub.TRANSACTION_parcelableIn)); - assertEquals("IAidlTest:booleanArray", + assertEquals("AIDL::java::IAidlTest::booleanArray::server", mLocal.getTransactionTraceName(IAidlTest.Stub.TRANSACTION_booleanArray)); - assertEquals("IAidlTest:voidSecurityException", + assertEquals("AIDL::java::IAidlTest::voidSecurityException::server", mLocal.getTransactionTraceName(IAidlTest.Stub.TRANSACTION_voidSecurityException)); - assertEquals("IAidlTest:parcelableIn", + assertEquals("AIDL::java::IAidlTest::parcelableIn::server", mLocal.getTransactionTraceName(IAidlTest.Stub.TRANSACTION_parcelableIn)); } -} + @SmallTest + public void testGetTransactionNameNonAutoGenerated() throws Exception { + assertEquals(0, mNonAutoGenerated.getMaxTransactionId()); + + assertEquals("AIDL::java::NonAutoGeneratedObject::#0::server", + mNonAutoGenerated.getTransactionTraceName(0)); + assertEquals("AIDL::java::NonAutoGeneratedObject::#1::server", + mNonAutoGenerated.getTransactionTraceName(1)); + } +} |