Merge "Move BasicShellCommandHandler to frameworks/lib/modules-utils"
This commit is contained in:
committed by
Android (Google) Code Review
commit
c91ed0851e
@@ -620,6 +620,7 @@ java_defaults {
|
||||
"av-types-aidl-java",
|
||||
"mediatranscoding_aidl_interface-java",
|
||||
"soundtrigger_middleware-aidl-java",
|
||||
"modules-utils-os",
|
||||
],
|
||||
}
|
||||
|
||||
@@ -1259,7 +1260,6 @@ aidl_mapping {
|
||||
filegroup {
|
||||
name: "framework-telephony-common-shared-srcs",
|
||||
srcs: [
|
||||
"core/java/android/os/BasicShellCommandHandler.java",
|
||||
"core/java/android/os/RegistrantList.java",
|
||||
"core/java/android/os/Registrant.java",
|
||||
"core/java/android/util/IndentingPrintWriter.java",
|
||||
@@ -1342,7 +1342,6 @@ filegroup {
|
||||
name: "framework-wifi-service-shared-srcs",
|
||||
srcs: [
|
||||
"core/java/android/net/InterfaceConfiguration.java",
|
||||
"core/java/android/os/BasicShellCommandHandler.java",
|
||||
"core/java/android/util/BackupUtils.java",
|
||||
"core/java/android/util/Rational.java",
|
||||
"core/java/com/android/internal/util/FastXmlSerializer.java",
|
||||
|
||||
@@ -20,10 +20,11 @@ import android.app.ActivityManager;
|
||||
import android.app.AppGlobals;
|
||||
import android.content.pm.IPackageManager;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.os.BasicShellCommandHandler;
|
||||
import android.os.Binder;
|
||||
import android.os.UserHandle;
|
||||
|
||||
import com.android.modules.utils.BasicShellCommandHandler;
|
||||
|
||||
import java.io.PrintWriter;
|
||||
|
||||
public final class JobSchedulerShellCommand extends BasicShellCommandHandler {
|
||||
|
||||
@@ -4532,7 +4532,6 @@ android.os.AsyncTask
|
||||
android.os.BadParcelableException
|
||||
android.os.BaseBundle$NoImagePreloadHolder
|
||||
android.os.BaseBundle
|
||||
android.os.BasicShellCommandHandler
|
||||
android.os.BatteryManager
|
||||
android.os.BatteryManagerInternal
|
||||
android.os.BatteryProperty$1
|
||||
@@ -9558,6 +9557,7 @@ com.android.internal.widget.VerifyCredentialResponse$1
|
||||
com.android.internal.widget.VerifyCredentialResponse
|
||||
com.android.internal.widget.ViewClippingUtil$ClippingParameters
|
||||
com.android.internal.widget.ViewClippingUtil
|
||||
com.android.module.utils.BasicShellCommandHandler
|
||||
com.android.okhttp.Address
|
||||
com.android.okhttp.AndroidShimResponseCache
|
||||
com.android.okhttp.Authenticator
|
||||
|
||||
@@ -1,342 +0,0 @@
|
||||
/*
|
||||
* 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 android.os;
|
||||
|
||||
import android.util.Log;
|
||||
|
||||
import java.io.BufferedInputStream;
|
||||
import java.io.FileDescriptor;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.InputStream;
|
||||
import java.io.OutputStream;
|
||||
import java.io.PrintWriter;
|
||||
|
||||
/**
|
||||
* Helper for implementing {@link Binder#onShellCommand Binder.onShellCommand}. This is meant to
|
||||
* be copied into mainline modules, so this class must not use any hidden APIs.
|
||||
*
|
||||
* @hide
|
||||
*/
|
||||
public abstract class BasicShellCommandHandler {
|
||||
static final String TAG = "ShellCommand";
|
||||
static final boolean DEBUG = false;
|
||||
|
||||
private Binder mTarget;
|
||||
private FileDescriptor mIn;
|
||||
private FileDescriptor mOut;
|
||||
private FileDescriptor mErr;
|
||||
private String[] mArgs;
|
||||
|
||||
private String mCmd;
|
||||
private int mArgPos;
|
||||
private String mCurArgData;
|
||||
|
||||
private FileInputStream mFileIn;
|
||||
private FileOutputStream mFileOut;
|
||||
private FileOutputStream mFileErr;
|
||||
|
||||
private PrintWriter mOutPrintWriter;
|
||||
private PrintWriter mErrPrintWriter;
|
||||
private InputStream mInputStream;
|
||||
|
||||
public void init(Binder target, FileDescriptor in, FileDescriptor out, FileDescriptor err,
|
||||
String[] args, int firstArgPos) {
|
||||
mTarget = target;
|
||||
mIn = in;
|
||||
mOut = out;
|
||||
mErr = err;
|
||||
mArgs = args;
|
||||
mCmd = null;
|
||||
mArgPos = firstArgPos;
|
||||
mCurArgData = null;
|
||||
mFileIn = null;
|
||||
mFileOut = null;
|
||||
mFileErr = null;
|
||||
mOutPrintWriter = null;
|
||||
mErrPrintWriter = null;
|
||||
mInputStream = null;
|
||||
}
|
||||
|
||||
public int exec(Binder target, FileDescriptor in, FileDescriptor out, FileDescriptor err,
|
||||
String[] args) {
|
||||
String cmd;
|
||||
int start;
|
||||
if (args != null && args.length > 0) {
|
||||
cmd = args[0];
|
||||
start = 1;
|
||||
} else {
|
||||
cmd = null;
|
||||
start = 0;
|
||||
}
|
||||
init(target, in, out, err, args, start);
|
||||
mCmd = cmd;
|
||||
|
||||
if (DEBUG) {
|
||||
RuntimeException here = new RuntimeException("here");
|
||||
here.fillInStackTrace();
|
||||
Log.d(TAG, "Starting command " + mCmd + " on " + mTarget, here);
|
||||
Log.d(TAG, "Calling uid=" + Binder.getCallingUid()
|
||||
+ " pid=" + Binder.getCallingPid());
|
||||
}
|
||||
int res = -1;
|
||||
try {
|
||||
res = onCommand(mCmd);
|
||||
if (DEBUG) Log.d(TAG, "Executed command " + mCmd + " on " + mTarget);
|
||||
} catch (Throwable e) {
|
||||
// Unlike usual calls, in this case if an exception gets thrown
|
||||
// back to us we want to print it back in to the dump data, since
|
||||
// that is where the caller expects all interesting information to
|
||||
// go.
|
||||
PrintWriter eout = getErrPrintWriter();
|
||||
eout.println();
|
||||
eout.println("Exception occurred while executing '" + mCmd + "':");
|
||||
e.printStackTrace(eout);
|
||||
} finally {
|
||||
if (DEBUG) Log.d(TAG, "Flushing output streams on " + mTarget);
|
||||
if (mOutPrintWriter != null) {
|
||||
mOutPrintWriter.flush();
|
||||
}
|
||||
if (mErrPrintWriter != null) {
|
||||
mErrPrintWriter.flush();
|
||||
}
|
||||
if (DEBUG) Log.d(TAG, "Sending command result on " + mTarget);
|
||||
}
|
||||
if (DEBUG) Log.d(TAG, "Finished command " + mCmd + " on " + mTarget);
|
||||
return res;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the raw FileDescriptor for the output stream.
|
||||
*/
|
||||
public FileDescriptor getOutFileDescriptor() {
|
||||
return mOut;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return direct raw access (not buffered) to the command's output data stream.
|
||||
*/
|
||||
public OutputStream getRawOutputStream() {
|
||||
if (mFileOut == null) {
|
||||
mFileOut = new FileOutputStream(mOut);
|
||||
}
|
||||
return mFileOut;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return a PrintWriter for formatting output to {@link #getRawOutputStream()}.
|
||||
*/
|
||||
public PrintWriter getOutPrintWriter() {
|
||||
if (mOutPrintWriter == null) {
|
||||
mOutPrintWriter = new PrintWriter(getRawOutputStream());
|
||||
}
|
||||
return mOutPrintWriter;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the raw FileDescriptor for the error stream.
|
||||
*/
|
||||
public FileDescriptor getErrFileDescriptor() {
|
||||
return mErr;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return direct raw access (not buffered) to the command's error output data stream.
|
||||
*/
|
||||
public OutputStream getRawErrorStream() {
|
||||
if (mFileErr == null) {
|
||||
mFileErr = new FileOutputStream(mErr);
|
||||
}
|
||||
return mFileErr;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return a PrintWriter for formatting output to {@link #getRawErrorStream()}.
|
||||
*/
|
||||
public PrintWriter getErrPrintWriter() {
|
||||
if (mErr == null) {
|
||||
return getOutPrintWriter();
|
||||
}
|
||||
if (mErrPrintWriter == null) {
|
||||
mErrPrintWriter = new PrintWriter(getRawErrorStream());
|
||||
}
|
||||
return mErrPrintWriter;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the raw FileDescriptor for the input stream.
|
||||
*/
|
||||
public FileDescriptor getInFileDescriptor() {
|
||||
return mIn;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return direct raw access (not buffered) to the command's input data stream.
|
||||
*/
|
||||
public InputStream getRawInputStream() {
|
||||
if (mFileIn == null) {
|
||||
mFileIn = new FileInputStream(mIn);
|
||||
}
|
||||
return mFileIn;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return buffered access to the command's {@link #getRawInputStream()}.
|
||||
*/
|
||||
public InputStream getBufferedInputStream() {
|
||||
if (mInputStream == null) {
|
||||
mInputStream = new BufferedInputStream(getRawInputStream());
|
||||
}
|
||||
return mInputStream;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the next option on the command line -- that is an argument that
|
||||
* starts with '-'. If the next argument is not an option, null is returned.
|
||||
*/
|
||||
public String getNextOption() {
|
||||
if (mCurArgData != null) {
|
||||
String prev = mArgs[mArgPos - 1];
|
||||
throw new IllegalArgumentException("No argument expected after \"" + prev + "\"");
|
||||
}
|
||||
if (mArgPos >= mArgs.length) {
|
||||
return null;
|
||||
}
|
||||
String arg = mArgs[mArgPos];
|
||||
if (!arg.startsWith("-")) {
|
||||
return null;
|
||||
}
|
||||
mArgPos++;
|
||||
if (arg.equals("--")) {
|
||||
return null;
|
||||
}
|
||||
if (arg.length() > 1 && arg.charAt(1) != '-') {
|
||||
if (arg.length() > 2) {
|
||||
mCurArgData = arg.substring(2);
|
||||
return arg.substring(0, 2);
|
||||
} else {
|
||||
mCurArgData = null;
|
||||
return arg;
|
||||
}
|
||||
}
|
||||
mCurArgData = null;
|
||||
return arg;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the next argument on the command line, whatever it is; if there are
|
||||
* no arguments left, return null.
|
||||
*/
|
||||
public String getNextArg() {
|
||||
if (mCurArgData != null) {
|
||||
String arg = mCurArgData;
|
||||
mCurArgData = null;
|
||||
return arg;
|
||||
} else if (mArgPos < mArgs.length) {
|
||||
return mArgs[mArgPos++];
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public String peekNextArg() {
|
||||
if (mCurArgData != null) {
|
||||
return mCurArgData;
|
||||
} else if (mArgPos < mArgs.length) {
|
||||
return mArgs[mArgPos];
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @return all the remaining arguments in the command without moving the current position.
|
||||
*/
|
||||
public String[] peekRemainingArgs() {
|
||||
int remaining = getRemainingArgsCount();
|
||||
String[] args = new String[remaining];
|
||||
for (int pos = mArgPos; pos < mArgs.length; pos++) {
|
||||
args[pos - mArgPos] = mArgs[pos];
|
||||
}
|
||||
return args;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns number of arguments that haven't been processed yet.
|
||||
*/
|
||||
public int getRemainingArgsCount() {
|
||||
if (mArgPos >= mArgs.length) {
|
||||
return 0;
|
||||
}
|
||||
return mArgs.length - mArgPos;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the next argument on the command line, whatever it is; if there are
|
||||
* no arguments left, throws an IllegalArgumentException to report this to the user.
|
||||
*/
|
||||
public String getNextArgRequired() {
|
||||
String arg = getNextArg();
|
||||
if (arg == null) {
|
||||
String prev = mArgs[mArgPos - 1];
|
||||
throw new IllegalArgumentException("Argument expected after \"" + prev + "\"");
|
||||
}
|
||||
return arg;
|
||||
}
|
||||
|
||||
public int handleDefaultCommands(String cmd) {
|
||||
if (cmd == null || "help".equals(cmd) || "-h".equals(cmd)) {
|
||||
onHelp();
|
||||
} else {
|
||||
getOutPrintWriter().println("Unknown command: " + cmd);
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
public Binder getTarget() {
|
||||
return mTarget;
|
||||
}
|
||||
|
||||
public String[] getAllArgs() {
|
||||
return mArgs;
|
||||
}
|
||||
|
||||
/**
|
||||
* Implement parsing and execution of a command. If it isn't a command you understand,
|
||||
* call {@link #handleDefaultCommands(String)} and return its result as a last resort.
|
||||
* Use {@link #getNextOption()}, {@link #getNextArg()}, and {@link #getNextArgRequired()}
|
||||
* to process additional command line arguments. Command output can be written to
|
||||
* {@link #getOutPrintWriter()} and errors to {@link #getErrPrintWriter()}.
|
||||
*
|
||||
* <p class="caution">Note that no permission checking has been done before entering this
|
||||
* function, so you need to be sure to do your own security verification for any commands you
|
||||
* are executing. The easiest way to do this is to have the ShellCommand contain
|
||||
* only a reference to your service's aidl interface, and do all of your command
|
||||
* implementations on top of that -- that way you can rely entirely on your executing security
|
||||
* code behind that interface.</p>
|
||||
*
|
||||
* @param cmd The first command line argument representing the name of the command to execute.
|
||||
* @return Return the command result; generally 0 or positive indicates success and
|
||||
* negative values indicate error.
|
||||
*/
|
||||
public abstract int onCommand(String cmd);
|
||||
|
||||
/**
|
||||
* Implement this to print help text about your command to {@link #getOutPrintWriter()}.
|
||||
*/
|
||||
public abstract void onHelp();
|
||||
}
|
||||
@@ -19,15 +19,9 @@ package android.os;
|
||||
import android.compat.annotation.UnsupportedAppUsage;
|
||||
import android.util.Slog;
|
||||
|
||||
import com.android.internal.util.FastPrintWriter;
|
||||
import com.android.modules.utils.BasicShellCommandHandler;
|
||||
|
||||
import java.io.BufferedInputStream;
|
||||
import java.io.FileDescriptor;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.InputStream;
|
||||
import java.io.OutputStream;
|
||||
import java.io.PrintWriter;
|
||||
|
||||
/**
|
||||
* Helper for implementing {@link Binder#onShellCommand Binder.onShellCommand}.
|
||||
|
||||
@@ -18,9 +18,10 @@
|
||||
package com.android.internal.os;
|
||||
|
||||
import android.compat.annotation.UnsupportedAppUsage;
|
||||
import android.os.BasicShellCommandHandler;
|
||||
import android.os.Build;
|
||||
|
||||
import com.android.modules.utils.BasicShellCommandHandler;
|
||||
|
||||
import java.io.PrintStream;
|
||||
|
||||
public abstract class BaseCommand {
|
||||
|
||||
@@ -211,6 +211,7 @@ java_library {
|
||||
":connectivity-service-srcs",
|
||||
],
|
||||
installable: true,
|
||||
jarjar_rules: "jarjar-rules.txt",
|
||||
libs: [
|
||||
"android.net.ipsec.ike",
|
||||
"services.core",
|
||||
|
||||
2
services/core/jarjar-rules.txt
Normal file
2
services/core/jarjar-rules.txt
Normal file
@@ -0,0 +1,2 @@
|
||||
# For ConnectivityService module
|
||||
rule com.android.modules.utils.** com.android.connectivity.utils.@1
|
||||
@@ -137,7 +137,6 @@ import android.net.netlink.InetDiagMessage;
|
||||
import android.net.shared.PrivateDnsConfig;
|
||||
import android.net.util.MultinetworkPolicyTracker;
|
||||
import android.net.util.NetdService;
|
||||
import android.os.BasicShellCommandHandler;
|
||||
import android.os.Binder;
|
||||
import android.os.Build;
|
||||
import android.os.Bundle;
|
||||
@@ -190,6 +189,7 @@ import com.android.internal.util.IndentingPrintWriter;
|
||||
import com.android.internal.util.LocationPermissionChecker;
|
||||
import com.android.internal.util.MessageUtils;
|
||||
import com.android.internal.util.XmlUtils;
|
||||
import com.android.modules.utils.BasicShellCommandHandler;
|
||||
import com.android.net.module.util.LinkPropertiesUtils.CompareOrUpdateResult;
|
||||
import com.android.net.module.util.LinkPropertiesUtils.CompareResult;
|
||||
import com.android.server.am.BatteryStatsService;
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
|
||||
package com.android.server.adb;
|
||||
|
||||
import android.os.BasicShellCommandHandler;
|
||||
import com.android.modules.utils.BasicShellCommandHandler;
|
||||
|
||||
import java.io.PrintWriter;
|
||||
import java.util.Objects;
|
||||
|
||||
@@ -16,9 +16,10 @@
|
||||
|
||||
package com.android.server.location;
|
||||
|
||||
import android.os.BasicShellCommandHandler;
|
||||
import android.os.UserHandle;
|
||||
|
||||
import com.android.modules.utils.BasicShellCommandHandler;
|
||||
|
||||
import java.io.PrintWriter;
|
||||
import java.util.Objects;
|
||||
|
||||
|
||||
@@ -89,8 +89,6 @@ rule android.util.BackupUtils* com.android.wifi.x.@0
|
||||
rule android.util.LocalLog* com.android.wifi.x.@0
|
||||
rule android.util.Rational* com.android.wifi.x.@0
|
||||
|
||||
rule android.os.BasicShellCommandHandler* com.android.wifi.x.@0
|
||||
|
||||
# Use our statically linked bouncy castle library
|
||||
rule org.bouncycastle.** com.android.wifi.x.@0
|
||||
# Use our statically linked protobuf library
|
||||
|
||||
Reference in New Issue
Block a user