Make PlatformCompat a Binder class

This allows PlatformCompat to be called from anywhere in the platform.
In follow-up CLs, we'll define permissions for each method and/or
filtering rules to prevent abuse from apps.

Test: m
Bug: 137769727
Change-Id: I19e5fbfefcf59e0b53b197ea8e9e3cb78439b4c4
Merged-In: I19e5fbfefcf59e0b53b197ea8e9e3cb78439b4c4
This commit is contained in:
Andrei Onea
2019-07-17 19:03:10 +01:00
committed by Andrei-Valentin Onea
parent 1faafcb488
commit 6cd9d4d18e
4 changed files with 95 additions and 29 deletions

View File

@@ -12,6 +12,7 @@ java_library_static {
},
srcs: [
"java/**/*.java",
":platformcompat_aidl",
":dumpstate_aidl",
":installd_aidl",
":storaged_aidl",
@@ -78,3 +79,11 @@ prebuilt_etc {
name: "gps_debug.conf",
src: "java/com/android/server/location/gps_debug.conf",
}
filegroup {
name: "platformcompat_aidl",
srcs: [
"java/com/android/server/compat/IPlatformCompat.aidl",
],
path: "java",
}

View File

@@ -0,0 +1,57 @@
/*
* Copyright (C) 2019 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.server.compat;
import android.content.pm.ApplicationInfo;
/**
* System private API for talking with the PlatformCompat service.
* {@hide}
*/
interface IPlatformCompat
{
/**
* Reports that a compatibility change is affecting an app process now.
*
* <p>Note: for changes that are gated using {@link #isChangeEnabled(long, ApplicationInfo)},
* you do not need to call this API directly. The change will be reported for you in the case
* that {@link #isChangeEnabled(long, ApplicationInfo)} returns {@code true}.
*
* @param changeId The ID of the compatibility change taking effect.
* @param appInfo Representing the affected app.
*/
void reportChange(long changeId, in ApplicationInfo appInfo);
/**
* Query if a given compatibility change is enabled for an app process. This method should
* be called when implementing functionality on behalf of the affected app.
*
* <p>If this method returns {@code true}, the calling code should implement the compatibility
* change, resulting in differing behaviour compared to earlier releases. If this method returns
* {@code false}, the calling code should behave as it did in earlier releases.
*
* <p>When this method returns {@code true}, it will also report the change as
* {@link #reportChange(long, ApplicationInfo)} would, so there is no need to call that method
* directly.
*
* @param changeId The ID of the compatibility change in question.
* @param appInfo Representing the app in question.
* @return {@code true} if the change is enabled for the current app.
*/
boolean isChangeEnabled(long changeId, in ApplicationInfo appInfo);
}

View File

@@ -16,52 +16,46 @@
package com.android.server.compat;
import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.util.Slog;
import com.android.internal.util.DumpUtils;
import java.io.FileDescriptor;
import java.io.PrintWriter;
/**
* System server internal API for gating and reporting compatibility changes.
*/
public class PlatformCompat {
public class PlatformCompat extends IPlatformCompat.Stub {
private static final String TAG = "Compatibility";
/**
* Reports that a compatibility change is affecting an app process now.
*
* <p>Note: for changes that are gated using {@link #isChangeEnabled(long, ApplicationInfo)},
* you do not need to call this API directly. The change will be reported for you in the case
* that {@link #isChangeEnabled(long, ApplicationInfo)} returns {@code true}.
*
* @param changeId The ID of the compatibility change taking effect.
* @param appInfo Representing the affected app.
*/
public static void reportChange(long changeId, ApplicationInfo appInfo) {
private final Context mContext;
public PlatformCompat(Context context) {
mContext = context;
}
@Override
public void reportChange(long changeId, ApplicationInfo appInfo) {
Slog.d(TAG, "Compat change reported: " + changeId + "; UID " + appInfo.uid);
// TODO log via StatsLog
}
/**
* Query if a given compatibility change is enabled for an app process. This method should
* be called when implementing functionality on behalf of the affected app.
*
* <p>If this method returns {@code true}, the calling code should implement the compatibility
* change, resulting in differing behaviour compared to earlier releases. If this method returns
* {@code false}, the calling code should behave as it did in earlier releases.
*
* <p>When this method returns {@code true}, it will also report the change as
* {@link #reportChange(long, ApplicationInfo)} would, so there is no need to call that method
* directly.
*
* @param changeId The ID of the compatibility change in question.
* @param appInfo Representing the app in question.
* @return {@code true} if the change is enabled for the current app.
*/
public static boolean isChangeEnabled(long changeId, ApplicationInfo appInfo) {
@Override
public boolean isChangeEnabled(long changeId, ApplicationInfo appInfo) {
if (CompatConfig.get().isChangeEnabled(changeId, appInfo)) {
reportChange(changeId, appInfo);
return true;
}
return false;
}
@Override
protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
if (!DumpUtils.checkDumpAndUsageStatsPermission(mContext, "platform_compat", pw)) return;
// TODO: Dump info about compatibility changes.
}
}

View File

@@ -79,6 +79,7 @@ import com.android.server.audio.AudioService;
import com.android.server.broadcastradio.BroadcastRadioService;
import com.android.server.camera.CameraServiceProxy;
import com.android.server.clipboard.ClipboardService;
import com.android.server.compat.PlatformCompat;
import com.android.server.connectivity.IpConnectivityMetrics;
import com.android.server.coverage.CoverageService;
import com.android.server.devicepolicy.DevicePolicyManagerService;
@@ -975,6 +976,11 @@ public final class SystemServer {
traceBeginAndSlog("PinnerService");
mSystemServiceManager.startService(PinnerService.class);
traceEnd();
traceBeginAndSlog("PlatformCompat");
ServiceManager.addService("platform_compat", new PlatformCompat(context));
traceEnd();
} catch (RuntimeException e) {
Slog.e("System", "******************************************");
Slog.e("System", "************ Failure starting core service", e);