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:
committed by
Andrei-Valentin Onea
parent
1faafcb488
commit
6cd9d4d18e
@@ -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",
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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.
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user