Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6cd9d4d1 authored by Andrei Onea's avatar Andrei Onea Committed by Andrei-Valentin Onea
Browse files

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
parent 1faafcb4
Loading
Loading
Loading
Loading
+9 −0
Original line number Original line Diff line number Diff line
@@ -12,6 +12,7 @@ java_library_static {
    },
    },
    srcs: [
    srcs: [
        "java/**/*.java",
        "java/**/*.java",
        ":platformcompat_aidl",
        ":dumpstate_aidl",
        ":dumpstate_aidl",
        ":installd_aidl",
        ":installd_aidl",
        ":storaged_aidl",
        ":storaged_aidl",
@@ -78,3 +79,11 @@ prebuilt_etc {
    name: "gps_debug.conf",
    name: "gps_debug.conf",
    src: "java/com/android/server/location/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",
}
 No newline at end of file
+57 −0
Original line number Original line Diff line number Diff line
/*
 * 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);
}
 No newline at end of file
+23 −29
Original line number Original line Diff line number Diff line
@@ -16,52 +16,46 @@


package com.android.server.compat;
package com.android.server.compat;


import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.ApplicationInfo;
import android.util.Slog;
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.
 * 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";
    private static final String TAG = "Compatibility";


    /**
    private final Context mContext;
     * Reports that a compatibility change is affecting an app process now.

     *
    public PlatformCompat(Context context) {
     * <p>Note: for changes that are gated using {@link #isChangeEnabled(long, ApplicationInfo)},
        mContext = context;
     * 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}.

     *
    @Override
     * @param changeId The ID of the compatibility change taking effect.
    public void reportChange(long changeId, ApplicationInfo appInfo) {
     * @param appInfo Representing the affected app.
     */
    public static void reportChange(long changeId, ApplicationInfo appInfo) {
        Slog.d(TAG, "Compat change reported: " + changeId + "; UID " + appInfo.uid);
        Slog.d(TAG, "Compat change reported: " + changeId + "; UID " + appInfo.uid);
        // TODO log via StatsLog
        // TODO log via StatsLog
    }
    }


    /**
    @Override
     * Query if a given compatibility change is enabled for an app process. This method should
    public boolean isChangeEnabled(long changeId, ApplicationInfo appInfo) {
     * 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) {
        if (CompatConfig.get().isChangeEnabled(changeId, appInfo)) {
        if (CompatConfig.get().isChangeEnabled(changeId, appInfo)) {
            reportChange(changeId, appInfo);
            reportChange(changeId, appInfo);
            return true;
            return true;
        }
        }
        return false;
        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.
    }
}
}
+6 −0
Original line number Original line Diff line number Diff line
@@ -79,6 +79,7 @@ import com.android.server.audio.AudioService;
import com.android.server.broadcastradio.BroadcastRadioService;
import com.android.server.broadcastradio.BroadcastRadioService;
import com.android.server.camera.CameraServiceProxy;
import com.android.server.camera.CameraServiceProxy;
import com.android.server.clipboard.ClipboardService;
import com.android.server.clipboard.ClipboardService;
import com.android.server.compat.PlatformCompat;
import com.android.server.connectivity.IpConnectivityMetrics;
import com.android.server.connectivity.IpConnectivityMetrics;
import com.android.server.coverage.CoverageService;
import com.android.server.coverage.CoverageService;
import com.android.server.devicepolicy.DevicePolicyManagerService;
import com.android.server.devicepolicy.DevicePolicyManagerService;
@@ -975,6 +976,11 @@ public final class SystemServer {
            traceBeginAndSlog("PinnerService");
            traceBeginAndSlog("PinnerService");
            mSystemServiceManager.startService(PinnerService.class);
            mSystemServiceManager.startService(PinnerService.class);
            traceEnd();
            traceEnd();

            traceBeginAndSlog("PlatformCompat");
            ServiceManager.addService("platform_compat", new PlatformCompat(context));
            traceEnd();

        } catch (RuntimeException e) {
        } catch (RuntimeException e) {
            Slog.e("System", "******************************************");
            Slog.e("System", "******************************************");
            Slog.e("System", "************ Failure starting core service", e);
            Slog.e("System", "************ Failure starting core service", e);