Chạy các lệnh shell trên Android bằng Runtime.getR.78


8

Tôi đang làm việc trên một ứng dụng quản trị thiết bị (đã được nhà sản xuất ký). Tôi đang sử dụng nó để cài đặt các ứng dụng khác bằng lệnh shell adb bên dưới cho android 9: -

cat /sdcard/Download/myfolder/newapp.apk | pm install -S 1528293

và tôi chỉ vượt qua nó như thế này: -

String command = "cat /sdcard/Download/myfolder/newapp.apk | pm install -S 1528293"
Runtime.getRuntime().exec(command);

Nhưng tôi nhận được lỗi "mèo không biết tùy chọn S".

Lệnh tương tự hoạt động hoàn toàn tốt khi tôi chạy nó từ adb shell. Không biết những gì tôi đang làm sai và có thể sử dụng một số trợ giúp.

EDIT 1: - Tôi đã thử chạy lệnh như dưới đây: -

String[] commandInstall = {
                "/system/bin/sh",
                "-c",
                "cat /sdcard/Download/myfolder/newapp.apk | pm install -S 1528293"
        };
Process process = Runtime.getRuntime().exec(commandInstall);

Nhưng bây giờ tôi nhận được lỗi: -

ava.lang.SecurityException: Reverse mode only supported from shell
    at com.android.server.pm.PackageInstallerSession.doWriteInternal(PackageInstallerSession.java:679)
    at com.android.server.pm.PackageInstallerSession.write(PackageInstallerSession.java:612)
    at android.content.pm.PackageInstaller$Session.write(PackageInstaller.java:852)
    at com.android.server.pm.PackageManagerShellCommand.doWriteSplit(PackageManagerShellCommand.java:2447)
    at com.android.server.pm.PackageManagerShellCommand.runInstall(PackageManagerShellCommand.java:915)
    at com.android.server.pm.PackageManagerShellCommand.onCommand(PackageManagerShellCommand.java:158)
    at android.os.ShellCommand.exec(ShellCommand.java:103)
    at com.android.server.pm.PackageManagerService.onShellCommand(PackageManagerService.java:21330)
    at android.os.Binder.shellCommand(Binder.java:634)
    at android.os.Binder.onTransact(Binder.java:532)
    at android.content.pm.IPackageManager$Stub.onTransact(IPackageManager.java:2821)
    at com.android.server.pm.PackageManagerService.onTransact(PackageManagerService.java:3856)
    at android.os.Binder.execTransact(Binder.java:731)

Chỉnh sửa 2: - Trước Android 9, tôi chỉ có thể thực hiện các thao tác bên dưới để cài đặt ứng dụng: -

Runtime.getRuntime().exec("pm install -r app.apk");

Câu trả lời:


4

Nhìn vào mã nguồn của PackageInstallerSession tôi thấy rằng nó đã được đổi thành: -

switch (Binder.getCallingUid()) {
    case android.os.Process.SHELL_UID:
    case android.os.Process.ROOT_UID:
        break;
    default:
        throw new SecurityException("Reverse mode only supported from shell");
    }

Nguồn Vì vậy, ngay cả khi đó là một ứng dụng hệ thống, lệnh shell để cài đặt có thể không hoạt động. Từ các thông điệp cam kết có vẻ như, điều này đã được thực hiện để cho GóiInstaller thực hiện công việc này.

Tuy nhiên, có vẻ như điều này một lần nữa đã được thay đổi thành một số điểm, nhưng có lẽ không được bao gồm trong Android 9: -

    switch (Binder.getCallingUid()) {
                case android.os.Process.SHELL_UID:
                case android.os.Process.ROOT_UID:
                case android.os.Process.SYSTEM_UID:
                    break;
                default:
                    throw new SecurityException(
                            "Reverse mode only supported from shell or system");
            }

Nguồn

Vì vậy, nếu ứng dụng là một ứng dụng hệ thống, thì cách tốt nhất là sử dụng PackageInstaller.


Chính xác, hãy kiểm tra nỗ lực mỏng hơn của tôi để xóa dữ liệu trình duyệt Android, thông qua trình bao adb hoạt động tốt, nhưng khi thực hiện ngay cả ứng dụng hệ thống của nó hoặc trong các thiết bị đã root. những cmd này không được phép, stackoverflow.com/questions/10934304/ từ
UdayaLakmal

1

từ GóiInstallerSession.java:

switch (Binder.getCallingUid()) {
                    case android.os.Process.SHELL_UID:
                    case android.os.Process.ROOT_UID:
                    case android.os.Process.SYSTEM_UID:
                        break;
                    default:
                        throw new SecurityException(
                                "Reverse mode only supported from shell or system");
                }

Nếu ứng dụng của bạn nằm dưới hệ thống / ứng dụng, có lẽ bạn phải đặt nó vào hệ thống / ứng dụng riêng. Hy vọng nguồn gốc của ngoại lệ giúp bạn bằng cách nào đó.


Tôi đã thấy điều này và uid gọi và uid hệ thống nên giống nhau. Ngoài ra, thông báo lỗi cho biết: - chế độ đảo ngược chỉ được hỗ trợ từ shell. Vì vậy, có thể một cái gì đó thay đổi trong Android p.
noname
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.