Merge changes from topic "Fixing CF Auto audiocontrol" into rvc-dev
* changes:
Updating to audiocontrol@2.0
Including default implementation of audiocontrol@1.0
diff --git a/common/frontend/socket_vsock_proxy/main.cpp b/common/frontend/socket_vsock_proxy/main.cpp
index a9e295f..c11852f 100644
--- a/common/frontend/socket_vsock_proxy/main.cpp
+++ b/common/frontend/socket_vsock_proxy/main.cpp
@@ -49,15 +49,15 @@
}
}
- ssize_t SendAll(const std::vector<char>& packet) {
+ ssize_t SendAll(const char* packet, ssize_t length) {
ssize_t written{};
- while (written < static_cast<ssize_t>(packet.size())) {
+ while (written < length) {
if (!socket_->IsOpen()) {
return -1;
}
auto just_written =
- socket_->Send(packet.data() + written,
- packet.size() - written, MSG_NOSIGNAL);
+ socket_->Send(packet + written,
+ length - written, MSG_NOSIGNAL);
if (just_written <= 0) {
LOG(INFO) << "Couldn't write to client: "
<< strerror(socket_->GetErrno());
@@ -82,13 +82,14 @@
SocketReceiver(const SocketReceiver&&) = delete;
SocketReceiver& operator=(const SocketReceiver&) = delete;
- // *packet will be empty if Read returns 0 or error
- void Recv(std::vector<char>* packet) {
- auto size = socket_->Read(packet->data(), packet->size());
+ // return value will be 0 if Read returns 0 or error
+ ssize_t Recv(char* packet, ssize_t length) {
+ auto size = socket_->Read(packet, length);
if (size < 0) {
size = 0;
}
- packet->resize(size);
+
+ return size;
}
private:
@@ -97,10 +98,11 @@
void SocketToVsock(SocketReceiver socket_receiver,
SocketSender vsock_sender) {
+ char packet[kMaxPacketSize] = {};
+
while (true) {
- std::vector<char> packet(kMaxPacketSize, '\0');
- socket_receiver.Recv(&packet);
- if (packet.empty() || vsock_sender.SendAll(packet) < 0) {
+ ssize_t length = socket_receiver.Recv(packet, kMaxPacketSize);
+ if (length == 0 || vsock_sender.SendAll(packet, length) < 0) {
break;
}
}
@@ -109,13 +111,14 @@
void VsockToSocket(SocketSender socket_sender,
SocketReceiver vsock_receiver) {
- std::vector<char> packet(kMaxPacketSize, '\0');
+ char packet[kMaxPacketSize] = {};
+
while (true) {
- vsock_receiver.Recv(&packet);
- if (packet.empty()) {
+ ssize_t length = vsock_receiver.Recv(packet, kMaxPacketSize);
+ if (length == 0) {
break;
}
- if (socket_sender.SendAll(packet) < 0) {
+ if (socket_sender.SendAll(packet, length) < 0) {
break;
}
}
diff --git a/guest/monitoring/cuttlefish_service/Android.mk b/guest/monitoring/cuttlefish_service/Android.mk
index 2540ef5..b08adaf 100644
--- a/guest/monitoring/cuttlefish_service/Android.mk
+++ b/guest/monitoring/cuttlefish_service/Android.mk
@@ -15,12 +15,12 @@
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
-LOCAL_CERTIFICATE := platform
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := $(call all-java-files-under, java)
LOCAL_STATIC_JAVA_LIBRARIES := guava
LOCAL_PACKAGE_NAME := CuttlefishService
LOCAL_SDK_VERSION := 28
+LOCAL_PRIVILEGED_MODULE := true
LOCAL_PROGUARD_FLAGS := -include build/core/proguard.flags
LOCAL_PROGUARD_FLAG_FILES := proguard.flags
LOCAL_PROGUARD_ENABLED := obfuscation
diff --git a/guest/monitoring/cuttlefish_service/AndroidManifest.xml b/guest/monitoring/cuttlefish_service/AndroidManifest.xml
index 85abd09..428445a 100644
--- a/guest/monitoring/cuttlefish_service/AndroidManifest.xml
+++ b/guest/monitoring/cuttlefish_service/AndroidManifest.xml
@@ -1,21 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.android.google.gce.gceservice"
- android:sharedUserId="android.uid.system">
+ package="com.android.google.gce.gceservice">
<uses-sdk android:minSdkVersion="5" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
+ <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
- <uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS" />
<uses-permission android:name="android.permission.BLUETOOTH" />
- <uses-permission android:name="android.permission.OVERRIDE_WIFI_CONFIG" />
- <uses-permission android:name="android.permission.DUMP" />
<application
android:label="GceService"
diff --git a/guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/GceBroadcastReceiver.java b/guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/GceBroadcastReceiver.java
index 754eb8f..7b8d864 100644
--- a/guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/GceBroadcastReceiver.java
+++ b/guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/GceBroadcastReceiver.java
@@ -20,10 +20,8 @@
import android.content.Context;
import android.content.Intent;
import android.net.ConnectivityManager;
-import android.net.NetworkInfo;
import android.util.Log;
-import com.android.google.gce.gceservice.GceService;
public class GceBroadcastReceiver extends BroadcastReceiver {
private static final String LOG_TAG = "GceBroadcastReceiver";
@@ -32,7 +30,7 @@
private void reportIntent(Context context, String intentType) {
Intent intent = new Intent(context, GceService.class);
intent.setAction(intentType);
- context.startService(intent);
+ context.startForegroundService(intent);
}
diff --git a/guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/GceService.java b/guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/GceService.java
index b070377..34f3b1a 100644
--- a/guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/GceService.java
+++ b/guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/GceService.java
@@ -15,13 +15,16 @@
*/
package com.android.google.gce.gceservice;
+import android.app.Notification;
+import android.app.NotificationChannel;
+import android.app.NotificationManager;
import android.app.Service;
import android.bluetooth.BluetoothAdapter;
+import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.net.ConnectivityManager;
import android.util.Log;
-import android.os.Binder;
import android.os.IBinder;
import java.io.FileDescriptor;
import java.io.PrintWriter;
@@ -37,11 +40,12 @@
public static final String INTENT_ACTION_CONFIGURE = "com.android.google.gce.gceservice.CONFIGURE";
public static final String INTENT_ACTION_NETWORK_CHANGED = "com.android.google.gce.gceservice.NETWORK_CHANGED";
public static final String INTENT_ACTION_BLUETOOTH_CHANGED = "com.android.google.gce.gceservice.BLUETOOTH_CHANGED";
- private static final int NETWORK_OR_BOOT_TIMEOUT = 30;
+ private static final String NOTIFICATION_CHANNEL_ID = "cuttlefish-service";
+ private static final String NOTIFICATION_CHANNEL_NAME = "Cuttlefish Service";
+ private static final int NOTIFICATION_ID = 1;
private final JobExecutor mExecutor = new JobExecutor();
private final LocationServicesManager mLocationServices = new LocationServicesManager(this);
- private final PackageVerifierManager mPackageVerifier = new PackageVerifierManager(this);
private final PackageVerificationConsentEnforcer mConsentEnforcer = new PackageVerificationConsentEnforcer(this);
private final BootReporter mBootReporter = new BootReporter();
private final GceBroadcastReceiver mBroadcastReceiver = new GceBroadcastReceiver();
@@ -66,7 +70,6 @@
mWifiManager = new GceWifiManager(this, mBootReporter, mExecutor);
mExecutor.schedule(mLocationServices);
- mExecutor.schedule(mPackageVerifier);
mExecutor.schedule(mConsentEnforcer);
mExecutor.schedule(mWifiManager);
mExecutor.schedule(mBluetoothChecker);
@@ -77,10 +80,19 @@
mExecutor.schedule(mBootReporter,
mLocationServices.getLocationServicesReady(),
- mPackageVerifier.getPackageVerifierReady(),
mBluetoothChecker.getEnabled()
// mTombstoneChecker.getTombstoneResult()
);
+
+ NotificationManager notificationManager =
+ (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
+ NotificationChannel channel =
+ new NotificationChannel(
+ NOTIFICATION_CHANNEL_ID,
+ NOTIFICATION_CHANNEL_NAME,
+ NotificationManager.IMPORTANCE_LOW);
+ notificationManager.createNotificationChannel(channel);
+
} catch (Exception e) {
Log.e(LOG_TAG, "Exception caught", e);
}
@@ -120,6 +132,15 @@
Log.e(LOG_TAG, "Missing intent action.");
}
+ Notification notification =
+ new Notification.Builder(this, NOTIFICATION_CHANNEL_ID)
+ .setAutoCancel(true)
+ .setContentTitle("Cuttlefish service is running.")
+ .setSmallIcon(android.R.drawable.ic_dialog_info)
+ .setTimeoutAfter(10000)
+ .build();
+ startForeground(NOTIFICATION_ID, notification);
+
if (INTENT_ACTION_CONFIGURE.equals(mMostRecentAction)) {
mExecutor.schedule(mConnChecker);
} else if (INTENT_ACTION_NETWORK_CHANGED.equals(mMostRecentAction)) {
@@ -128,10 +149,17 @@
mExecutor.schedule(mBluetoothChecker);
}
+ stopForeground(Service.STOP_FOREGROUND_DETACH);
+
/* If anything goes wrong, make sure we receive intent again. */
return Service.START_STICKY;
}
+ @Override
+ public void onDestroy() {
+ unregisterReceiver(mBroadcastReceiver);
+ }
+
/** Dump the virtual device state
*/
@Override
@@ -145,8 +173,6 @@
pw.println("Current system service state:");
pw.println(" Location service ready: "
+ mLocationServices.getLocationServicesReady().isDone());
- pw.println(" Package verifier ready: "
- + mPackageVerifier.getPackageVerifierReady().isDone());
pw.println(" Network connected: " + mConnChecker.getConnected().isDone());
pw.println(" WiFi configured: " + mWifiManager.getWifiReady().isDone());
pw.println(" Bluetooth enabled: " + mBluetoothChecker.getEnabled().isDone());
diff --git a/guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/PackageVerifierManager.java b/guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/PackageVerifierManager.java
deleted file mode 100644
index e10845a..0000000
--- a/guest/monitoring/cuttlefish_service/java/com/android/google/gce/gceservice/PackageVerifierManager.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Copyright (C) 2017 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 com.android.google.gce.gceservice;
-
-import android.content.ContentResolver;
-import android.content.Context;
-import android.provider.Settings;
-import android.provider.Settings.SettingNotFoundException;
-import android.util.Log;
-
-/**
- * Disable package verifier.
- */
-public class PackageVerifierManager extends JobBase {
- private static final String LOG_TAG = "GcePackageVerifierManager";
- private static final String SETTING_PACKAGE_VERIFIER_ENABLE = "verifier_verify_adb_installs";
- private final Context mContext;
- private final GceFuture<Boolean> mResult =
- new GceFuture<Boolean>("Package Verifier");
-
-
- PackageVerifierManager(Context context) {
- super(LOG_TAG);
- mContext = context;
- }
-
-
- private boolean getAndLogPackageVerifierState() {
- int package_verifier_state = 1;
- try {
- ContentResolver contentResolver = mContext.getContentResolver();
- package_verifier_state = Settings.Secure.getInt(contentResolver, SETTING_PACKAGE_VERIFIER_ENABLE);
- } catch (SettingNotFoundException e) {
- Log.w(LOG_TAG, "Could not read package verifier state. Assuming it's enabled.");
- }
-
- return package_verifier_state != 0;
- }
-
-
- public int execute() {
- if (getAndLogPackageVerifierState()) {
- Settings.Secure.putInt(mContext.getContentResolver(), SETTING_PACKAGE_VERIFIER_ENABLE, 0);
- // One more call, just to log the state.
- getAndLogPackageVerifierState();
- }
-
- mResult.set(true);
- return 0;
- }
-
-
- public void onDependencyFailed(Exception e) {
- Log.e(LOG_TAG, "Could not disable Package Verifier.", e);
- mResult.set(e);
- }
-
-
- public GceFuture<Boolean> getPackageVerifierReady() {
- return mResult;
- }
-}
diff --git a/shared/BoardConfig.mk b/shared/BoardConfig.mk
index eccf70c..fc71c01 100644
--- a/shared/BoardConfig.mk
+++ b/shared/BoardConfig.mk
@@ -21,9 +21,6 @@
include build/make/target/board/BoardConfigMainlineCommon.mk
# Reset CF unsupported settings
-TARGET_NO_RECOVERY := false
-BOARD_USES_SYSTEM_OTHER_ODEX :=
-WITH_DEXPREOPT := true
BOARD_AVB_ENABLE := false
diff --git a/shared/config/init.vendor.rc b/shared/config/init.vendor.rc
index 2e5d3af..7c9be5d 100644
--- a/shared/config/init.vendor.rc
+++ b/shared/config/init.vendor.rc
@@ -9,6 +9,10 @@
mount tracefs tracefs /sys/kernel/tracing
+ # For KCOV
+ mount debugfs debugfs /sys/kernel/debug
+ chmod 0755 /sys/kernel/debug
+
setprop ro.sf.lcd_density ${ro.boot.lcd_density}
setprop ro.hardware.egl ${ro.boot.hardware.egl}
setprop ro.hardware.gralloc ${ro.boot.hardware.gralloc}
diff --git a/shared/device.mk b/shared/device.mk
index c23337c..3250c27 100644
--- a/shared/device.mk
+++ b/shared/device.mk
@@ -77,9 +77,15 @@
PRODUCT_PROPERTY_OVERRIDES += \
wlan.driver.status=ok
+# Enforce privapp-permissions whitelist.
+PRODUCT_PROPERTY_OVERRIDES += ro.control_privapp_permissions=enforce
+
# aes-256-heh default is not supported in standard kernels.
PRODUCT_PROPERTY_OVERRIDES += ro.crypto.volume.filenames_mode=aes-256-cts
+# Copy preopted files from system_b on first boot
+PRODUCT_PROPERTY_OVERRIDES += ro.cp_system_other_odex=1
+
PRODUCT_SOONG_NAMESPACES += hardware/google/camera
PRODUCT_SOONG_NAMESPACES += hardware/google/camera/devices/EmulatedCamera
@@ -174,6 +180,7 @@
device/google/cuttlefish/shared/config/media_codecs_google_video.xml:$(TARGET_COPY_OUT_VENDOR)/etc/media_codecs_google_video.xml \
device/google/cuttlefish/shared/config/media_codecs_performance.xml:$(TARGET_COPY_OUT_VENDOR)/etc/media_codecs_performance.xml \
device/google/cuttlefish/shared/config/media_profiles.xml:$(TARGET_COPY_OUT_VENDOR)/etc/media_profiles_V1_0.xml \
+ device/google/cuttlefish/shared/permissions/privapp-permissions-cuttlefish.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/privapp-permissions-cuttlefish.xml \
frameworks/av/media/libeffects/data/audio_effects.xml:$(TARGET_COPY_OUT_VENDOR)/etc/audio_effects.xml \
frameworks/av/media/libstagefright/data/media_codecs_google_audio.xml:$(TARGET_COPY_OUT_VENDOR)/etc/media_codecs_google_audio.xml \
frameworks/av/media/libstagefright/data/media_codecs_google_telephony.xml:$(TARGET_COPY_OUT_VENDOR)/etc/media_codecs_google_telephony.xml \
diff --git a/shared/permissions/privapp-permissions-cuttlefish.xml b/shared/permissions/privapp-permissions-cuttlefish.xml
new file mode 100644
index 0000000..7c3dcaa
--- /dev/null
+++ b/shared/permissions/privapp-permissions-cuttlefish.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2020 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.
+-->
+<permissions>
+ <privapp-permissions package="com.android.google.gce.gceservice">
+ <permission name="android.permission.ACCESS_NETWORK_STATE" />
+ <permission name="android.permission.ACCESS_WIFI_STATE" />
+ <permission name="android.permission.CHANGE_WIFI_STATE" />
+ <permission name="android.permission.FOREGROUND_SERVICE" />
+ <permission name="android.permission.INTERNET" />
+ <permission name="android.permission.RECEIVE_BOOT_COMPLETED" />
+ <permission name="android.permission.WRITE_EXTERNAL_STORAGE" />
+ <permission name="android.permission.WRITE_SETTINGS" />
+ <permission name="android.permission.BLUETOOTH" />
+ </privapp-permissions>
+</permissions>
diff --git a/shared/sepolicy/vendor/hal_camera_default.te b/shared/sepolicy/vendor/hal_camera_default.te
index 79bed26..67c0ddc 100644
--- a/shared/sepolicy/vendor/hal_camera_default.te
+++ b/shared/sepolicy/vendor/hal_camera_default.te
@@ -5,3 +5,7 @@
hal_client_domain(hal_camera_default, hal_graphics_allocator)
get_prop(hal_camera_default, hal_camera_prop)
+
+# For camera hal to talk with sensor service
+binder_call(hal_camera_default, sensor_service_server)
+binder_call(sensor_service_server, hal_camera_default)
diff --git a/shared/sepolicy/vendor/seapp_contexts b/shared/sepolicy/vendor/seapp_contexts
index e325c99..820c416 100644
--- a/shared/sepolicy/vendor/seapp_contexts
+++ b/shared/sepolicy/vendor/seapp_contexts
@@ -1,2 +1,2 @@
# GceService app
-user=system seinfo=platform name=com.android.google.gce.gceservice domain=gceservice type=app_data_file
+user=_app isPrivApp=true seinfo=default name=com.android.google.gce.gceservice domain=gceservice type=app_data_file