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

Commit 6762e2b6 authored by Po-Chien Hsueh's avatar Po-Chien Hsueh
Browse files

Add a permission, INSTALL_DYNAMIC_SYSTEM

We already have a permission, MANAGE_DYNAMIC_SYSTEM, whose protection
level is signature. Only platform applications holding it can interact
directly with DynamicSystemService, a wrapper of native GsiService. In
our design, DynamicSystemInstallationService is the sole platform app
holding it.

Then we need another permission for non-platform but privileged apps.
This new permission doesn't give apps access to DynamicSystemService,
but only to system API DynamicSystemClient. DynamicSystemClient works
with underneath DynamicSystemInstallationService and allows privileged
apps to install DynamicSystem images and get status updates in our
designed manner.


Bug: 128982216
Test: verified using DynamicSystemClient.
Change-Id: I3e67322511e3ab08db87bfad40d8c3d3cf6fdfe5
parent 75d97353
Loading
Loading
Loading
Loading
+5 −4
Original line number Diff line number Diff line
@@ -75,6 +75,7 @@ package android {
    field public static final String HDMI_CEC = "android.permission.HDMI_CEC";
    field public static final String HIDE_NON_SYSTEM_OVERLAY_WINDOWS = "android.permission.HIDE_NON_SYSTEM_OVERLAY_WINDOWS";
    field public static final String INJECT_EVENTS = "android.permission.INJECT_EVENTS";
    field public static final String INSTALL_DYNAMIC_SYSTEM = "android.permission.INSTALL_DYNAMIC_SYSTEM";
    field public static final String INSTALL_GRANT_RUNTIME_PERMISSIONS = "android.permission.INSTALL_GRANT_RUNTIME_PERMISSIONS";
    field public static final String INSTALL_PACKAGE_UPDATES = "android.permission.INSTALL_PACKAGE_UPDATES";
    field public static final String INSTALL_SELF_UPDATES = "android.permission.INSTALL_SELF_UPDATES";
@@ -5639,12 +5640,12 @@ package android.os.image {
  public class DynamicSystemClient {
    ctor public DynamicSystemClient(@NonNull android.content.Context);
    method @RequiresPermission("android.permission.MANAGE_DYNAMIC_SYSTEM") public void bind();
    method @RequiresPermission(android.Manifest.permission.INSTALL_DYNAMIC_SYSTEM) public void bind();
    method public void setOnStatusChangedListener(@NonNull java.util.concurrent.Executor, @NonNull android.os.image.DynamicSystemClient.OnStatusChangedListener);
    method public void setOnStatusChangedListener(@NonNull android.os.image.DynamicSystemClient.OnStatusChangedListener);
    method @RequiresPermission("android.permission.MANAGE_DYNAMIC_SYSTEM") public void start(@NonNull android.net.Uri, long);
    method @RequiresPermission("android.permission.MANAGE_DYNAMIC_SYSTEM") public void start(@NonNull android.net.Uri, long, long);
    method @RequiresPermission("android.permission.MANAGE_DYNAMIC_SYSTEM") public void unbind();
    method @RequiresPermission(android.Manifest.permission.INSTALL_DYNAMIC_SYSTEM) public void start(@NonNull android.net.Uri, long);
    method @RequiresPermission(android.Manifest.permission.INSTALL_DYNAMIC_SYSTEM) public void start(@NonNull android.net.Uri, long, long);
    method @RequiresPermission(android.Manifest.permission.INSTALL_DYNAMIC_SYSTEM) public void unbind();
    field public static final int CAUSE_ERROR_EXCEPTION = 6; // 0x6
    field public static final int CAUSE_ERROR_INVALID_URL = 4; // 0x4
    field public static final int CAUSE_ERROR_IO = 3; // 0x3
+4 −4
Original line number Diff line number Diff line
@@ -313,7 +313,7 @@ public class DynamicSystemClient {
     * allows it to send status updates to {@link #OnStatusChangedListener}. It is recommanded
     * to bind before calling {@link #start} and get status updates.
     */
    @RequiresPermission(android.Manifest.permission.MANAGE_DYNAMIC_SYSTEM)
    @RequiresPermission(android.Manifest.permission.INSTALL_DYNAMIC_SYSTEM)
    public void bind() {
        Intent intent = new Intent();
        intent.setClassName("com.android.dynsystem",
@@ -328,7 +328,7 @@ public class DynamicSystemClient {
     * Unbind from {@code DynamicSystem} installation service. Unbinding from the installation
     * service stops it from sending following status updates.
     */
    @RequiresPermission(android.Manifest.permission.MANAGE_DYNAMIC_SYSTEM)
    @RequiresPermission(android.Manifest.permission.INSTALL_DYNAMIC_SYSTEM)
    public void unbind() {
        if (!mBound) {
            return;
@@ -361,7 +361,7 @@ public class DynamicSystemClient {
     * @param systemUrl A network URL or a file URL to system image.
     * @param systemSize size of system image.
     */
    @RequiresPermission(android.Manifest.permission.MANAGE_DYNAMIC_SYSTEM)
    @RequiresPermission(android.Manifest.permission.INSTALL_DYNAMIC_SYSTEM)
    public void start(@NonNull Uri systemUrl, @BytesLong long systemSize) {
        start(systemUrl, systemSize, DEFAULT_USERDATA_SIZE);
    }
@@ -378,7 +378,7 @@ public class DynamicSystemClient {
     * @param systemSize size of system image.
     * @param userdataSize bytes reserved for userdata.
     */
    @RequiresPermission(android.Manifest.permission.MANAGE_DYNAMIC_SYSTEM)
    @RequiresPermission(android.Manifest.permission.INSTALL_DYNAMIC_SYSTEM)
    public void start(@NonNull Uri systemUrl, @BytesLong long systemSize,
            @BytesLong long userdataSize) {
        Intent intent = new Intent();
+5 −0
Original line number Diff line number Diff line
@@ -1853,6 +1853,11 @@
    <permission android:name="android.permission.MANAGE_DYNAMIC_SYSTEM"
        android:protectionLevel="signature" />

    <!-- @SystemApi Allows an application to install a DynamicSystem image and get status updates.
         @hide -->
    <permission android:name="android.permission.INSTALL_DYNAMIC_SYSTEM"
        android:protectionLevel="signature|privileged" />

    <!-- @SystemApi Allows access to Broadcast Radio
         @hide This is not a third-party API (intended for system apps).-->
    <permission android:name="android.permission.ACCESS_BROADCAST_RADIO"
+2 −2
Original line number Diff line number Diff line
@@ -16,7 +16,7 @@
            android:name=".DynamicSystemInstallationService"
            android:enabled="true"
            android:exported="true"
            android:permission="android.permission.MANAGE_DYNAMIC_SYSTEM"
            android:permission="android.permission.INSTALL_DYNAMIC_SYSTEM"
            android:process=":dynsystem">
            <intent-filter>
                <action android:name="android.os.image.action.NOTIFY_IF_IN_USE" />
@@ -26,7 +26,7 @@

        <activity android:name=".VerificationActivity"
            android:exported="true"
            android:permission="android.permission.MANAGE_DYNAMIC_SYSTEM"
            android:permission="android.permission.INSTALL_DYNAMIC_SYSTEM"
            android:theme="@android:style/Theme.Material.Light.Dialog.NoActionBar"
            android:process=":dynsystem">
            <intent-filter>