Merge "Use the new gsid interface"

This commit is contained in:
Howard Chen
2019-11-15 11:05:16 +00:00
committed by Gerrit Code Review
5 changed files with 73 additions and 19 deletions

View File

@@ -100,6 +100,19 @@ public class DynamicSystemManager {
}
}
}
/**
* Start DynamicSystem installation.
*
* @return true if the call succeeds
*/
@RequiresPermission(android.Manifest.permission.MANAGE_DYNAMIC_SYSTEM)
public boolean startInstallation() {
try {
return mService.startInstallation();
} catch (RemoteException e) {
throw new RuntimeException(e.toString());
}
}
/**
* 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.
@@ -112,9 +125,9 @@ public class DynamicSystemManager {
* true.
*/
@RequiresPermission(android.Manifest.permission.MANAGE_DYNAMIC_SYSTEM)
public Session startInstallation(String name, long size, boolean readOnly) {
public Session createPartition(String name, long size, boolean readOnly) {
try {
if (mService.startInstallation(name, size, readOnly)) {
if (mService.createPartition(name, size, readOnly)) {
return new Session();
} else {
return null;
@@ -123,7 +136,18 @@ public class DynamicSystemManager {
throw new RuntimeException(e.toString());
}
}
/**
* Finish a previously started installation. Installations without a cooresponding
* finishInstallation() will be cleaned up during device boot.
*/
@RequiresPermission(android.Manifest.permission.MANAGE_DYNAMIC_SYSTEM)
public boolean finishInstallation() {
try {
return mService.finishInstallation();
} catch (RemoteException e) {
throw new RuntimeException(e.toString());
}
}
/**
* Query the progress of the current installation operation. This can be called while the
* installation is in progress.

View File

@@ -21,15 +21,26 @@ import android.gsi.GsiProgress;
interface IDynamicSystemService
{
/**
* Start DynamicSystem installation. This call may take 60~90 seconds. The caller
* Start DynamicSystem installation.
* @return true if the call succeeds
*/
boolean startInstallation();
/**
* Create a DSU partition. This call may take 60~90 seconds. The caller
* may use another thread to call the getStartProgress() to get the progress.
*
* @param name The DSU partition name
* @param size Size of the DSU image in bytes
* @param readOnly True if this partition is readOnly
* @return true if the call succeeds
*/
boolean startInstallation(@utf8InCpp String name, long size, boolean readOnly);
boolean createPartition(@utf8InCpp String name, long size, boolean readOnly);
/**
* Finish a previously started installation. Installations without
* a cooresponding finishInstallation() will be cleaned up during device boot.
*/
boolean finishInstallation();
/**
* Query the progress of the current installation operation. This can be called while

View File

@@ -102,9 +102,10 @@ class InstallationAsyncTask extends AsyncTask<String, Long, Throwable> {
Thread thread =
new Thread(
() -> {
mDynSystem.startInstallation("userdata", mUserdataSize, false);
mDynSystem.startInstallation();
mDynSystem.createPartition("userdata", mUserdataSize, false);
mInstallationSession =
mDynSystem.startInstallation("system", mSystemSize, true);
mDynSystem.createPartition("system", mSystemSize, true);
});
thread.start();
@@ -157,6 +158,7 @@ class InstallationAsyncTask extends AsyncTask<String, Long, Throwable> {
reportedInstalledSize = installedSize;
}
}
mDynSystem.finishInstallation();
return null;
} catch (Exception e) {

View File

@@ -18,7 +18,6 @@ package com.android.server;
import android.content.Context;
import android.content.pm.PackageManager;
import android.gsi.GsiInstallParams;
import android.gsi.GsiProgress;
import android.gsi.IGsiService;
import android.gsi.IGsid;
@@ -47,6 +46,7 @@ public class DynamicSystemService extends IDynamicSystemService.Stub implements
private static final int GSID_ROUGH_TIMEOUT_MS = 8192;
private static final String PATH_DEFAULT = "/data/gsi";
private Context mContext;
private String mInstallPath;
private volatile IGsiService mGsiService;
DynamicSystemService(Context context) {
@@ -115,8 +115,8 @@ public class DynamicSystemService extends IDynamicSystemService.Stub implements
}
@Override
public boolean startInstallation(String name, long size, boolean readOnly)
throws RemoteException {
public boolean startInstallation() throws RemoteException {
IGsiService service = getGsiService();
// priority from high to low: sysprop -> sdcard -> /data
String path = SystemProperties.get("os.aot.path");
if (path.isEmpty()) {
@@ -138,20 +138,35 @@ public class DynamicSystemService extends IDynamicSystemService.Stub implements
}
Slog.i(TAG, "startInstallation -> " + path);
}
mInstallPath = path;
if (service.openInstall(path) != 0) {
Slog.i(TAG, "Failed to open " + path);
return false;
}
return true;
}
@Override
public boolean createPartition(String name, long size, boolean readOnly)
throws RemoteException {
IGsiService service = getGsiService();
GsiInstallParams installParams = new GsiInstallParams();
installParams.installDir = path;
installParams.name = name;
installParams.size = size;
installParams.wipe = readOnly;
installParams.readOnly = readOnly;
if (service.beginGsiInstall(installParams) != 0) {
if (service.createPartition(name, size, readOnly) != 0) {
Slog.i(TAG, "Failed to install " + name);
return false;
}
return true;
}
@Override
public boolean finishInstallation() throws RemoteException {
IGsiService service = getGsiService();
if (service.closeInstall() != 0) {
Slog.i(TAG, "Failed to finish installation");
return false;
}
return true;
}
@Override
public GsiProgress getInstallationProgress() throws RemoteException {
return getGsiService().getInstallProgress();
@@ -190,6 +205,8 @@ public class DynamicSystemService extends IDynamicSystemService.Stub implements
@Override
public boolean remove() throws RemoteException {
IGsiService gsiService = getGsiService();
String install_dir = gsiService.getInstalledGsiImageDir();
return getGsiService().removeGsi();
}

View File

@@ -36,7 +36,7 @@ public class DynamicSystemServiceTest extends AndroidTestCase {
public void test1() {
assertTrue("dynamic_system service available", mService != null);
try {
mService.startInstallation("userdata", 8L << 30, false);
mService.startInstallation();
fail("DynamicSystemService did not throw SecurityException as expected");
} catch (SecurityException e) {
// expected