API review followup: DynamicAndroidClient
Some API changes per API reivew: - Move DynamicAndroidClient and ~Manager to android.os.image. - Rename them to DynamicSystemClient and ~Manager. - Rename permission MANAGE_DYNAMIC_ANDROID to MANAGE_DYNAMIC_SYSTEM - Corresponding changes in the installation service. - Corresponding changes in privapp-permissions-platform.xml. - Add missing annotations. - Change setOnStatusChangedListener's parameters order. - Improve documentations. - Re-generate api/system-current.txt. Bug: 126613281 Test: adb shell am Change-Id: Ia920e9ccf6de1dbbd38c52910cb72cb81b9b5b32
This commit is contained in:
@@ -248,7 +248,6 @@ java_defaults {
|
||||
"core/java/android/os/ICancellationSignal.aidl",
|
||||
"core/java/android/os/IDeviceIdentifiersPolicyService.aidl",
|
||||
"core/java/android/os/IDeviceIdleController.aidl",
|
||||
"core/java/android/os/IDynamicAndroidService.aidl",
|
||||
"core/java/android/os/IHardwarePropertiesManager.aidl",
|
||||
":libincident_aidl",
|
||||
"core/java/android/os/IMaintenanceActivityListener.aidl",
|
||||
@@ -272,6 +271,7 @@ java_defaults {
|
||||
"core/java/android/os/IUserManager.aidl",
|
||||
":libvibrator_aidl",
|
||||
"core/java/android/os/IVibratorService.aidl",
|
||||
"core/java/android/os/image/IDynamicSystemService.aidl",
|
||||
"core/java/android/os/storage/IStorageManager.aidl",
|
||||
"core/java/android/os/storage/IStorageEventListener.aidl",
|
||||
"core/java/android/os/storage/IStorageShutdownObserver.aidl",
|
||||
|
||||
@@ -1349,7 +1349,6 @@ package android.content {
|
||||
field public static final String BACKUP_SERVICE = "backup";
|
||||
field public static final String CONTENT_SUGGESTIONS_SERVICE = "content_suggestions";
|
||||
field public static final String CONTEXTHUB_SERVICE = "contexthub";
|
||||
field public static final String DYNAMIC_ANDROID_SERVICE = "dynamic_android";
|
||||
field public static final String EUICC_CARD_SERVICE = "euicc_card";
|
||||
field public static final String HDMI_CONTROL_SERVICE = "hdmi_control";
|
||||
field public static final String NETD_SERVICE = "netd";
|
||||
@@ -1376,32 +1375,6 @@ package android.content {
|
||||
method public void sendOrderedBroadcast(android.content.Intent, String, android.os.Bundle, android.content.BroadcastReceiver, android.os.Handler, int, String, android.os.Bundle);
|
||||
}
|
||||
|
||||
public class DynamicAndroidClient {
|
||||
ctor public DynamicAndroidClient(@NonNull android.content.Context);
|
||||
method public void bind();
|
||||
method public void setOnStatusChangedListener(@NonNull android.content.DynamicAndroidClient.OnStatusChangedListener, @NonNull java.util.concurrent.Executor);
|
||||
method public void setOnStatusChangedListener(@NonNull android.content.DynamicAndroidClient.OnStatusChangedListener);
|
||||
method public void start(String, long);
|
||||
method public void start(String, long, long);
|
||||
method 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
|
||||
field public static final int CAUSE_ERROR_IPC = 5; // 0x5
|
||||
field public static final int CAUSE_INSTALL_CANCELLED = 2; // 0x2
|
||||
field public static final int CAUSE_INSTALL_COMPLETED = 1; // 0x1
|
||||
field public static final int CAUSE_NOT_SPECIFIED = 0; // 0x0
|
||||
field public static final int STATUS_IN_PROGRESS = 2; // 0x2
|
||||
field public static final int STATUS_IN_USE = 4; // 0x4
|
||||
field public static final int STATUS_NOT_STARTED = 1; // 0x1
|
||||
field public static final int STATUS_READY = 3; // 0x3
|
||||
field public static final int STATUS_UNKNOWN = 0; // 0x0
|
||||
}
|
||||
|
||||
public static interface DynamicAndroidClient.OnStatusChangedListener {
|
||||
method public void onStatusChanged(int, int, long);
|
||||
}
|
||||
|
||||
public class Intent implements java.lang.Cloneable android.os.Parcelable {
|
||||
field public static final String ACTION_BATTERY_LEVEL_CHANGED = "android.intent.action.BATTERY_LEVEL_CHANGED";
|
||||
field public static final String ACTION_CALL_EMERGENCY = "android.intent.action.CALL_EMERGENCY";
|
||||
@@ -5662,6 +5635,36 @@ package android.os {
|
||||
|
||||
}
|
||||
|
||||
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 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 String, long);
|
||||
method @RequiresPermission("android.permission.MANAGE_DYNAMIC_SYSTEM") public void start(@NonNull String, long, long);
|
||||
method @RequiresPermission("android.permission.MANAGE_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
|
||||
field public static final int CAUSE_ERROR_IPC = 5; // 0x5
|
||||
field public static final int CAUSE_INSTALL_CANCELLED = 2; // 0x2
|
||||
field public static final int CAUSE_INSTALL_COMPLETED = 1; // 0x1
|
||||
field public static final int CAUSE_NOT_SPECIFIED = 0; // 0x0
|
||||
field public static final int STATUS_IN_PROGRESS = 2; // 0x2
|
||||
field public static final int STATUS_IN_USE = 4; // 0x4
|
||||
field public static final int STATUS_NOT_STARTED = 1; // 0x1
|
||||
field public static final int STATUS_READY = 3; // 0x3
|
||||
field public static final int STATUS_UNKNOWN = 0; // 0x0
|
||||
}
|
||||
|
||||
public static interface DynamicSystemClient.OnStatusChangedListener {
|
||||
method public void onStatusChanged(int, int, long);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
package android.os.storage {
|
||||
|
||||
public class StorageManager {
|
||||
|
||||
@@ -4759,7 +4759,6 @@ HPLandroid/os/IDeviceIdleController$Stub$Proxy;->addPowerSaveTempWhitelistAppFor
|
||||
HPLandroid/os/IDeviceIdleController$Stub$Proxy;->addPowerSaveTempWhitelistAppForSms(Ljava/lang/String;ILjava/lang/String;)J
|
||||
HPLandroid/os/IDeviceIdleController$Stub;->getDefaultTransactionName(I)Ljava/lang/String;
|
||||
HPLandroid/os/IDeviceIdleController$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
|
||||
HPLandroid/os/IDynamicAndroidService$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
|
||||
HPLandroid/os/IHardwarePropertiesManager$Stub;->getDefaultTransactionName(I)Ljava/lang/String;
|
||||
HPLandroid/os/IHardwarePropertiesManager$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
|
||||
HPLandroid/os/IInstalld$Stub$Proxy;->clearAppData(Ljava/lang/String;Ljava/lang/String;IIJ)V
|
||||
@@ -5081,6 +5080,7 @@ HPLandroid/os/health/HealthStatsWriter;->writeLongsMap(Landroid/os/Parcel;Landro
|
||||
HPLandroid/os/health/HealthStatsWriter;->writeParcelableMap(Landroid/os/Parcel;Landroid/util/ArrayMap;)V
|
||||
HPLandroid/os/health/TimerStat;-><init>(IJ)V
|
||||
HPLandroid/os/health/TimerStat;->writeToParcel(Landroid/os/Parcel;I)V
|
||||
HPLandroid/os/image/IDynamicSystemService$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
|
||||
HPLandroid/os/storage/IStorageEventListener$Stub$Proxy;->onStorageStateChanged(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
|
||||
HPLandroid/os/storage/IStorageManager$Stub$Proxy;->allocateBytes(Ljava/lang/String;JILjava/lang/String;)V
|
||||
HPLandroid/os/storage/IStorageManager$Stub$Proxy;->changeEncryptionPassword(ILjava/lang/String;)I
|
||||
@@ -24027,7 +24027,6 @@ HSPLandroid/os/IDeviceIdleController$Stub$Proxy;->isPowerSaveWhitelistApp(Ljava/
|
||||
HSPLandroid/os/IDeviceIdleController$Stub;-><init>()V
|
||||
HSPLandroid/os/IDeviceIdleController$Stub;->asInterface(Landroid/os/IBinder;)Landroid/os/IDeviceIdleController;
|
||||
HSPLandroid/os/IDumpstate$Stub;-><init>()V
|
||||
HSPLandroid/os/IDynamicAndroidService$Stub;-><init>()V
|
||||
HSPLandroid/os/IExternalVibratorService$Stub;-><init>()V
|
||||
HSPLandroid/os/IHardwarePropertiesManager$Stub;-><init>()V
|
||||
HSPLandroid/os/IIncidentCompanion$Stub;-><init>()V
|
||||
@@ -24837,6 +24836,7 @@ HSPLandroid/os/ZygoteProcess;->waitForConnectionToZygote(Ljava/lang/String;)V
|
||||
HSPLandroid/os/ZygoteProcess;->zygoteSendArgsAndGetResult(Landroid/os/ZygoteProcess$ZygoteState;ZLjava/util/ArrayList;)Landroid/os/Process$ProcessStartResult;
|
||||
HSPLandroid/os/health/HealthStatsParceler$1;-><init>()V
|
||||
HSPLandroid/os/health/TimerStat$1;-><init>()V
|
||||
HSPLandroid/os/image/IDynamicSystemService$Stub;-><init>()V
|
||||
HSPLandroid/os/storage/IStorageEventListener$Stub$Proxy;->asBinder()Landroid/os/IBinder;
|
||||
HSPLandroid/os/storage/IStorageEventListener$Stub;->asBinder()Landroid/os/IBinder;
|
||||
HSPLandroid/os/storage/IStorageManager$Stub$Proxy;->getVolumeList(ILjava/lang/String;I)[Landroid/os/storage/StorageVolume;
|
||||
@@ -47386,7 +47386,6 @@ Landroid/os/DeviceIdleManager;
|
||||
Landroid/os/DropBoxManager$Entry$1;
|
||||
Landroid/os/DropBoxManager$Entry;
|
||||
Landroid/os/DropBoxManager;
|
||||
Landroid/os/DynamicAndroidManager;
|
||||
Landroid/os/Environment$UserEnvironment;
|
||||
Landroid/os/Environment;
|
||||
Landroid/os/EventLogTags;
|
||||
@@ -47428,8 +47427,6 @@ Landroid/os/IDeviceIdleController$Stub;
|
||||
Landroid/os/IDeviceIdleController;
|
||||
Landroid/os/IDumpstate$Stub;
|
||||
Landroid/os/IDumpstate;
|
||||
Landroid/os/IDynamicAndroidService$Stub;
|
||||
Landroid/os/IDynamicAndroidService;
|
||||
Landroid/os/IExternalVibratorService$Stub;
|
||||
Landroid/os/IExternalVibratorService;
|
||||
Landroid/os/IHardwarePropertiesManager$Stub;
|
||||
@@ -47689,6 +47686,10 @@ Landroid/os/health/HealthStatsWriter;
|
||||
Landroid/os/health/SystemHealthManager;
|
||||
Landroid/os/health/TimerStat$1;
|
||||
Landroid/os/health/TimerStat;
|
||||
Landroid/os/image/DynamicSystemClient;
|
||||
Landroid/os/image/DynamicSystemManager;
|
||||
Landroid/os/image/IDynamicSystemService$Stub;
|
||||
Landroid/os/image/IDynamicSystemService;
|
||||
Landroid/os/storage/DiskInfo;
|
||||
Landroid/os/storage/IObbActionListener$Stub;
|
||||
Landroid/os/storage/IObbActionListener;
|
||||
|
||||
@@ -2724,7 +2724,6 @@ android.os.DeviceIdleManager
|
||||
android.os.DropBoxManager$Entry$1
|
||||
android.os.DropBoxManager$Entry
|
||||
android.os.DropBoxManager
|
||||
android.os.DynamicAndroidManager
|
||||
android.os.Environment$UserEnvironment
|
||||
android.os.Environment
|
||||
android.os.EventLogTags
|
||||
@@ -2909,6 +2908,8 @@ android.os.health.HealthStatsParceler
|
||||
android.os.health.SystemHealthManager
|
||||
android.os.health.TimerStat$1
|
||||
android.os.health.TimerStat
|
||||
android.os.image.DynamicSystemClient
|
||||
android.os.image.DynamicSystemManager
|
||||
android.os.storage.IObbActionListener$Stub
|
||||
android.os.storage.IObbActionListener
|
||||
android.os.storage.IStorageManager$Stub$Proxy
|
||||
|
||||
@@ -131,13 +131,11 @@ import android.os.BugreportManager;
|
||||
import android.os.Build;
|
||||
import android.os.DeviceIdleManager;
|
||||
import android.os.DropBoxManager;
|
||||
import android.os.DynamicAndroidManager;
|
||||
import android.os.HardwarePropertiesManager;
|
||||
import android.os.IBatteryPropertiesRegistrar;
|
||||
import android.os.IBinder;
|
||||
import android.os.IDeviceIdleController;
|
||||
import android.os.IDumpstate;
|
||||
import android.os.IDynamicAndroidService;
|
||||
import android.os.IHardwarePropertiesManager;
|
||||
import android.os.IPowerManager;
|
||||
import android.os.IRecoverySystem;
|
||||
@@ -155,6 +153,8 @@ import android.os.UserHandle;
|
||||
import android.os.UserManager;
|
||||
import android.os.Vibrator;
|
||||
import android.os.health.SystemHealthManager;
|
||||
import android.os.image.DynamicSystemManager;
|
||||
import android.os.image.IDynamicSystemService;
|
||||
import android.os.storage.StorageManager;
|
||||
import android.permission.PermissionControllerManager;
|
||||
import android.permission.PermissionManager;
|
||||
@@ -1275,15 +1275,15 @@ final class SystemServiceRegistry {
|
||||
IRollbackManager.Stub.asInterface(b));
|
||||
}});
|
||||
|
||||
registerService(Context.DYNAMIC_ANDROID_SERVICE, DynamicAndroidManager.class,
|
||||
new CachedServiceFetcher<DynamicAndroidManager>() {
|
||||
registerService(Context.DYNAMIC_SYSTEM_SERVICE, DynamicSystemManager.class,
|
||||
new CachedServiceFetcher<DynamicSystemManager>() {
|
||||
@Override
|
||||
public DynamicAndroidManager createService(ContextImpl ctx)
|
||||
public DynamicSystemManager createService(ContextImpl ctx)
|
||||
throws ServiceNotFoundException {
|
||||
IBinder b = ServiceManager.getServiceOrThrow(
|
||||
Context.DYNAMIC_ANDROID_SERVICE);
|
||||
return new DynamicAndroidManager(
|
||||
IDynamicAndroidService.Stub.asInterface(b));
|
||||
Context.DYNAMIC_SYSTEM_SERVICE);
|
||||
return new DynamicSystemManager(
|
||||
IDynamicSystemService.Stub.asInterface(b));
|
||||
}});
|
||||
//CHECKSTYLE:ON IndentationCheck
|
||||
}
|
||||
|
||||
@@ -4644,11 +4644,10 @@ public abstract class Context {
|
||||
|
||||
/**
|
||||
* Use with {@link #getSystemService(String)} to retrieve an
|
||||
* {@link android.os.DynamicAndroidManager}.
|
||||
* {@link android.os.image.DynamicSystemManager}.
|
||||
* @hide
|
||||
*/
|
||||
@SystemApi
|
||||
public static final String DYNAMIC_ANDROID_SERVICE = "dynamic_android";
|
||||
public static final String DYNAMIC_SYSTEM_SERVICE = "dynamic_system";
|
||||
|
||||
/**
|
||||
* Determine whether the given permission is allowed for a particular
|
||||
|
||||
@@ -13,12 +13,18 @@
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package android.content;
|
||||
package android.os.image;
|
||||
|
||||
import android.annotation.BytesLong;
|
||||
import android.annotation.CallbackExecutor;
|
||||
import android.annotation.IntDef;
|
||||
import android.annotation.NonNull;
|
||||
import android.annotation.RequiresPermission;
|
||||
import android.annotation.SystemApi;
|
||||
import android.content.ComponentName;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.ServiceConnection;
|
||||
import android.os.Bundle;
|
||||
import android.os.Handler;
|
||||
import android.os.IBinder;
|
||||
@@ -34,12 +40,28 @@ import java.lang.ref.WeakReference;
|
||||
import java.util.concurrent.Executor;
|
||||
|
||||
/**
|
||||
* This class contains methods and constants used to start DynamicAndroid
|
||||
* installation, and a listener for progress update.
|
||||
* <p>This class contains methods and constants used to start a {@code DynamicSystem} installation,
|
||||
* and a listener for status updates.</p>
|
||||
*
|
||||
* <p>{@code DynamicSystem} allows user to run certified system images in a non destructive manner
|
||||
* without needing to prior OEM unlock. While running in {@code DynamicSystem}, persitent storage
|
||||
* for factory reset protection (FRP) remains unchanged. The new system is installed in a
|
||||
* temporarily allocated partition. After the installation is completed, the device will be running
|
||||
* in the new system on next reboot. Then, when the user reboots the device again, it will leave
|
||||
* {@code DynamicSystem} and go back into the original system. Since the userdata for
|
||||
* {@code DynamicSystem} is also newly created during the installation, running in
|
||||
* {@code DynamicSystem} doesn't change user's app data.</p>
|
||||
*
|
||||
* <p>With {@link #setOnStatusChangedListener}, API users can register an
|
||||
* {@link #OnStatusChangedListener} and get status updates and cause when the installation is
|
||||
* started, stopped, or cancelled. It also sends progress updates during the installation. With
|
||||
* {@link #start}, API users can start an installation with the {@link Uri} to a gzipped system
|
||||
* image. The {@link Uri} can be a web URL or a content Uri to a local path.</p>
|
||||
*
|
||||
* @hide
|
||||
*/
|
||||
@SystemApi
|
||||
public class DynamicAndroidClient {
|
||||
public class DynamicSystemClient {
|
||||
/** @hide */
|
||||
@IntDef(prefix = { "STATUS_" }, value = {
|
||||
STATUS_UNKNOWN,
|
||||
@@ -64,23 +86,23 @@ public class DynamicAndroidClient {
|
||||
@Retention(RetentionPolicy.SOURCE)
|
||||
public @interface StatusChangedCause {}
|
||||
|
||||
private static final String TAG = "DynAndroidClient";
|
||||
private static final String TAG = "DynSystemClient";
|
||||
|
||||
private static final long DEFAULT_USERDATA_SIZE = (10L << 30);
|
||||
|
||||
|
||||
/** Listener for installation status update. */
|
||||
/** Listener for installation status updates. */
|
||||
public interface OnStatusChangedListener {
|
||||
/**
|
||||
* This callback is called when installation status is changed, and when the
|
||||
* client is {@link #bind} to DynamicAndroid installation service.
|
||||
* client is {@link #bind} to {@code DynamicSystem} installation service.
|
||||
*
|
||||
* @param status status code, also defined in {@code DynamicAndroidClient}.
|
||||
* @param cause cause code, also defined in {@code DynamicAndroidClient}.
|
||||
* @param status status code, also defined in {@code DynamicSystemClient}.
|
||||
* @param cause cause code, also defined in {@code DynamicSystemClient}.
|
||||
* @param progress number of bytes installed.
|
||||
*/
|
||||
void onStatusChanged(@InstallationStatus int status, @StatusChangedCause int cause,
|
||||
long progress);
|
||||
@BytesLong long progress);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -98,7 +120,7 @@ public class DynamicAndroidClient {
|
||||
/** Installation is finished but the user has not launched it. */
|
||||
public static final int STATUS_READY = 3;
|
||||
|
||||
/** Device is running in Dynamic Android. */
|
||||
/** Device is running in {@code DynamicSystem}. */
|
||||
public static final int STATUS_IN_USE = 4;
|
||||
|
||||
/*
|
||||
@@ -113,7 +135,7 @@ public class DynamicAndroidClient {
|
||||
/** Status changed because installation is cancelled. */
|
||||
public static final int CAUSE_INSTALL_CANCELLED = 2;
|
||||
|
||||
/** Installation failed due to IOException. */
|
||||
/** Installation failed due to {@code IOException}. */
|
||||
public static final int CAUSE_ERROR_IO = 3;
|
||||
|
||||
/** Installation failed because the image URL source is not supported. */
|
||||
@@ -141,7 +163,7 @@ public class DynamicAndroidClient {
|
||||
public static final int MSG_UNREGISTER_LISTENER = 2;
|
||||
|
||||
/**
|
||||
* Message for status update.
|
||||
* Message for status updates.
|
||||
* @hide
|
||||
*/
|
||||
public static final int MSG_POST_STATUS = 3;
|
||||
@@ -150,7 +172,7 @@ public class DynamicAndroidClient {
|
||||
* Messages keys
|
||||
*/
|
||||
/**
|
||||
* Message key, for progress update.
|
||||
* Message key, for progress updates.
|
||||
* @hide
|
||||
*/
|
||||
public static final String KEY_INSTALLED_SIZE = "KEY_INSTALLED_SIZE";
|
||||
@@ -163,14 +185,14 @@ public class DynamicAndroidClient {
|
||||
* @hide
|
||||
*/
|
||||
public static final String ACTION_START_INSTALL =
|
||||
"android.content.action.START_INSTALL";
|
||||
"android.os.image.action.START_INSTALL";
|
||||
|
||||
/**
|
||||
* Intent action: notify user if we are currently running in Dynamic Android.
|
||||
* Intent action: notify user if we are currently running in {@code DynamicSystem}.
|
||||
* @hide
|
||||
*/
|
||||
public static final String ACTION_NOTIFY_IF_IN_USE =
|
||||
"android.content.action.NOTIFY_IF_IN_USE";
|
||||
"android.os.image.action.NOTIFY_IF_IN_USE";
|
||||
|
||||
/*
|
||||
* Intent Keys
|
||||
@@ -195,16 +217,16 @@ public class DynamicAndroidClient {
|
||||
|
||||
|
||||
private static class IncomingHandler extends Handler {
|
||||
private final WeakReference<DynamicAndroidClient> mWeakClient;
|
||||
private final WeakReference<DynamicSystemClient> mWeakClient;
|
||||
|
||||
IncomingHandler(DynamicAndroidClient service) {
|
||||
IncomingHandler(DynamicSystemClient service) {
|
||||
super(Looper.getMainLooper());
|
||||
mWeakClient = new WeakReference<>(service);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void handleMessage(Message msg) {
|
||||
DynamicAndroidClient service = mWeakClient.get();
|
||||
DynamicSystemClient service = mWeakClient.get();
|
||||
|
||||
if (service != null) {
|
||||
service.handleMessage(msg);
|
||||
@@ -212,9 +234,9 @@ public class DynamicAndroidClient {
|
||||
}
|
||||
}
|
||||
|
||||
private class DynAndroidServiceConnection implements ServiceConnection {
|
||||
private class DynSystemServiceConnection implements ServiceConnection {
|
||||
public void onServiceConnected(ComponentName className, IBinder service) {
|
||||
Slog.v(TAG, "DynAndroidService connected");
|
||||
Slog.v(TAG, "DynSystemService connected");
|
||||
|
||||
mService = new Messenger(service);
|
||||
|
||||
@@ -232,13 +254,13 @@ public class DynamicAndroidClient {
|
||||
}
|
||||
|
||||
public void onServiceDisconnected(ComponentName className) {
|
||||
Slog.v(TAG, "DynAndroidService disconnected");
|
||||
Slog.v(TAG, "DynSystemService disconnected");
|
||||
mService = null;
|
||||
}
|
||||
}
|
||||
|
||||
private final Context mContext;
|
||||
private final DynAndroidServiceConnection mConnection;
|
||||
private final DynSystemServiceConnection mConnection;
|
||||
private final Messenger mMessenger;
|
||||
|
||||
private boolean mBound;
|
||||
@@ -247,12 +269,16 @@ public class DynamicAndroidClient {
|
||||
private Messenger mService;
|
||||
|
||||
/**
|
||||
* Create a new {@code DynamicSystem} client.
|
||||
*
|
||||
* @param context a {@link Context} will be used to bind the installation service.
|
||||
*
|
||||
* @hide
|
||||
*/
|
||||
@SystemApi
|
||||
public DynamicAndroidClient(@NonNull Context context) {
|
||||
public DynamicSystemClient(@NonNull Context context) {
|
||||
mContext = context;
|
||||
mConnection = new DynAndroidServiceConnection();
|
||||
mConnection = new DynSystemServiceConnection();
|
||||
mMessenger = new Messenger(new IncomingHandler(this));
|
||||
}
|
||||
|
||||
@@ -261,8 +287,8 @@ public class DynamicAndroidClient {
|
||||
* the executor.
|
||||
*/
|
||||
public void setOnStatusChangedListener(
|
||||
@NonNull OnStatusChangedListener listener,
|
||||
@NonNull @CallbackExecutor Executor executor) {
|
||||
@NonNull @CallbackExecutor Executor executor,
|
||||
@NonNull OnStatusChangedListener listener) {
|
||||
mListener = listener;
|
||||
mExecutor = executor;
|
||||
}
|
||||
@@ -278,12 +304,15 @@ public class DynamicAndroidClient {
|
||||
}
|
||||
|
||||
/**
|
||||
* Bind to DynamicAndroidInstallationService.
|
||||
* Bind to {@code DynamicSystem} installation service. Binding to the installation service
|
||||
* 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)
|
||||
public void bind() {
|
||||
Intent intent = new Intent();
|
||||
intent.setClassName("com.android.dynandroid",
|
||||
"com.android.dynandroid.DynamicAndroidInstallationService");
|
||||
intent.setClassName("com.android.dynsystem",
|
||||
"com.android.dynsystem.DynamicSystemInstallationService");
|
||||
|
||||
mContext.bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
|
||||
|
||||
@@ -291,8 +320,10 @@ public class DynamicAndroidClient {
|
||||
}
|
||||
|
||||
/**
|
||||
* Unbind from DynamicAndroidInstallationService.
|
||||
* 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)
|
||||
public void unbind() {
|
||||
if (!mBound) {
|
||||
return;
|
||||
@@ -315,27 +346,40 @@ public class DynamicAndroidClient {
|
||||
}
|
||||
|
||||
/**
|
||||
* Start installing DynamicAndroid from URL with default userdata size.
|
||||
* Start installing {@code DynamicSystem} from URL with default userdata size.
|
||||
*
|
||||
* Calling this function will first start an Activity to confirm device credential, using
|
||||
* {@link KeyguardManager}. If it's confirmed, the installation service will be started.
|
||||
*
|
||||
* This function doesn't require prior calling {@link #bind}.
|
||||
*
|
||||
* @param systemUrl A network URL or a file URL to system image.
|
||||
* @param systemSize size of system image.
|
||||
*/
|
||||
public void start(String systemUrl, long systemSize) {
|
||||
@RequiresPermission(android.Manifest.permission.MANAGE_DYNAMIC_SYSTEM)
|
||||
public void start(@NonNull String systemUrl, @BytesLong long systemSize) {
|
||||
start(systemUrl, systemSize, DEFAULT_USERDATA_SIZE);
|
||||
}
|
||||
|
||||
/**
|
||||
* Start installing DynamicAndroid from URL.
|
||||
* Start installing {@code DynamicSystem} from URL.
|
||||
*
|
||||
* Calling this function will first start an Activity to confirm device credential, using
|
||||
* {@link KeyguardManager}. If it's confirmed, the installation service will be started.
|
||||
*
|
||||
* This function doesn't require prior calling {@link #bind}.
|
||||
*
|
||||
* @param systemUrl A network URL or a file URL to system image.
|
||||
* @param systemSize size of system image.
|
||||
* @param userdataSize bytes reserved for userdata.
|
||||
*/
|
||||
public void start(String systemUrl, long systemSize, long userdataSize) {
|
||||
@RequiresPermission(android.Manifest.permission.MANAGE_DYNAMIC_SYSTEM)
|
||||
public void start(@NonNull String systemUrl, @BytesLong long systemSize,
|
||||
@BytesLong long userdataSize) {
|
||||
Intent intent = new Intent();
|
||||
|
||||
intent.setClassName("com.android.dynandroid",
|
||||
"com.android.dynandroid.VerificationActivity");
|
||||
intent.setClassName("com.android.dynsystem",
|
||||
"com.android.dynsystem.VerificationActivity");
|
||||
|
||||
intent.setAction(ACTION_START_INSTALL);
|
||||
|
||||
@@ -14,50 +14,51 @@
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package android.os;
|
||||
package android.os.image;
|
||||
|
||||
import android.annotation.RequiresPermission;
|
||||
import android.annotation.SystemService;
|
||||
import android.content.Context;
|
||||
import android.gsi.GsiProgress;
|
||||
import android.os.RemoteException;
|
||||
|
||||
/**
|
||||
* The DynamicAndroidManager offers a mechanism to use a new Android image temporarily. After the
|
||||
* The DynamicSystemManager offers a mechanism to use a new system image temporarily. After the
|
||||
* installation, the device can reboot into this image with a new created /data. This image will
|
||||
* last until the next reboot and then the device will go back to the original image. However the
|
||||
* installed image and the new created /data are not deleted but disabled. Thus the application can
|
||||
* either re-enable the installed image by calling {@link #toggle} or use the {@link #remove} to
|
||||
* delete it completely. In other words, there are three device states: no installation, installed
|
||||
* and running. The procedure to install a DynamicAndroid starts with a {@link #startInstallation},
|
||||
* and running. The procedure to install a DynamicSystem starts with a {@link #startInstallation},
|
||||
* followed by a series of {@link #write} and ends with a {@link commit}. Once the installation is
|
||||
* complete, the device state changes from no installation to the installed state and a followed
|
||||
* reboot will change its state to running. Note one instance of dynamic android can exist on a
|
||||
* given device thus the {@link #startInstallation} will fail if the device is currently running a
|
||||
* DynamicAndroid.
|
||||
* reboot will change its state to running. Note one instance of DynamicSystem can exist on a given
|
||||
* device thus the {@link #startInstallation} will fail if the device is currently running a
|
||||
* DynamicSystem.
|
||||
*
|
||||
* @hide
|
||||
*/
|
||||
@SystemService(Context.DYNAMIC_ANDROID_SERVICE)
|
||||
public class DynamicAndroidManager {
|
||||
private static final String TAG = "DynamicAndroidManager";
|
||||
@SystemService(Context.DYNAMIC_SYSTEM_SERVICE)
|
||||
public class DynamicSystemManager {
|
||||
private static final String TAG = "DynamicSystemManager";
|
||||
|
||||
private final IDynamicAndroidService mService;
|
||||
private final IDynamicSystemService mService;
|
||||
|
||||
/** {@hide} */
|
||||
public DynamicAndroidManager(IDynamicAndroidService service) {
|
||||
public DynamicSystemManager(IDynamicSystemService service) {
|
||||
mService = service;
|
||||
}
|
||||
|
||||
/** The DynamicAndroidManager.Session represents a started session for the installation. */
|
||||
/** The DynamicSystemManager.Session represents a started session for the installation. */
|
||||
public class Session {
|
||||
private Session() {}
|
||||
/**
|
||||
* Write a chunk of the DynamicAndroid system image
|
||||
* Write a chunk of the DynamicSystem system image
|
||||
*
|
||||
* @return {@code true} if the call succeeds. {@code false} if there is any native runtime
|
||||
* error.
|
||||
*/
|
||||
@RequiresPermission(android.Manifest.permission.MANAGE_DYNAMIC_ANDROID)
|
||||
@RequiresPermission(android.Manifest.permission.MANAGE_DYNAMIC_SYSTEM)
|
||||
public boolean write(byte[] buf) {
|
||||
try {
|
||||
return mService.write(buf);
|
||||
@@ -72,7 +73,7 @@ public class DynamicAndroidManager {
|
||||
* @return {@code true} if the call succeeds. {@code false} if there is any native runtime
|
||||
* error.
|
||||
*/
|
||||
@RequiresPermission(android.Manifest.permission.MANAGE_DYNAMIC_ANDROID)
|
||||
@RequiresPermission(android.Manifest.permission.MANAGE_DYNAMIC_SYSTEM)
|
||||
public boolean commit() {
|
||||
try {
|
||||
return mService.commit();
|
||||
@@ -82,16 +83,16 @@ public class DynamicAndroidManager {
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Start DynamicAndroid installation. This call may take an unbounded amount of time. The caller
|
||||
* Start DynamicSystem installation. This call may take an unbounded amount of time. The caller
|
||||
* may use another thread to call the getStartProgress() to get the progress.
|
||||
*
|
||||
* @param systemSize system size in bytes
|
||||
* @param userdataSize userdata size in bytes
|
||||
* @return {@code true} if the call succeeds. {@code false} either the device does not contain
|
||||
* enough space or a DynamicAndroid is currently in use where the {@link #isInUse} would be
|
||||
* enough space or a DynamicSystem is currently in use where the {@link #isInUse} would be
|
||||
* true.
|
||||
*/
|
||||
@RequiresPermission(android.Manifest.permission.MANAGE_DYNAMIC_ANDROID)
|
||||
@RequiresPermission(android.Manifest.permission.MANAGE_DYNAMIC_SYSTEM)
|
||||
public Session startInstallation(long systemSize, long userdataSize) {
|
||||
try {
|
||||
if (mService.startInstallation(systemSize, userdataSize)) {
|
||||
@@ -112,7 +113,7 @@ public class DynamicAndroidManager {
|
||||
* status field can be IGsiService.STATUS_NO_OPERATION, IGsiService.STATUS_WORKING or
|
||||
* IGsiService.STATUS_COMPLETE.
|
||||
*/
|
||||
@RequiresPermission(android.Manifest.permission.MANAGE_DYNAMIC_ANDROID)
|
||||
@RequiresPermission(android.Manifest.permission.MANAGE_DYNAMIC_SYSTEM)
|
||||
public GsiProgress getInstallationProgress() {
|
||||
try {
|
||||
return mService.getInstallationProgress();
|
||||
@@ -129,7 +130,7 @@ public class DynamicAndroidManager {
|
||||
* @return {@code true} if the call succeeds. {@code false} if there is no installation
|
||||
* currently.
|
||||
*/
|
||||
@RequiresPermission(android.Manifest.permission.MANAGE_DYNAMIC_ANDROID)
|
||||
@RequiresPermission(android.Manifest.permission.MANAGE_DYNAMIC_SYSTEM)
|
||||
public boolean abort() {
|
||||
try {
|
||||
return mService.abort();
|
||||
@@ -138,8 +139,8 @@ public class DynamicAndroidManager {
|
||||
}
|
||||
}
|
||||
|
||||
/** @return {@code true} if the device is running a dynamic android */
|
||||
@RequiresPermission(android.Manifest.permission.MANAGE_DYNAMIC_ANDROID)
|
||||
/** @return {@code true} if the device is running a dynamic system */
|
||||
@RequiresPermission(android.Manifest.permission.MANAGE_DYNAMIC_SYSTEM)
|
||||
public boolean isInUse() {
|
||||
try {
|
||||
return mService.isInUse();
|
||||
@@ -148,8 +149,8 @@ public class DynamicAndroidManager {
|
||||
}
|
||||
}
|
||||
|
||||
/** @return {@code true} if the device has a dynamic android installed */
|
||||
@RequiresPermission(android.Manifest.permission.MANAGE_DYNAMIC_ANDROID)
|
||||
/** @return {@code true} if the device has a dynamic system installed */
|
||||
@RequiresPermission(android.Manifest.permission.MANAGE_DYNAMIC_SYSTEM)
|
||||
public boolean isInstalled() {
|
||||
try {
|
||||
return mService.isInstalled();
|
||||
@@ -159,11 +160,11 @@ public class DynamicAndroidManager {
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove DynamicAndroid installation if present
|
||||
* Remove DynamicSystem installation if present
|
||||
*
|
||||
* @return {@code true} if the call succeeds. {@code false} if there is no installed image.
|
||||
*/
|
||||
@RequiresPermission(android.Manifest.permission.MANAGE_DYNAMIC_ANDROID)
|
||||
@RequiresPermission(android.Manifest.permission.MANAGE_DYNAMIC_SYSTEM)
|
||||
public boolean remove() {
|
||||
try {
|
||||
return mService.remove();
|
||||
@@ -173,11 +174,11 @@ public class DynamicAndroidManager {
|
||||
}
|
||||
|
||||
/**
|
||||
* Enable DynamicAndroid when it's not enabled, otherwise, disable it.
|
||||
* Enable DynamicSystem when it's not enabled, otherwise, disable it.
|
||||
*
|
||||
* @return {@code true} if the call succeeds. {@code false} if there is no installed image.
|
||||
*/
|
||||
@RequiresPermission(android.Manifest.permission.MANAGE_DYNAMIC_ANDROID)
|
||||
@RequiresPermission(android.Manifest.permission.MANAGE_DYNAMIC_SYSTEM)
|
||||
public boolean toggle() {
|
||||
try {
|
||||
return mService.toggle();
|
||||
@@ -13,15 +13,15 @@
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package android.os;
|
||||
package android.os.image;
|
||||
|
||||
import android.gsi.GsiProgress;
|
||||
|
||||
/** {@hide} */
|
||||
interface IDynamicAndroidService
|
||||
interface IDynamicSystemService
|
||||
{
|
||||
/**
|
||||
* Start DynamicAndroid installation. This call may take 60~90 seconds. The caller
|
||||
* Start DynamicSystem installation. This call may take 60~90 seconds. The caller
|
||||
* may use another thread to call the getStartProgress() to get the progress.
|
||||
*
|
||||
* @param systemSize system size in bytes
|
||||
@@ -53,26 +53,26 @@ interface IDynamicAndroidService
|
||||
boolean isInUse();
|
||||
|
||||
/**
|
||||
* @return true if the device has an DynamicAndroid image installed
|
||||
* @return true if the device has an DynamicSystem image installed
|
||||
*/
|
||||
boolean isInstalled();
|
||||
|
||||
/**
|
||||
* Remove DynamicAndroid installation if present
|
||||
* Remove DynamicSystem installation if present
|
||||
*
|
||||
* @return true if the call succeeds
|
||||
*/
|
||||
boolean remove();
|
||||
|
||||
/**
|
||||
* Enable DynamicAndroid when it's not enabled, otherwise, disable it.
|
||||
* Enable DynamicSystem when it's not enabled, otherwise, disable it.
|
||||
*
|
||||
* @return true if the call succeeds
|
||||
*/
|
||||
boolean toggle();
|
||||
|
||||
/**
|
||||
* Write a chunk of the DynamicAndroid system image
|
||||
* Write a chunk of the DynamicSystem system image
|
||||
*
|
||||
* @return true if the call succeeds
|
||||
*/
|
||||
@@ -52,7 +52,7 @@ public class FeatureFlagUtils {
|
||||
DEFAULT_FLAGS.put("settings_slice_injection", "true");
|
||||
DEFAULT_FLAGS.put("settings_systemui_theme", "true");
|
||||
DEFAULT_FLAGS.put("settings_mainline_module", "true");
|
||||
DEFAULT_FLAGS.put("settings_dynamic_android", "false");
|
||||
DEFAULT_FLAGS.put("settings_dynamic_system", "false");
|
||||
DEFAULT_FLAGS.put(SEAMLESS_TRANSFER, "false");
|
||||
DEFAULT_FLAGS.put(HEARING_AID_SETTINGS, "false");
|
||||
DEFAULT_FLAGS.put(SAFETY_HUB, "false");
|
||||
|
||||
@@ -1849,8 +1849,8 @@
|
||||
<permission android:name="android.permission.HARDWARE_TEST"
|
||||
android:protectionLevel="signature" />
|
||||
|
||||
<!-- @hide Allows an application to manage DynamicAndroid image -->
|
||||
<permission android:name="android.permission.MANAGE_DYNAMIC_ANDROID"
|
||||
<!-- @hide Allows an application to manage DynamicSystem image -->
|
||||
<permission android:name="android.permission.MANAGE_DYNAMIC_SYSTEM"
|
||||
android:protectionLevel="signature" />
|
||||
|
||||
<!-- @SystemApi Allows access to Broadcast Radio
|
||||
|
||||
@@ -329,9 +329,9 @@ applications that come with the platform
|
||||
<permission name="android.permission.CONTROL_VPN"/>
|
||||
</privapp-permissions>
|
||||
|
||||
<privapp-permissions package="com.android.dynandroid">
|
||||
<privapp-permissions package="com.android.dynsystem">
|
||||
<permission name="android.permission.REBOOT"/>
|
||||
<permission name="android.permission.MANAGE_DYNAMIC_ANDROID"/>
|
||||
<permission name="android.permission.MANAGE_DYNAMIC_SYSTEM"/>
|
||||
</privapp-permissions>
|
||||
|
||||
</permissions>
|
||||
|
||||
@@ -8,7 +8,7 @@ LOCAL_RESOURCE_DIR := $(addprefix $(LOCAL_PATH)/, res)
|
||||
|
||||
LOCAL_USE_AAPT2 := true
|
||||
|
||||
LOCAL_PACKAGE_NAME := DynamicAndroidInstallationService
|
||||
LOCAL_PACKAGE_NAME := DynamicSystemInstallationService
|
||||
LOCAL_CERTIFICATE := platform
|
||||
LOCAL_PRIVILEGED_MODULE := true
|
||||
LOCAL_PRIVATE_PLATFORM_APIS := true
|
||||
@@ -1,10 +1,10 @@
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
package="com.android.dynandroid"
|
||||
package="com.android.dynsystem"
|
||||
android:sharedUserId="android.uid.system">
|
||||
|
||||
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
|
||||
<uses-permission android:name="android.permission.INTERNET" />
|
||||
<uses-permission android:name="android.permission.MANAGE_DYNAMIC_ANDROID" />
|
||||
<uses-permission android:name="android.permission.MANAGE_DYNAMIC_SYSTEM" />
|
||||
<uses-permission android:name="android.permission.REBOOT" />
|
||||
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
|
||||
|
||||
@@ -13,24 +13,24 @@
|
||||
android:label="@string/app_name">
|
||||
|
||||
<service
|
||||
android:name=".DynamicAndroidInstallationService"
|
||||
android:name=".DynamicSystemInstallationService"
|
||||
android:enabled="true"
|
||||
android:exported="true"
|
||||
android:permission="android.permission.MANAGE_DYNAMIC_ANDROID"
|
||||
android:process=":dynandroid">
|
||||
android:permission="android.permission.MANAGE_DYNAMIC_SYSTEM"
|
||||
android:process=":dynsystem">
|
||||
<intent-filter>
|
||||
<action android:name="android.content.action.NOTIFY_IF_IN_USE" />
|
||||
<action android:name="android.os.image.action.NOTIFY_IF_IN_USE" />
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
</intent-filter>
|
||||
</service>
|
||||
|
||||
<activity android:name=".VerificationActivity"
|
||||
android:exported="true"
|
||||
android:permission="android.permission.MANAGE_DYNAMIC_ANDROID"
|
||||
android:permission="android.permission.MANAGE_DYNAMIC_SYSTEM"
|
||||
android:theme="@android:style/Theme.Material.Light.Dialog.NoActionBar"
|
||||
android:process=":dynandroid">
|
||||
android:process=":dynsystem">
|
||||
<intent-filter>
|
||||
<action android:name="android.content.action.START_INSTALL" />
|
||||
<action android:name="android.os.image.action.START_INSTALL" />
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
</intent-filter>
|
||||
</activity>
|
||||
@@ -12,14 +12,14 @@
|
||||
<!-- password page description [CHAR LIMIT=128] -->
|
||||
<string name="keyguard_description">Please enter your password and continue to AndroidOnTap installation</string>
|
||||
|
||||
<!-- Displayed on notification: DynAndroid installation is completed [CHAR LIMIT=128] -->
|
||||
<!-- Displayed on notification: AndroidOnTap installation is completed [CHAR LIMIT=128] -->
|
||||
<string name="notification_install_completed">New system is ready, you can reboot into it or discard it.</string>
|
||||
<!-- Displayed on notification: DynAndroid installation is in progress [CHAR LIMIT=128] -->
|
||||
<!-- Displayed on notification: AndroidOnTap installation is in progress [CHAR LIMIT=128] -->
|
||||
<string name="notification_install_inprogress">Installation is in progress.</string>
|
||||
<!-- Displayed on notification: DynAndroid installation is in progress [CHAR LIMIT=128] -->
|
||||
<!-- Displayed on notification: AndroidOnTap installation is in progress [CHAR LIMIT=128] -->
|
||||
<string name="notification_install_failed">Installation Failed.</string>
|
||||
<!-- Displayed on notification: We are running in AndroidOnTap [CHAR LIMIT=128] -->
|
||||
<string name="notification_dynandroid_in_use">We are running in AndroidOnTap.</string>
|
||||
<string name="notification_dynsystem_in_use">We are running in AndroidOnTap.</string>
|
||||
|
||||
<!-- Action on notification: Cancel installation [CHAR LIMIT=16] -->
|
||||
<string name="notification_action_cancel">Cancel</string>
|
||||
@@ -28,11 +28,11 @@
|
||||
<!-- Action on notification: Uninstall AndroidOnTap [CHAR LIMIT=16] -->
|
||||
<string name="notification_action_uninstall">Uninstall</string>
|
||||
<!-- Action on notification: Reboot to AndroidOnTap [CHAR LIMIT=16] -->
|
||||
<string name="notification_action_reboot_to_dynandroid">Reboot</string>
|
||||
<string name="notification_action_reboot_to_dynsystem">Reboot</string>
|
||||
|
||||
<!-- Toast when installed DynamicAndroid is discarded [CHAR LIMIT=64] -->
|
||||
<string name="toast_dynandroid_discarded">Installed AndroidOnTap is discarded.</string>
|
||||
<!-- Toast when we fail to launch into DynamicAndroid [CHAR LIMIT=64] -->
|
||||
<string name="toast_failed_to_reboot_to_dynandroid">Failed to reboot into AndroidOnTap.</string>
|
||||
<!-- Toast when installed AndroidOnTap is discarded [CHAR LIMIT=64] -->
|
||||
<string name="toast_dynsystem_discarded">Installed AndroidOnTap is discarded.</string>
|
||||
<!-- Toast when we fail to launch into AndroidOnTap [CHAR LIMIT=64] -->
|
||||
<string name="toast_failed_to_reboot_to_dynsystem">Failed to reboot into AndroidOnTap.</string>
|
||||
|
||||
</resources>
|
||||
@@ -14,20 +14,20 @@
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.android.dynandroid;
|
||||
package com.android.dynsystem;
|
||||
|
||||
import android.content.BroadcastReceiver;
|
||||
import android.content.Context;
|
||||
import android.content.DynamicAndroidClient;
|
||||
import android.content.Intent;
|
||||
import android.os.UserHandle;
|
||||
import android.os.image.DynamicSystemClient;
|
||||
import android.util.Log;
|
||||
|
||||
|
||||
/**
|
||||
* A BoardcastReceiver waiting for ACTION_BOOT_COMPLETED and ask
|
||||
* the service to display a notification if we are currently running
|
||||
* in DynamicAndroid.
|
||||
* in DynamicSystem.
|
||||
*/
|
||||
public class BootCompletedReceiver extends BroadcastReceiver {
|
||||
|
||||
@@ -41,9 +41,9 @@ public class BootCompletedReceiver extends BroadcastReceiver {
|
||||
|
||||
if (Intent.ACTION_BOOT_COMPLETED.equals(action)) {
|
||||
Intent startServiceIntent = new Intent(
|
||||
context, DynamicAndroidInstallationService.class);
|
||||
context, DynamicSystemInstallationService.class);
|
||||
|
||||
startServiceIntent.setAction(DynamicAndroidClient.ACTION_NOTIFY_IF_IN_USE);
|
||||
startServiceIntent.setAction(DynamicSystemClient.ACTION_NOTIFY_IF_IN_USE);
|
||||
context.startServiceAsUser(startServiceIntent, UserHandle.SYSTEM);
|
||||
}
|
||||
}
|
||||
@@ -14,28 +14,28 @@
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.android.dynandroid;
|
||||
package com.android.dynsystem;
|
||||
|
||||
import static android.content.DynamicAndroidClient.ACTION_NOTIFY_IF_IN_USE;
|
||||
import static android.content.DynamicAndroidClient.ACTION_START_INSTALL;
|
||||
import static android.content.DynamicAndroidClient.CAUSE_ERROR_EXCEPTION;
|
||||
import static android.content.DynamicAndroidClient.CAUSE_ERROR_INVALID_URL;
|
||||
import static android.content.DynamicAndroidClient.CAUSE_ERROR_IO;
|
||||
import static android.content.DynamicAndroidClient.CAUSE_INSTALL_CANCELLED;
|
||||
import static android.content.DynamicAndroidClient.CAUSE_INSTALL_COMPLETED;
|
||||
import static android.content.DynamicAndroidClient.CAUSE_NOT_SPECIFIED;
|
||||
import static android.content.DynamicAndroidClient.STATUS_IN_PROGRESS;
|
||||
import static android.content.DynamicAndroidClient.STATUS_IN_USE;
|
||||
import static android.content.DynamicAndroidClient.STATUS_NOT_STARTED;
|
||||
import static android.content.DynamicAndroidClient.STATUS_READY;
|
||||
import static android.os.AsyncTask.Status.FINISHED;
|
||||
import static android.os.AsyncTask.Status.PENDING;
|
||||
import static android.os.AsyncTask.Status.RUNNING;
|
||||
import static android.os.image.DynamicSystemClient.ACTION_NOTIFY_IF_IN_USE;
|
||||
import static android.os.image.DynamicSystemClient.ACTION_START_INSTALL;
|
||||
import static android.os.image.DynamicSystemClient.CAUSE_ERROR_EXCEPTION;
|
||||
import static android.os.image.DynamicSystemClient.CAUSE_ERROR_INVALID_URL;
|
||||
import static android.os.image.DynamicSystemClient.CAUSE_ERROR_IO;
|
||||
import static android.os.image.DynamicSystemClient.CAUSE_INSTALL_CANCELLED;
|
||||
import static android.os.image.DynamicSystemClient.CAUSE_INSTALL_COMPLETED;
|
||||
import static android.os.image.DynamicSystemClient.CAUSE_NOT_SPECIFIED;
|
||||
import static android.os.image.DynamicSystemClient.STATUS_IN_PROGRESS;
|
||||
import static android.os.image.DynamicSystemClient.STATUS_IN_USE;
|
||||
import static android.os.image.DynamicSystemClient.STATUS_NOT_STARTED;
|
||||
import static android.os.image.DynamicSystemClient.STATUS_READY;
|
||||
|
||||
import static com.android.dynandroid.InstallationAsyncTask.RESULT_ERROR_EXCEPTION;
|
||||
import static com.android.dynandroid.InstallationAsyncTask.RESULT_ERROR_INVALID_URL;
|
||||
import static com.android.dynandroid.InstallationAsyncTask.RESULT_ERROR_IO;
|
||||
import static com.android.dynandroid.InstallationAsyncTask.RESULT_OK;
|
||||
import static com.android.dynsystem.InstallationAsyncTask.RESULT_ERROR_EXCEPTION;
|
||||
import static com.android.dynsystem.InstallationAsyncTask.RESULT_ERROR_INVALID_URL;
|
||||
import static com.android.dynsystem.InstallationAsyncTask.RESULT_ERROR_IO;
|
||||
import static com.android.dynsystem.InstallationAsyncTask.RESULT_OK;
|
||||
|
||||
import android.app.Notification;
|
||||
import android.app.NotificationChannel;
|
||||
@@ -43,16 +43,16 @@ import android.app.NotificationManager;
|
||||
import android.app.PendingIntent;
|
||||
import android.app.Service;
|
||||
import android.content.Context;
|
||||
import android.content.DynamicAndroidClient;
|
||||
import android.content.Intent;
|
||||
import android.os.Bundle;
|
||||
import android.os.DynamicAndroidManager;
|
||||
import android.os.Handler;
|
||||
import android.os.IBinder;
|
||||
import android.os.Message;
|
||||
import android.os.Messenger;
|
||||
import android.os.PowerManager;
|
||||
import android.os.RemoteException;
|
||||
import android.os.image.DynamicSystemClient;
|
||||
import android.os.image.DynamicSystemManager;
|
||||
import android.util.Log;
|
||||
import android.widget.Toast;
|
||||
|
||||
@@ -60,31 +60,31 @@ import java.lang.ref.WeakReference;
|
||||
import java.util.ArrayList;
|
||||
|
||||
/**
|
||||
* This class is the service in charge of DynamicAndroid installation.
|
||||
* This class is the service in charge of DynamicSystem installation.
|
||||
* It also posts status to notification bar and wait for user's
|
||||
* cancel and confirm commnands.
|
||||
*/
|
||||
public class DynamicAndroidInstallationService extends Service
|
||||
public class DynamicSystemInstallationService extends Service
|
||||
implements InstallationAsyncTask.InstallStatusListener {
|
||||
|
||||
private static final String TAG = "DynAndroidInstallationService";
|
||||
private static final String TAG = "DynSystemInstallationService";
|
||||
|
||||
/*
|
||||
* Intent actions
|
||||
*/
|
||||
private static final String ACTION_CANCEL_INSTALL =
|
||||
"com.android.dynandroid.ACTION_CANCEL_INSTALL";
|
||||
"com.android.dynsystem.ACTION_CANCEL_INSTALL";
|
||||
private static final String ACTION_DISCARD_INSTALL =
|
||||
"com.android.dynandroid.ACTION_DISCARD_INSTALL";
|
||||
private static final String ACTION_REBOOT_TO_DYN_ANDROID =
|
||||
"com.android.dynandroid.ACTION_REBOOT_TO_DYN_ANDROID";
|
||||
"com.android.dynsystem.ACTION_DISCARD_INSTALL";
|
||||
private static final String ACTION_REBOOT_TO_DYN_SYSTEM =
|
||||
"com.android.dynsystem.ACTION_REBOOT_TO_DYN_SYSTEM";
|
||||
private static final String ACTION_REBOOT_TO_NORMAL =
|
||||
"com.android.dynandroid.ACTION_REBOOT_TO_NORMAL";
|
||||
"com.android.dynsystem.ACTION_REBOOT_TO_NORMAL";
|
||||
|
||||
/*
|
||||
* For notification
|
||||
*/
|
||||
private static final String NOTIFICATION_CHANNEL_ID = "com.android.dynandroid";
|
||||
private static final String NOTIFICATION_CHANNEL_ID = "com.android.dynsystem";
|
||||
private static final int NOTIFICATION_ID = 1;
|
||||
|
||||
/*
|
||||
@@ -97,15 +97,15 @@ public class DynamicAndroidInstallationService extends Service
|
||||
final Messenger mMessenger = new Messenger(new IncomingHandler(this));
|
||||
|
||||
static class IncomingHandler extends Handler {
|
||||
private final WeakReference<DynamicAndroidInstallationService> mWeakService;
|
||||
private final WeakReference<DynamicSystemInstallationService> mWeakService;
|
||||
|
||||
IncomingHandler(DynamicAndroidInstallationService service) {
|
||||
IncomingHandler(DynamicSystemInstallationService service) {
|
||||
mWeakService = new WeakReference<>(service);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void handleMessage(Message msg) {
|
||||
DynamicAndroidInstallationService service = mWeakService.get();
|
||||
DynamicSystemInstallationService service = mWeakService.get();
|
||||
|
||||
if (service != null) {
|
||||
service.handleMessage(msg);
|
||||
@@ -113,7 +113,7 @@ public class DynamicAndroidInstallationService extends Service
|
||||
}
|
||||
}
|
||||
|
||||
private DynamicAndroidManager mDynAndroid;
|
||||
private DynamicSystemManager mDynSystem;
|
||||
private NotificationManager mNM;
|
||||
|
||||
private long mSystemSize;
|
||||
@@ -130,7 +130,7 @@ public class DynamicAndroidInstallationService extends Service
|
||||
|
||||
prepareNotification();
|
||||
|
||||
mDynAndroid = (DynamicAndroidManager) getSystemService(Context.DYNAMIC_ANDROID_SERVICE);
|
||||
mDynSystem = (DynamicSystemManager) getSystemService(Context.DYNAMIC_SYSTEM_SERVICE);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -156,8 +156,8 @@ public class DynamicAndroidInstallationService extends Service
|
||||
executeCancelCommand();
|
||||
} else if (ACTION_DISCARD_INSTALL.equals(action)) {
|
||||
executeDiscardCommand();
|
||||
} else if (ACTION_REBOOT_TO_DYN_ANDROID.equals(action)) {
|
||||
executeRebootToDynAndroidCommand();
|
||||
} else if (ACTION_REBOOT_TO_DYN_SYSTEM.equals(action)) {
|
||||
executeRebootToDynSystemCommand();
|
||||
} else if (ACTION_REBOOT_TO_NORMAL.equals(action)) {
|
||||
executeRebootToNormalCommand();
|
||||
} else if (ACTION_NOTIFY_IF_IN_USE.equals(action)) {
|
||||
@@ -215,17 +215,17 @@ public class DynamicAndroidInstallationService extends Service
|
||||
return;
|
||||
}
|
||||
|
||||
if (isInDynamicAndroid()) {
|
||||
Log.e(TAG, "We are already running in DynamicAndroid");
|
||||
if (isInDynamicSystem()) {
|
||||
Log.e(TAG, "We are already running in DynamicSystem");
|
||||
return;
|
||||
}
|
||||
|
||||
String url = intent.getStringExtra(DynamicAndroidClient.KEY_SYSTEM_URL);
|
||||
mSystemSize = intent.getLongExtra(DynamicAndroidClient.KEY_SYSTEM_SIZE, 0);
|
||||
mUserdataSize = intent.getLongExtra(DynamicAndroidClient.KEY_USERDATA_SIZE, 0);
|
||||
String url = intent.getStringExtra(DynamicSystemClient.KEY_SYSTEM_URL);
|
||||
mSystemSize = intent.getLongExtra(DynamicSystemClient.KEY_SYSTEM_SIZE, 0);
|
||||
mUserdataSize = intent.getLongExtra(DynamicSystemClient.KEY_USERDATA_SIZE, 0);
|
||||
|
||||
mInstallTask = new InstallationAsyncTask(
|
||||
url, mSystemSize, mUserdataSize, mDynAndroid, this);
|
||||
url, mSystemSize, mUserdataSize, mDynSystem, this);
|
||||
|
||||
mInstallTask.execute();
|
||||
|
||||
@@ -251,7 +251,7 @@ public class DynamicAndroidInstallationService extends Service
|
||||
}
|
||||
|
||||
private void executeDiscardCommand() {
|
||||
if (isInDynamicAndroid()) {
|
||||
if (isInDynamicSystem()) {
|
||||
Log.e(TAG, "We are now running in AOT, please reboot to normal system first");
|
||||
return;
|
||||
}
|
||||
@@ -262,16 +262,16 @@ public class DynamicAndroidInstallationService extends Service
|
||||
}
|
||||
|
||||
Toast.makeText(this,
|
||||
getString(R.string.toast_dynandroid_discarded),
|
||||
getString(R.string.toast_dynsystem_discarded),
|
||||
Toast.LENGTH_LONG).show();
|
||||
|
||||
resetTaskAndStop();
|
||||
postStatus(STATUS_NOT_STARTED, CAUSE_INSTALL_CANCELLED);
|
||||
|
||||
mDynAndroid.remove();
|
||||
mDynSystem.remove();
|
||||
}
|
||||
|
||||
private void executeRebootToDynAndroidCommand() {
|
||||
private void executeRebootToDynSystemCommand() {
|
||||
if (mInstallTask == null || mInstallTask.getStatus() != FINISHED) {
|
||||
Log.e(TAG, "Trying to reboot to AOT while there is no complete installation");
|
||||
return;
|
||||
@@ -282,10 +282,10 @@ public class DynamicAndroidInstallationService extends Service
|
||||
mNM.cancel(NOTIFICATION_ID);
|
||||
|
||||
Toast.makeText(this,
|
||||
getString(R.string.toast_failed_to_reboot_to_dynandroid),
|
||||
getString(R.string.toast_failed_to_reboot_to_dynsystem),
|
||||
Toast.LENGTH_LONG).show();
|
||||
|
||||
mDynAndroid.remove();
|
||||
mDynSystem.remove();
|
||||
|
||||
return;
|
||||
}
|
||||
@@ -293,12 +293,12 @@ public class DynamicAndroidInstallationService extends Service
|
||||
PowerManager powerManager = (PowerManager) getSystemService(Context.POWER_SERVICE);
|
||||
|
||||
if (powerManager != null) {
|
||||
powerManager.reboot("dynandroid");
|
||||
powerManager.reboot("dynsystem");
|
||||
}
|
||||
}
|
||||
|
||||
private void executeRebootToNormalCommand() {
|
||||
if (!isInDynamicAndroid()) {
|
||||
if (!isInDynamicSystem()) {
|
||||
Log.e(TAG, "It's already running in normal system.");
|
||||
return;
|
||||
}
|
||||
@@ -346,7 +346,7 @@ public class DynamicAndroidInstallationService extends Service
|
||||
}
|
||||
|
||||
private PendingIntent createPendingIntent(String action) {
|
||||
Intent intent = new Intent(this, DynamicAndroidInstallationService.class);
|
||||
Intent intent = new Intent(this, DynamicSystemInstallationService.class);
|
||||
intent.setAction(action);
|
||||
return PendingIntent.getService(this, 0, intent, 0);
|
||||
}
|
||||
@@ -375,8 +375,8 @@ public class DynamicAndroidInstallationService extends Service
|
||||
builder.setContentText(getString(R.string.notification_install_completed));
|
||||
|
||||
builder.addAction(new Notification.Action.Builder(
|
||||
null, getString(R.string.notification_action_reboot_to_dynandroid),
|
||||
createPendingIntent(ACTION_REBOOT_TO_DYN_ANDROID)).build());
|
||||
null, getString(R.string.notification_action_reboot_to_dynsystem),
|
||||
createPendingIntent(ACTION_REBOOT_TO_DYN_SYSTEM)).build());
|
||||
|
||||
builder.addAction(new Notification.Action.Builder(
|
||||
null, getString(R.string.notification_action_discard),
|
||||
@@ -385,7 +385,7 @@ public class DynamicAndroidInstallationService extends Service
|
||||
break;
|
||||
|
||||
case STATUS_IN_USE:
|
||||
builder.setContentText(getString(R.string.notification_dynandroid_in_use));
|
||||
builder.setContentText(getString(R.string.notification_dynsystem_in_use));
|
||||
|
||||
builder.addAction(new Notification.Action.Builder(
|
||||
null, getString(R.string.notification_action_uninstall),
|
||||
@@ -409,7 +409,7 @@ public class DynamicAndroidInstallationService extends Service
|
||||
}
|
||||
|
||||
private boolean verifyRequest(Intent intent) {
|
||||
String url = intent.getStringExtra(DynamicAndroidClient.KEY_SYSTEM_URL);
|
||||
String url = intent.getStringExtra(DynamicSystemClient.KEY_SYSTEM_URL);
|
||||
|
||||
return VerificationActivity.isVerified(url);
|
||||
}
|
||||
@@ -443,16 +443,16 @@ public class DynamicAndroidInstallationService extends Service
|
||||
private void notifyOneClient(Messenger client, int status, int cause) throws RemoteException {
|
||||
Bundle bundle = new Bundle();
|
||||
|
||||
bundle.putLong(DynamicAndroidClient.KEY_INSTALLED_SIZE, mInstalledSize);
|
||||
bundle.putLong(DynamicSystemClient.KEY_INSTALLED_SIZE, mInstalledSize);
|
||||
|
||||
client.send(Message.obtain(null,
|
||||
DynamicAndroidClient.MSG_POST_STATUS, status, cause, bundle));
|
||||
DynamicSystemClient.MSG_POST_STATUS, status, cause, bundle));
|
||||
}
|
||||
|
||||
private int getStatus() {
|
||||
if (isInDynamicAndroid()) {
|
||||
if (isInDynamicSystem()) {
|
||||
return STATUS_IN_USE;
|
||||
} else if (isDynamicAndroidInstalled()) {
|
||||
} else if (isDynamicSystemInstalled()) {
|
||||
return STATUS_READY;
|
||||
} else if (mInstallTask == null) {
|
||||
return STATUS_NOT_STARTED;
|
||||
@@ -479,17 +479,17 @@ public class DynamicAndroidInstallationService extends Service
|
||||
}
|
||||
}
|
||||
|
||||
private boolean isInDynamicAndroid() {
|
||||
return mDynAndroid.isInUse();
|
||||
private boolean isInDynamicSystem() {
|
||||
return mDynSystem.isInUse();
|
||||
}
|
||||
|
||||
private boolean isDynamicAndroidInstalled() {
|
||||
return mDynAndroid.isInstalled();
|
||||
private boolean isDynamicSystemInstalled() {
|
||||
return mDynSystem.isInstalled();
|
||||
}
|
||||
|
||||
void handleMessage(Message msg) {
|
||||
switch (msg.what) {
|
||||
case DynamicAndroidClient.MSG_REGISTER_LISTENER:
|
||||
case DynamicSystemClient.MSG_REGISTER_LISTENER:
|
||||
try {
|
||||
Messenger client = msg.replyTo;
|
||||
|
||||
@@ -505,7 +505,7 @@ public class DynamicAndroidInstallationService extends Service
|
||||
}
|
||||
|
||||
break;
|
||||
case DynamicAndroidClient.MSG_UNREGISTER_LISTENER:
|
||||
case DynamicSystemClient.MSG_UNREGISTER_LISTENER:
|
||||
mClients.remove(msg.replyTo);
|
||||
break;
|
||||
default:
|
||||
@@ -14,11 +14,11 @@
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.android.dynandroid;
|
||||
package com.android.dynsystem;
|
||||
|
||||
import android.gsi.GsiProgress;
|
||||
import android.os.AsyncTask;
|
||||
import android.os.DynamicAndroidManager;
|
||||
import android.os.image.DynamicSystemManager;
|
||||
import android.util.Log;
|
||||
import android.webkit.URLUtil;
|
||||
|
||||
@@ -60,9 +60,9 @@ class InstallationAsyncTask extends AsyncTask<String, Long, Integer> {
|
||||
private final String mUrl;
|
||||
private final long mSystemSize;
|
||||
private final long mUserdataSize;
|
||||
private final DynamicAndroidManager mDynamicAndroid;
|
||||
private final DynamicSystemManager mDynSystem;
|
||||
private final InstallStatusListener mListener;
|
||||
private DynamicAndroidManager.Session mInstallationSession;
|
||||
private DynamicSystemManager.Session mInstallationSession;
|
||||
|
||||
private int mResult = NO_RESULT;
|
||||
|
||||
@@ -70,11 +70,11 @@ class InstallationAsyncTask extends AsyncTask<String, Long, Integer> {
|
||||
|
||||
|
||||
InstallationAsyncTask(String url, long systemSize, long userdataSize,
|
||||
DynamicAndroidManager dynAndroid, InstallStatusListener listener) {
|
||||
DynamicSystemManager dynSystem, InstallStatusListener listener) {
|
||||
mUrl = url;
|
||||
mSystemSize = systemSize;
|
||||
mUserdataSize = userdataSize;
|
||||
mDynamicAndroid = dynAndroid;
|
||||
mDynSystem = dynSystem;
|
||||
mListener = listener;
|
||||
}
|
||||
|
||||
@@ -98,7 +98,7 @@ class InstallationAsyncTask extends AsyncTask<String, Long, Integer> {
|
||||
|
||||
Thread thread = new Thread(() -> {
|
||||
mInstallationSession =
|
||||
mDynamicAndroid.startInstallation(mSystemSize, mUserdataSize);
|
||||
mDynSystem.startInstallation(mSystemSize, mUserdataSize);
|
||||
});
|
||||
|
||||
|
||||
@@ -106,12 +106,12 @@ class InstallationAsyncTask extends AsyncTask<String, Long, Integer> {
|
||||
|
||||
while (thread.isAlive()) {
|
||||
if (isCancelled()) {
|
||||
boolean aborted = mDynamicAndroid.abort();
|
||||
Log.d(TAG, "Called DynamicAndroidManager.abort(), result = " + aborted);
|
||||
boolean aborted = mDynSystem.abort();
|
||||
Log.d(TAG, "Called DynamicSystemManager.abort(), result = " + aborted);
|
||||
return RESULT_OK;
|
||||
}
|
||||
|
||||
GsiProgress progress = mDynamicAndroid.getInstallationProgress();
|
||||
GsiProgress progress = mDynSystem.getInstallationProgress();
|
||||
installedSize = progress.bytes_processed;
|
||||
|
||||
if (installedSize > reportedInstalledSize + minStepToReport) {
|
||||
@@ -146,7 +146,7 @@ class InstallationAsyncTask extends AsyncTask<String, Long, Integer> {
|
||||
? bytes : Arrays.copyOf(bytes, numBytesRead);
|
||||
|
||||
if (!mInstallationSession.write(writeBuffer)) {
|
||||
throw new IOException("Failed write() to DynamicAndroid");
|
||||
throw new IOException("Failed write() to DynamicSystem");
|
||||
}
|
||||
|
||||
installedSize += numBytesRead;
|
||||
@@ -14,19 +14,19 @@
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.android.dynandroid;
|
||||
package com.android.dynsystem;
|
||||
|
||||
import static android.content.DynamicAndroidClient.KEY_SYSTEM_SIZE;
|
||||
import static android.content.DynamicAndroidClient.KEY_SYSTEM_URL;
|
||||
import static android.content.DynamicAndroidClient.KEY_USERDATA_SIZE;
|
||||
import static android.os.image.DynamicSystemClient.KEY_SYSTEM_SIZE;
|
||||
import static android.os.image.DynamicSystemClient.KEY_SYSTEM_URL;
|
||||
import static android.os.image.DynamicSystemClient.KEY_USERDATA_SIZE;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.app.KeyguardManager;
|
||||
import android.content.Context;
|
||||
import android.content.DynamicAndroidClient;
|
||||
import android.content.Intent;
|
||||
import android.os.Bundle;
|
||||
import android.os.UserHandle;
|
||||
import android.os.image.DynamicSystemClient;
|
||||
import android.util.Log;
|
||||
|
||||
|
||||
@@ -88,8 +88,8 @@ public class VerificationActivity extends Activity {
|
||||
sVerifiedUrl = url;
|
||||
|
||||
// start service
|
||||
Intent intent = new Intent(this, DynamicAndroidInstallationService.class);
|
||||
intent.setAction(DynamicAndroidClient.ACTION_START_INSTALL);
|
||||
Intent intent = new Intent(this, DynamicSystemInstallationService.class);
|
||||
intent.setAction(DynamicSystemClient.ACTION_START_INSTALL);
|
||||
intent.putExtra(KEY_SYSTEM_URL, url);
|
||||
intent.putExtra(KEY_SYSTEM_SIZE, systemSize);
|
||||
intent.putExtra(KEY_USERDATA_SIZE, userdataSize);
|
||||
@@ -1136,7 +1136,7 @@ Lcom/android/server/DropBoxManagerService$4;
|
||||
Lcom/android/server/DropBoxManagerService$EntryFile;
|
||||
Lcom/android/server/DropBoxManagerService$FileList;
|
||||
Lcom/android/server/DropBoxManagerService;
|
||||
Lcom/android/server/DynamicAndroidService;
|
||||
Lcom/android/server/DynamicSystemService;
|
||||
Lcom/android/server/EntropyMixer$1;
|
||||
Lcom/android/server/EntropyMixer$2;
|
||||
Lcom/android/server/EntropyMixer;
|
||||
@@ -4769,9 +4769,9 @@ PLcom/android/server/DropBoxManagerService$2;->getNextEntry(Ljava/lang/String;JL
|
||||
PLcom/android/server/DropBoxManagerService$EntryFile;->getFile(Ljava/io/File;)Ljava/io/File;
|
||||
PLcom/android/server/DropBoxManagerService;->checkPermission(ILjava/lang/String;)Z
|
||||
PLcom/android/server/DropBoxManagerService;->getNextEntry(Ljava/lang/String;JLjava/lang/String;)Landroid/os/DropBoxManager$Entry;
|
||||
PLcom/android/server/DynamicAndroidService;->connect(Landroid/os/IBinder$DeathRecipient;)Landroid/gsi/IGsiService;
|
||||
PLcom/android/server/DynamicAndroidService;->getGsiService()Landroid/gsi/IGsiService;
|
||||
PLcom/android/server/DynamicAndroidService;->isInUse()Z
|
||||
PLcom/android/server/DynamicSystemService;->connect(Landroid/os/IBinder$DeathRecipient;)Landroid/gsi/IGsiService;
|
||||
PLcom/android/server/DynamicSystemService;->getGsiService()Landroid/gsi/IGsiService;
|
||||
PLcom/android/server/DynamicSystemService;->isInUse()Z
|
||||
PLcom/android/server/EntropyMixer$1;->handleMessage(Landroid/os/Message;)V
|
||||
PLcom/android/server/EntropyMixer$2;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V
|
||||
PLcom/android/server/EventLogTags;->writeBatterySaverMode(IIIIILjava/lang/String;I)V
|
||||
@@ -15043,7 +15043,7 @@ SPLcom/android/server/DropBoxManagerService;->isTagEnabled(Ljava/lang/String;)Z
|
||||
SPLcom/android/server/DropBoxManagerService;->onBootPhase(I)V
|
||||
SPLcom/android/server/DropBoxManagerService;->onStart()V
|
||||
SPLcom/android/server/DropBoxManagerService;->trimToFit()J
|
||||
SPLcom/android/server/DynamicAndroidService;-><init>(Landroid/content/Context;)V
|
||||
SPLcom/android/server/DynamicSystemService;-><init>(Landroid/content/Context;)V
|
||||
SPLcom/android/server/EntropyMixer;-><init>(Landroid/content/Context;)V
|
||||
SPLcom/android/server/EntropyMixer;-><init>(Landroid/content/Context;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
|
||||
SPLcom/android/server/EntropyMixer;->addDeviceSpecificEntropy()V
|
||||
|
||||
@@ -22,25 +22,25 @@ import android.gsi.GsiProgress;
|
||||
import android.gsi.IGsiService;
|
||||
import android.os.IBinder;
|
||||
import android.os.IBinder.DeathRecipient;
|
||||
import android.os.IDynamicAndroidService;
|
||||
import android.os.RemoteException;
|
||||
import android.os.ServiceManager;
|
||||
import android.os.SystemProperties;
|
||||
import android.os.image.IDynamicSystemService;
|
||||
import android.util.Slog;
|
||||
|
||||
/**
|
||||
* DynamicAndroidService implements IDynamicAndroidService. It provides permission check before
|
||||
* DynamicSystemService implements IDynamicSystemService. It provides permission check before
|
||||
* passing requests to gsid
|
||||
*/
|
||||
public class DynamicAndroidService extends IDynamicAndroidService.Stub implements DeathRecipient {
|
||||
private static final String TAG = "DynamicAndroidService";
|
||||
public class DynamicSystemService extends IDynamicSystemService.Stub implements DeathRecipient {
|
||||
private static final String TAG = "DynamicSystemService";
|
||||
private static final String NO_SERVICE_ERROR = "no gsiservice";
|
||||
private static final int GSID_ROUGH_TIMEOUT_MS = 8192;
|
||||
|
||||
private Context mContext;
|
||||
private volatile IGsiService mGsiService;
|
||||
|
||||
DynamicAndroidService(Context context) {
|
||||
DynamicSystemService(Context context) {
|
||||
mContext = context;
|
||||
}
|
||||
|
||||
@@ -93,9 +93,9 @@ public class DynamicAndroidService extends IDynamicAndroidService.Stub implement
|
||||
|
||||
private void checkPermission() {
|
||||
if (mContext.checkCallingOrSelfPermission(
|
||||
android.Manifest.permission.MANAGE_DYNAMIC_ANDROID)
|
||||
android.Manifest.permission.MANAGE_DYNAMIC_SYSTEM)
|
||||
!= PackageManager.PERMISSION_GRANTED) {
|
||||
throw new SecurityException("Requires MANAGE_DYNAMIC_ANDROID permission");
|
||||
throw new SecurityException("Requires MANAGE_DYNAMIC_SYSTEM permission");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -849,7 +849,7 @@ public final class SystemServer {
|
||||
private void startOtherServices() {
|
||||
final Context context = mSystemContext;
|
||||
VibratorService vibrator = null;
|
||||
DynamicAndroidService dynamicAndroid = null;
|
||||
DynamicSystemService dynamicSystem = null;
|
||||
IStorageManager storageManager = null;
|
||||
NetworkManagementService networkManagement = null;
|
||||
IpSecService ipSecService = null;
|
||||
@@ -968,9 +968,9 @@ public final class SystemServer {
|
||||
ServiceManager.addService("vibrator", vibrator);
|
||||
traceEnd();
|
||||
|
||||
traceBeginAndSlog("StartDynamicAndroidService");
|
||||
dynamicAndroid = new DynamicAndroidService(context);
|
||||
ServiceManager.addService("dynamic_android", dynamicAndroid);
|
||||
traceBeginAndSlog("StartDynamicSystemService");
|
||||
dynamicSystem = new DynamicSystemService(context);
|
||||
ServiceManager.addService("dynamic_system", dynamicSystem);
|
||||
traceEnd();
|
||||
|
||||
if (!isWatch) {
|
||||
|
||||
@@ -16,28 +16,28 @@
|
||||
|
||||
package com.android.server;
|
||||
|
||||
import android.os.IDynamicAndroidService;
|
||||
import android.os.ServiceManager;
|
||||
import android.os.image.IDynamicSystemService;
|
||||
import android.test.AndroidTestCase;
|
||||
import android.test.suitebuilder.annotation.LargeTest;
|
||||
|
||||
public class DynamicAndroidServiceTest extends AndroidTestCase {
|
||||
private static final String TAG = "DynamicAndroidServiceTests";
|
||||
private IDynamicAndroidService mService;
|
||||
public class DynamicSystemServiceTest extends AndroidTestCase {
|
||||
private static final String TAG = "DynamicSystemServiceTests";
|
||||
private IDynamicSystemService mService;
|
||||
|
||||
@Override
|
||||
protected void setUp() throws Exception {
|
||||
mService =
|
||||
IDynamicAndroidService.Stub.asInterface(
|
||||
ServiceManager.getService("dynamic_android"));
|
||||
IDynamicSystemService.Stub.asInterface(
|
||||
ServiceManager.getService("dynamic_system"));
|
||||
}
|
||||
|
||||
@LargeTest
|
||||
public void test1() {
|
||||
assertTrue("dynamic_android service available", mService != null);
|
||||
assertTrue("dynamic_system service available", mService != null);
|
||||
try {
|
||||
mService.startInstallation(1 << 20, 8 << 30);
|
||||
fail("DynamicAndroidService did not throw SecurityException as expected");
|
||||
fail("DynamicSystemService did not throw SecurityException as expected");
|
||||
} catch (SecurityException e) {
|
||||
// expected
|
||||
} catch (Exception e) {
|
||||
Reference in New Issue
Block a user