Merge "Add atneya@ to OWNERS for voice service" into main
diff --git a/AconfigFlags.bp b/AconfigFlags.bp
index 1d12378..960bb5c 100644
--- a/AconfigFlags.bp
+++ b/AconfigFlags.bp
@@ -279,6 +279,7 @@
name: "android_nfc_flags_aconfig_c_lib",
vendor_available: true,
aconfig_declarations: "android.nfc.flags-aconfig",
+ min_sdk_version: "34",
apex_available: [
"//apex_available:platform",
"com.android.nfcservices",
diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java
index 5e69ec1..fb7030f 100644
--- a/core/java/android/app/ActivityThread.java
+++ b/core/java/android/app/ActivityThread.java
@@ -6859,21 +6859,44 @@
final void handleProfilerControl(boolean start, ProfilerInfo profilerInfo, int profileType) {
if (start) {
- try {
- switch (profileType) {
- default:
+ switch (profileType) {
+ case ProfilerInfo.PROFILE_TYPE_LOW_OVERHEAD:
+ if (!com.android.art.flags.Flags.alwaysEnableProfileCode()) {
+ Slog.w(TAG, "Low overhead tracing feature is not enabled");
+ break;
+ }
+ VMDebug.startLowOverheadTrace();
+ break;
+ default:
+ try {
mProfiler.setProfiler(profilerInfo);
mProfiler.startProfiling();
break;
- }
- } catch (RuntimeException e) {
- Slog.w(TAG, "Profiling failed on path " + profilerInfo.profileFile
- + " -- can the process access this path?");
- } finally {
- profilerInfo.closeFd();
+ } catch (RuntimeException e) {
+ Slog.w(TAG, "Profiling failed on path " + profilerInfo.profileFile
+ + " -- can the process access this path?");
+ } finally {
+ profilerInfo.closeFd();
+ }
}
} else {
switch (profileType) {
+ case ProfilerInfo.PROFILE_TYPE_LOW_OVERHEAD:
+ if (!com.android.art.flags.Flags.alwaysEnableProfileCode()) {
+ if (profilerInfo != null) {
+ profilerInfo.closeFd();
+ }
+ Slog.w(TAG, "Low overhead tracing feature is not enabled");
+ break;
+ }
+ if (profilerInfo != null) {
+ FileDescriptor fd = profilerInfo.profileFd.getFileDescriptor();
+ VMDebug.TraceDestination dst =
+ VMDebug.TraceDestination.fromFileDescriptor(fd);
+ VMDebug.dumpLowOverheadTrace(dst);
+ }
+ VMDebug.stopLowOverheadTrace();
+ break;
default:
mProfiler.stopProfiling();
break;
diff --git a/core/java/android/app/ProfilerInfo.java b/core/java/android/app/ProfilerInfo.java
index bcae22a..0348b6d 100644
--- a/core/java/android/app/ProfilerInfo.java
+++ b/core/java/android/app/ProfilerInfo.java
@@ -32,6 +32,12 @@
* {@hide}
*/
public class ProfilerInfo implements Parcelable {
+ // Regular profiling which provides different modes of profiling at some performance cost.
+ public static final int PROFILE_TYPE_REGULAR = 0;
+
+ // Low overhead profiling that captures a simple sliding window of past events.
+ public static final int PROFILE_TYPE_LOW_OVERHEAD = 1;
+
// Version of the profiler output
public static final int OUTPUT_VERSION_DEFAULT = 1;
// CLOCK_TYPE_DEFAULT chooses the default used by ART. ART uses CLOCK_TYPE_DUAL by default (see
diff --git a/core/java/android/net/LocalSocket.java b/core/java/android/net/LocalSocket.java
index a86396c..0fedf8e 100644
--- a/core/java/android/net/LocalSocket.java
+++ b/core/java/android/net/LocalSocket.java
@@ -65,7 +65,7 @@
}
/**
- * Creates a AF_LOCAL/UNIX domain stream socket with given socket type
+ * Creates a AF_LOCAL/UNIX domain socket with the given socket type.
*
* @param sockType either {@link #SOCKET_DGRAM}, {@link #SOCKET_STREAM}
* or {@link #SOCKET_SEQPACKET}
diff --git a/core/java/android/security/flags.aconfig b/core/java/android/security/flags.aconfig
index 5d1d758..392b42d 100644
--- a/core/java/android/security/flags.aconfig
+++ b/core/java/android/security/flags.aconfig
@@ -105,6 +105,7 @@
namespace: "biometrics"
description: "Clear StrongAuth on add credential"
bug: "320817991"
+ is_exported: true
}
flag {
@@ -127,4 +128,5 @@
namespace: "hardware_backed_security"
description: "Feature flag for exposing KeyStore grant APIs"
bug: "351158708"
+ is_exported: true
}
diff --git a/omapi/aidl/Android.bp b/omapi/aidl/Android.bp
index e71597a..3916bf3 100644
--- a/omapi/aidl/Android.bp
+++ b/omapi/aidl/Android.bp
@@ -24,6 +24,7 @@
backend: {
java: {
sdk_version: "module_current",
+ min_sdk_version: "35", // Make it 36 once available.
apex_available: [
"//apex_available:platform",
"com.android.nfcservices",
diff --git a/packages/Vcn/framework-b/Android.bp b/packages/Vcn/framework-b/Android.bp
index be64bb1..8b010c7 100644
--- a/packages/Vcn/framework-b/Android.bp
+++ b/packages/Vcn/framework-b/Android.bp
@@ -40,5 +40,28 @@
"android.net.vcn",
],
+ impl_library_visibility: [
+ // Using for test only
+ "//cts/tests/netlegacy22.api",
+ "//cts/tests/tests/vcn",
+ "//external/sl4a:__subpackages__",
+ "//frameworks/base/core/tests/bandwidthtests",
+ "//frameworks/base/core/tests/benchmarks",
+ "//frameworks/base/core/tests/utillib",
+ "//frameworks/base/services/tests/VpnTests",
+ "//frameworks/base/tests/vcn",
+ "//frameworks/opt/telephony/tests/telephonytests",
+ "//packages/modules/CaptivePortalLogin/tests",
+ "//packages/modules/Connectivity/staticlibs/testutils",
+ "//packages/modules/Connectivity/staticlibs/tests:__subpackages__",
+ "//packages/modules/Connectivity/Tethering/tests:__subpackages__",
+ "//packages/modules/Connectivity/tests:__subpackages__",
+ "//packages/modules/Connectivity/thread/tests:__subpackages__",
+ "//packages/modules/IPsec/tests/iketests",
+ "//packages/modules/NetworkStack",
+ "//packages/modules/NetworkStack/tests:__subpackages__",
+ "//packages/modules/Wifi/service/tests/wifitests",
+ ],
+
// TODO: b/375213246 Expose this library to Tethering module
}
diff --git a/services/core/Android.bp b/services/core/Android.bp
index f08c876..349f3ee 100644
--- a/services/core/Android.bp
+++ b/services/core/Android.bp
@@ -233,7 +233,6 @@
"core_os_flags_lib",
"connectivity_flags_lib",
"dreams_flags_lib",
- "aconfig_flags_java",
"aconfig_new_storage_flags_lib",
"powerstats_flags_lib",
"locksettings_flags_lib",
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index 4a4a1b4..0152f94 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -7609,7 +7609,7 @@
}
void setProfileApp(ApplicationInfo app, String processName, ProfilerInfo profilerInfo,
- ApplicationInfo sdkSandboxClientApp) {
+ ApplicationInfo sdkSandboxClientApp, int profileType) {
synchronized (mAppProfiler.mProfilerLock) {
if (!Build.IS_DEBUGGABLE) {
boolean isAppDebuggable = (app.flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0;
@@ -7625,7 +7625,7 @@
+ "and not profileable by shell: " + app.packageName);
}
}
- mAppProfiler.setProfileAppLPf(processName, profilerInfo);
+ mAppProfiler.setProfileAppLPf(processName, profilerInfo, profileType);
}
}
@@ -17883,7 +17883,8 @@
+ android.Manifest.permission.SET_ACTIVITY_WATCHER);
}
- if (start && (profilerInfo == null || profilerInfo.profileFd == null)) {
+ if (start && profileType == ProfilerInfo.PROFILE_TYPE_REGULAR
+ && (profilerInfo == null || profilerInfo.profileFd == null)) {
throw new IllegalArgumentException("null profile info or fd");
}
@@ -19499,7 +19500,9 @@
}
if (profilerInfo != null) {
- setProfileApp(aInfo.applicationInfo, aInfo.processName, profilerInfo, null);
+ // We only support normal method tracing along with app startup for now.
+ setProfileApp(aInfo.applicationInfo, aInfo.processName, profilerInfo,
+ null, /*profileType= */ ProfilerInfo.PROFILE_TYPE_REGULAR);
}
wmLock.notify();
}
diff --git a/services/core/java/com/android/server/am/ActivityManagerShellCommand.java b/services/core/java/com/android/server/am/ActivityManagerShellCommand.java
index 955437b..1853973 100644
--- a/services/core/java/com/android/server/am/ActivityManagerShellCommand.java
+++ b/services/core/java/com/android/server/am/ActivityManagerShellCommand.java
@@ -1081,7 +1081,7 @@
String profileFile = null;
boolean start = false;
int userId = UserHandle.USER_CURRENT;
- int profileType = 0;
+ int profileType = ProfilerInfo.PROFILE_TYPE_REGULAR;
mSamplingInterval = 0;
mStreaming = false;
mClockType = ProfilerInfo.CLOCK_TYPE_DEFAULT;
@@ -1123,6 +1123,18 @@
}
}
process = getNextArgRequired();
+ } else if ("lowoverhead".equals(cmd)) {
+ // This is an experimental low overhead profiling.
+ profileType = ProfilerInfo.PROFILE_TYPE_LOW_OVERHEAD;
+ cmd = getNextArgRequired();
+ if ("start".equals(cmd)) {
+ start = true;
+ } else if ("stop".equals(cmd)) {
+ start = false;
+ } else {
+ throw new IllegalArgumentException("Profile command not valid");
+ }
+ process = getNextArgRequired();
} else {
// Compatibility with old syntax: process is specified first.
process = cmd;
@@ -1142,7 +1154,12 @@
ParcelFileDescriptor fd = null;
ProfilerInfo profilerInfo = null;
- if (start) {
+ // For regular method tracing profileFile should be provided with the start command. For
+ // low overhead method tracing the profileFile is optional and provided with the stop
+ // command.
+ if ((start && profileType == ProfilerInfo.PROFILE_TYPE_REGULAR)
+ || (profileType == ProfilerInfo.PROFILE_TYPE_LOW_OVERHEAD
+ && !start && getRemainingArgsCount() > 0)) {
profileFile = getNextArgRequired();
fd = openFileForSystem(profileFile, "w");
if (fd == null) {
diff --git a/services/core/java/com/android/server/am/AppProfiler.java b/services/core/java/com/android/server/am/AppProfiler.java
index dda48ad..79a0d73 100644
--- a/services/core/java/com/android/server/am/AppProfiler.java
+++ b/services/core/java/com/android/server/am/AppProfiler.java
@@ -1990,7 +1990,7 @@
}
@GuardedBy("mProfilerLock")
- private void stopProfilerLPf(ProcessRecord proc, int profileType) {
+ private void stopProfilerLPf(ProcessRecord proc, ProfilerInfo profilerInfo, int profileType) {
if (proc == null || proc == mProfileData.getProfileProc()) {
proc = mProfileData.getProfileProc();
profileType = mProfileType;
@@ -2004,7 +2004,7 @@
return;
}
try {
- thread.profilerControl(false, null, profileType);
+ thread.profilerControl(false, profilerInfo, profileType);
} catch (RemoteException e) {
throw new IllegalStateException("Process disappeared");
}
@@ -2039,41 +2039,58 @@
ProfilerInfo profilerInfo, int profileType) {
try {
if (start) {
- stopProfilerLPf(null, 0);
+ boolean needsFile = (profileType == ProfilerInfo.PROFILE_TYPE_REGULAR);
+ stopProfilerLPf(null, null, 0);
mService.setProfileApp(proc.info, proc.processName, profilerInfo,
- proc.isSdkSandbox ? proc.getClientInfoForSdkSandbox() : null);
+ proc.isSdkSandbox ? proc.getClientInfoForSdkSandbox() : null, profileType);
mProfileData.setProfileProc(proc);
mProfileType = profileType;
- ParcelFileDescriptor fd = profilerInfo.profileFd;
- try {
- fd = fd.dup();
- } catch (IOException e) {
- fd = null;
- }
- profilerInfo.profileFd = fd;
- proc.mProfile.getThread().profilerControl(start, profilerInfo, profileType);
- fd = null;
- try {
- mProfileData.getProfilerInfo().profileFd.close();
- } catch (IOException e) {
- }
- mProfileData.getProfilerInfo().profileFd = null;
- if (proc.getPid() == mService.MY_PID) {
- // When profiling the system server itself, avoid closing the file
- // descriptor, as profilerControl will not create a copy.
- // Note: it is also not correct to just set profileFd to null, as the
- // whole ProfilerInfo instance is passed down!
- profilerInfo = null;
- }
- } else {
- stopProfilerLPf(proc, profileType);
- if (profilerInfo != null && profilerInfo.profileFd != null) {
+ ParcelFileDescriptor fd = null;
+ if (needsFile) {
+ fd = profilerInfo.profileFd;
try {
- profilerInfo.profileFd.close();
+ fd = fd.dup();
+ } catch (IOException e) {
+ fd = null;
+ }
+ profilerInfo.profileFd = fd;
+ }
+
+ proc.mProfile.getThread().profilerControl(start, profilerInfo, profileType);
+
+ if (needsFile) {
+ fd = null;
+ try {
+ mProfileData.getProfilerInfo().profileFd.close();
} catch (IOException e) {
}
+ mProfileData.getProfilerInfo().profileFd = null;
+
+ if (proc.getPid() == mService.MY_PID) {
+ // When profiling the system server itself, avoid closing the file
+ // descriptor, as profilerControl will not create a copy.
+ // Note: it is also not correct to just set profileFd to null, as the
+ // whole ProfilerInfo instance is passed down!
+ profilerInfo = null;
+ }
}
+ } else {
+ boolean mayNeedFile = (profileType == ProfilerInfo.PROFILE_TYPE_LOW_OVERHEAD);
+ if (profilerInfo != null && profilerInfo.profileFd != null) {
+ ParcelFileDescriptor fd = profilerInfo.profileFd;
+ try {
+ if (mayNeedFile) {
+ fd = fd.dup();
+ } else {
+ fd.close();
+ }
+ } catch (IOException e) {
+ fd = null;
+ }
+ profilerInfo.profileFd = fd;
+ }
+ stopProfilerLPf(proc, profilerInfo, profileType);
}
return true;
@@ -2090,7 +2107,7 @@
}
@GuardedBy("mProfilerLock")
- void setProfileAppLPf(String processName, ProfilerInfo profilerInfo) {
+ void setProfileAppLPf(String processName, ProfilerInfo profilerInfo, int profileType) {
mProfileData.setProfileApp(processName);
if (mProfileData.getProfilerInfo() != null) {
@@ -2101,8 +2118,10 @@
}
}
}
- mProfileData.setProfilerInfo(new ProfilerInfo(profilerInfo));
- mProfileType = 0;
+ if (profilerInfo != null) {
+ mProfileData.setProfilerInfo(new ProfilerInfo(profilerInfo));
+ }
+ mProfileType = profileType;
}
@GuardedBy("mProfilerLock")
diff --git a/services/core/java/com/android/server/am/SettingsToPropertiesMapper.java b/services/core/java/com/android/server/am/SettingsToPropertiesMapper.java
index 90f92b0..f79256d 100644
--- a/services/core/java/com/android/server/am/SettingsToPropertiesMapper.java
+++ b/services/core/java/com/android/server/am/SettingsToPropertiesMapper.java
@@ -39,7 +39,6 @@
import android.aconfigd.Aconfigd.StorageReturnMessage;
import android.aconfigd.Aconfigd.StorageReturnMessages;
import static com.android.aconfig_new_storage.Flags.enableAconfigStorageDaemon;
-import static com.android.aconfig.flags.Flags.enableSystemAconfigdRust;
import java.io.DataInputStream;
import java.io.DataOutputStream;
@@ -392,8 +391,7 @@
static ProtoInputStream sendAconfigdRequests(ProtoOutputStream requests) {
// connect to aconfigd socket
LocalSocket client = new LocalSocket();
- String socketName = enableSystemAconfigdRust()
- ? "aconfigd_system" : "aconfigd";
+ String socketName = "aconfigd_system";
try {
client.connect(new LocalSocketAddress(
socketName, LocalSocketAddress.Namespace.RESERVED));