InstallerConnectionpublic class InstallerConnection extends Object Represents a connection to {@code installd}. Allows multiple connect and
disconnect cycles. |
Fields Summary |
---|
private static final String | TAG | private static final boolean | LOCAL_DEBUG | private InputStream | mIn | private OutputStream | mOut | private android.net.LocalSocket | mSocket | private final byte[] | buf |
Constructors Summary |
---|
public InstallerConnection()
|
Methods Summary |
---|
private boolean | connect()
if (mSocket != null) {
return true;
}
Slog.i(TAG, "connecting...");
try {
mSocket = new LocalSocket();
LocalSocketAddress address = new LocalSocketAddress("installd",
LocalSocketAddress.Namespace.RESERVED);
mSocket.connect(address);
mIn = mSocket.getInputStream();
mOut = mSocket.getOutputStream();
} catch (IOException ex) {
disconnect();
return false;
}
return true;
| public int | dexopt(java.lang.String apkPath, int uid, boolean isPublic, java.lang.String instructionSet)
return dexopt(apkPath, uid, isPublic, "*", instructionSet, false);
| public int | dexopt(java.lang.String apkPath, int uid, boolean isPublic, java.lang.String pkgName, java.lang.String instructionSet, boolean vmSafeMode)
StringBuilder builder = new StringBuilder("dexopt");
builder.append(' ");
builder.append(apkPath);
builder.append(' ");
builder.append(uid);
builder.append(isPublic ? " 1" : " 0");
builder.append(' ");
builder.append(pkgName);
builder.append(' ");
builder.append(instructionSet);
builder.append(' ");
builder.append(vmSafeMode ? " 1" : " 0");
return execute(builder.toString());
| public void | disconnect()
Slog.i(TAG, "disconnecting...");
IoUtils.closeQuietly(mSocket);
IoUtils.closeQuietly(mIn);
IoUtils.closeQuietly(mOut);
mSocket = null;
mIn = null;
mOut = null;
| public int | execute(java.lang.String cmd)
String res = transact(cmd);
try {
return Integer.parseInt(res);
} catch (NumberFormatException ex) {
return -1;
}
| public int | patchoat(java.lang.String apkPath, int uid, boolean isPublic, java.lang.String instructionSet)
return patchoat(apkPath, uid, isPublic, "*", instructionSet);
| public int | patchoat(java.lang.String apkPath, int uid, boolean isPublic, java.lang.String pkgName, java.lang.String instructionSet)
StringBuilder builder = new StringBuilder("patchoat");
builder.append(' ");
builder.append(apkPath);
builder.append(' ");
builder.append(uid);
builder.append(isPublic ? " 1" : " 0");
builder.append(' ");
builder.append(pkgName);
builder.append(' ");
builder.append(instructionSet);
return execute(builder.toString());
| private boolean | readFully(byte[] buffer, int len)
try {
Streams.readFully(mIn, buffer, 0, len);
} catch (IOException ioe) {
Slog.e(TAG, "read exception");
disconnect();
return false;
}
if (LOCAL_DEBUG) {
Slog.i(TAG, "read " + len + " bytes");
}
return true;
| private int | readReply()
if (!readFully(buf, 2)) {
return -1;
}
final int len = (((int) buf[0]) & 0xff) | ((((int) buf[1]) & 0xff) << 8);
if ((len < 1) || (len > buf.length)) {
Slog.e(TAG, "invalid reply length (" + len + ")");
disconnect();
return -1;
}
if (!readFully(buf, len)) {
return -1;
}
return len;
| public synchronized java.lang.String | transact(java.lang.String cmd)
if (!connect()) {
Slog.e(TAG, "connection failed");
return "-1";
}
if (!writeCommand(cmd)) {
/*
* If installd died and restarted in the background (unlikely but
* possible) we'll fail on the next write (this one). Try to
* reconnect and write the command one more time before giving up.
*/
Slog.e(TAG, "write command failed? reconnect!");
if (!connect() || !writeCommand(cmd)) {
return "-1";
}
}
if (LOCAL_DEBUG) {
Slog.i(TAG, "send: '" + cmd + "'");
}
final int replyLength = readReply();
if (replyLength > 0) {
String s = new String(buf, 0, replyLength);
if (LOCAL_DEBUG) {
Slog.i(TAG, "recv: '" + s + "'");
}
return s;
} else {
if (LOCAL_DEBUG) {
Slog.i(TAG, "fail");
}
return "-1";
}
| private boolean | writeCommand(java.lang.String cmdString)
final byte[] cmd = cmdString.getBytes();
final int len = cmd.length;
if ((len < 1) || (len > buf.length)) {
return false;
}
buf[0] = (byte) (len & 0xff);
buf[1] = (byte) ((len >> 8) & 0xff);
try {
mOut.write(buf, 0, 2);
mOut.write(cmd, 0, len);
} catch (IOException ex) {
Slog.e(TAG, "write error");
disconnect();
return false;
}
return true;
|
|