如何从Android应用程序中设置系统属性?

4

我需要在应用中执行setprop命令。

目前我正在尝试将其作为shell命令运行:

public class MainActivity extends AppCompatActivity {

    private static final String TAG = "test:MainActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        exec("setprop service.adb.tcp.port 5555");
    }

    private void exec(String cmd) {
        Process proc = null;
        BufferedReader successResult = null;
        BufferedReader errorResult = null;

        Runtime runtime = Runtime.getRuntime();
        Log.d(TAG, "exec command: " + cmd);
        try {
            proc = runtime.exec(cmd);
            successResult = new BufferedReader(new InputStreamReader(proc.getInputStream()));
            errorResult = new BufferedReader(new InputStreamReader(proc.getErrorStream()));
            String s;
            while ((s = successResult.readLine()) != null) {
                Log.d(TAG, "exec command: " + s);
            }
            while ((s = errorResult.readLine()) != null) {
                Log.d(TAG, "exec command: " + s);
            }
        } catch (IOException e) {
            Log.e(TAG, "Error running shell command:", e);
        } finally {
            try {
                if (successResult != null) {
                    successResult.close();
                }
                if (errorResult != null) {
                    errorResult.close();
                }
            } catch (IOException e) {
                Log.e(TAG, "Error running shell command:", e);
            }

            if (proc != null) {
                proc.destroy();
            }
        }
    }
}

这给我带来了:

执行命令:setprop service.adb.tcp.port 5555

执行命令:setprop:无法将属性'service.adb.tcp.port'设置为'5555'

如何从应用程序中设置系统属性?

编辑:抱歉,我应该补充说明我的设备已经root并且这个应用程序是一个系统应用程序。

1个回答

4

您无法从常规应用程序设置此特定属性。它受系统保护。

在 Android 5 之前,您需要在清单中为您的应用程序定义 sharedUserId="android.uid.system",而从 Android 5 开始,则需要 sharedUserId="android.uid.shell"

但是,如果您的应用程序具有这些用户 ID 之一,则必须使用系统证书签名才能进行安装,因此您只能在开发板和自定义 ROM 上执行此操作。

另一种选择是如果您的设备已经获取了 root 权限,则可以通过 su 命令运行 setprop 命令。


抱歉,我应该补充说明我正在使用带有自定义ROM的Root设备。我正在从系统应用程序中执行此操作。所以我只需添加 sharedUserId="android.uid.shell"吗? - Matt
取决于您的Android版本。如果您使用的是Android 5或更高版本,则是。 如果您使用的是旧版本,例如4.x,请添加sharedUserId="android.uid.system"。 - Lev M.
我正在使用5或更高版本,但这样做不起作用。我仍然会显示“exec command:setprop:无法将属性'service.adb.tcp.port'设置为'5555'”。如何使用系统证书进行签名? - Matt
如果您的系统中有su,则应该直接使用它。 要进行签名,您需要使用ROM构建时生成的密钥对。 以下是AOSP存储其测试密钥的位置: https://github.com/aosp-mirror/platform_build/tree/master/target/product/security 这是platform.pk8和platform.x509.pem 如果您无法访问这些密钥以签署应用程序,则将无法进行签名。 - Lev M.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接