(Android)自己编的一个第三方 apk,求问怎么在 activity 中用 root 或 shell 用户的权限执行 Linux 命令 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
passerby233
V2EX    Android

(Android)自己编的一个第三方 apk,求问怎么在 activity 中用 root 或 shell 用户的权限执行 Linux 命令

  •  
  •   passerby233 2022-06-02 15:58:19 +08:00 12942 次点击
    这是一个创建于 1284 天前的主题,其中的信息可能已经有所发展或是发生改变。

    设备:非 root 的 Android 设备(小米 mix2s),测试机有的机器是 root 不了的,总之得考虑 root 不了的设备执行 Linux 命令的情况。

    开发工具:Android studio

    开发语言:kotlin

    自己在 GitHub 上找到了一个库,lubsu,根据 readme 绑定了一个 Rootservice ,发现不起作用,logcat 中也没有 log 打印。

    aidl 文件

    // ShellServiceInterface.aidl package com.example.shellexecutor; // Declare any non-default types here with import statements interface ShellServiceInterface { String getShellCommandExecResult(); IBinder getFileSystemService(); } 

    Service

    package com.example.shellexecutor import android.content.Intent import android.os.IBinder import android.util.Log import com.topjohnwu.superuser.Shell import com.topjohnwu.superuser.ipc.RootService import com.topjohnwu.superuser.nio.FileSystemManager class ExecuteRootCommandService : RootService() { class ExecRootShellBinder : ShellServiceInterface.Stub() { override fun getShellCommandExecResult(): String { val tag = "CommandResult" var result = "" val resp = Shell.cmd("ls -lrth").exec(); result = if (resp.isSuccess) { Log.d(tag, resp.out.toString()) resp.out.toString() } else { Log.d(tag, resp.err.toString()) resp.err.toString() } return result } override fun getFileSystemService(): IBinder { return FileSystemManager.getService() } } override fun onBind(intent: Intent): IBinder { return ExecRootShellBinder() } override fun onCreate() { super.onCreate() Log.d("ExecuteCommandService", "onCreate executed") } override fun onDestroy() { super.onDestroy() Log.d("ExecuteCommandService", "onDestroy executed") } } 

    MainActivity

    package com.example.shellexecutor import android.content.ComponentName import android.content.Intent import android.content.ServiceConnection import android.os.Bundle import android.os.IBinder import android.util.Log import android.widget.Button import android.widget.EditText import android.widget.TextView import android.widget.Toast import androidx.appcompat.app.AppCompatActivity import com.topjohnwu.superuser.ipc.RootService class MainActivity : AppCompatActivity() { class RootConnection : ServiceConnection { private val tag = "ShellConn" override fun onServiceConnected(name: ComponentName?, service: IBinder?) { Log.d(tag, "onServiceConnected") val ipc = ShellServiceInterface.Stub.asInterface(service) Log.d(tag, ipc.shellCommandExecResult) } override fun onServiceDisconnected(name: ComponentName?) { Log.d(tag, "onServiceDisconnected") } } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) val intent = Intent(this, ExecuteRootCommandService::class.java) // bind service RootService.bind(intent, RootConnection()) val content: EditText = findViewById(R.id.editTextTextPersonName) val bindButton: Button = findViewById(R.id.button1) val unbindButton: Button = findViewById(R.id.button2) val result: TextView = findViewById(R.id.textView) // create a shell bindButton.setOnClickListener { Toast.makeText(this, "assssssssasdasdfzsd", Toast.LENGTH_SHORT).show() } unbindButton.setOnClickListener { // RootService.unbind(rootConnection) } } } 

    启动应用后 logcat 中的 log

    2022-06-02 15:57:12.022 16213-16213/? I/e.shellexecuto: Late-enabling -Xcheck:jni 2022-06-02 15:57:12.039 16213-16213/? E/e.shellexecuto: Unknown bits set in runtime_flags: 0x8000 2022-06-02 15:57:12.383 16213-16213/com.example.shellexecutor I/Perf: Connecting to perf service. 2022-06-02 15:57:12.391 16213-16213/com.example.shellexecutor D/WM-WrkMgrInitializer: Initializing WorkManager with default configuration. 2022-06-02 15:57:12.414 16213-16213/com.example.shellexecutor I/FeatureParser: can't find polaris.xml in assets/device_features/,it may be in /system/etc/device_features 2022-06-02 15:57:12.424 16213-16213/com.example.shellexecutor E/libc: Access denied finding property "ro.vendor.df.effect.conflict" 2022-06-02 15:57:12.427 16213-16248/com.example.shellexecutor E/Perf: Fail to get file list com.example.shellexecutor 2022-06-02 15:57:12.427 16213-16248/com.example.shellexecutor E/Perf: getFolderSize() : Exception_1 = java.lang.NullPointerException: Attempt to get length of null array 2022-06-02 15:57:12.428 16213-16248/com.example.shellexecutor E/Perf: Fail to get file list com.example.shellexecutor 2022-06-02 15:57:12.428 16213-16248/com.example.shellexecutor E/Perf: getFolderSize() : Exception_1 = java.lang.NullPointerException: Attempt to get length of null array 2022-06-02 15:57:12.492 16213-16213/com.example.shellexecutor D/ForceDarkHelper: updateByCheckExcludeList: pkg: com.example.shellexecutor activity: com.example.shellexecutor.MainActivity@51e2a78 2022-06-02 15:57:12.493 16213-16213/com.example.shellexecutor D/ForceDarkHelper: updateByCheckExcludeList: pkg: com.example.shellexecutor activity: com.example.shellexecutor.MainActivity@51e2a78 2022-06-02 15:57:12.501 16213-16255/com.example.shellexecutor W/e.shellexecuto: Accessing hidden method Lmiui/contentcatcher/sdk/Token;-><init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;I)V (greylist, linking, allowed) 2022-06-02 15:57:12.501 16213-16255/com.example.shellexecutor W/e.shellexecuto: Accessing hidden method Lmiui/contentcatcher/InterceptorProxy;->getWorkThread()Landroid/os/HandlerThread; (greylist, linking, allowed) 2022-06-02 15:57:12.501 16213-16255/com.example.shellexecutor D/ViewContentFactory: initViewContentFetcherClass 2022-06-02 15:57:12.501 16213-16255/com.example.shellexecutor D/ViewContentFactory: getInterceptorPackageInfo 2022-06-02 15:57:12.501 16213-16255/com.example.shellexecutor W/e.shellexecuto: Accessing hidden method Landroid/app/AppGlobals;->getInitialApplication()Landroid/app/Application; (greylist, linking, allowed) 2022-06-02 15:57:12.502 16213-16255/com.example.shellexecutor D/ViewContentFactory: getInitialApplication took 0ms 2022-06-02 15:57:12.502 16213-16255/com.example.shellexecutor D/ViewContentFactory: packageInfo.packageName: com.miui.catcherpatch 2022-06-02 15:57:12.508 16213-16255/com.example.shellexecutor D/ViewContentFactory: initViewContentFetcherClass took 7ms 2022-06-02 15:57:12.508 16213-16255/com.example.shellexecutor I/ContentCatcher: ViewContentFetcher : ViewContentFetcher 2022-06-02 15:57:12.508 16213-16255/com.example.shellexecutor D/ViewContentFactory: createInterceptor took 7ms 2022-06-02 15:57:12.509 16213-16255/com.example.shellexecutor W/e.shellexecuto: Accessing hidden method Lmiui/contentcatcher/sdk/ContentCatcherManager;->getInstance()Lmiui/contentcatcher/sdk/ContentCatcherManager; (greylist, linking, allowed) 2022-06-02 15:57:12.509 16213-16255/com.example.shellexecutor W/e.shellexecuto: Accessing hidden method Lmiui/contentcatcher/sdk/ContentCatcherManager;->registerContentInjector(Lmiui/contentcatcher/sdk/Token;Lmiui/contentcatcher/sdk/injector/IContentDecorateCallback;)V (greylist, linking, allowed) 2022-06-02 15:57:12.510 16213-16255/com.example.shellexecutor W/e.shellexecuto: Accessing hidden method Lmiui/contentcatcher/sdk/ContentCatcherManager;->getPageConfig(Lmiui/contentcatcher/sdk/Token;)Lmiui/contentcatcher/sdk/data/PageConfig; (greylist, linking, allowed) 2022-06-02 15:57:12.511 16213-16255/com.example.shellexecutor W/e.shellexecuto: Accessing hidden method Lmiui/contentcatcher/sdk/data/PageConfig;->getFeatures()Ljava/util/ArrayList; (greylist, linking, allowed) 2022-06-02 15:57:12.511 16213-16255/com.example.shellexecutor W/e.shellexecuto: Accessing hidden method Lmiui/contentcatcher/sdk/data/PageConfig;->getCatchers()Ljava/util/ArrayList; (greylist, linking, allowed) 2022-06-02 15:57:12.535 16213-16213/com.example.shellexecutor W/e.shellexecuto: Accessing hidden method Landroid/view/View;->computeFitSystemWindows(Landroid/graphics/Rect;Landroid/graphics/Rect;)Z (greylist, reflection, allowed) 2022-06-02 15:57:12.536 16213-16213/com.example.shellexecutor W/e.shellexecuto: Accessing hidden method Landroid/view/ViewGroup;->makeOptionalFitsSystemWindows()V (greylist, reflection, allowed) 2022-06-02 15:57:12.552 16213-16213/com.example.shellexecutor D/ForceDarkHelper: updateByCheckExcludeList: pkg: com.example.shellexecutor activity: com.example.shellexecutor.MainActivity@51e2a78 2022-06-02 15:57:12.573 16213-16213/com.example.shellexecutor D/ForceDarkHelper: updateByCheckExcludeList: pkg: com.example.shellexecutor activity: com.example.shellexecutor.MainActivity@51e2a78 2022-06-02 15:57:12.598 16213-16213/com.example.shellexecutor D/ForceDarkHelper: updateByCheckExcludeList: pkg: com.example.shellexecutor activity: com.example.shellexecutor.MainActivity@51e2a78 2022-06-02 15:57:12.617 16213-16213/com.example.shellexecutor D/ForceDarkHelper: updateByCheckExcludeList: pkg: com.example.shellexecutor activity: com.example.shellexecutor.MainActivity@51e2a78 2022-06-02 15:57:12.622 16213-16213/com.example.shellexecutor D/ForceDarkHelper: updateByCheckExcludeList: pkg: com.example.shellexecutor activity: com.example.shellexecutor.MainActivity@51e2a78 2022-06-02 15:57:12.646 16213-16213/com.example.shellexecutor W/Looper: Slow Looper main: Activity com.example.shellexecutor/.MainActivity is 366ms late (wall=220ms running=200ms ClientTransaction{ callbacks=[android.app.servertransaction.LaunchActivityItem] lifecycleRequest=android.app.servertransaction.ResumeActivityItem }) because of 2 msg, msg 2 took 365ms (seq=2 running=342ms runnable=3ms late=3ms h=android.app.ActivityThread$H w=110) 2022-06-02 15:57:12.646 16213-16213/com.example.shellexecutor W/Looper: Slow Looper main: Activity com.example.shellexecutor/.MainActivity is 587ms late (wall=0ms running=0ms ClientTransaction{ callbacks=[android.app.servertransaction.TopResumedActivityChangeItem] }) because of 3 msg, msg 2 took 365ms (seq=2 running=342ms runnable=3ms late=3ms h=android.app.ActivityThread$H w=110), msg 3 took 220ms (seq=3 running=200ms runnable=5ms late=366ms h=android.app.ActivityThread$H w=159) 2022-06-02 15:57:12.672 16213-16249/com.example.shellexecutor I/AdrenoGLES: QUALCOMM build : e541a88, I20154638fb Build Date : 09/15/20 OpenGL ES Shader Compiler Version: EV031.27.05.01 Local Branch : Remote Branch : refs/tags/AU_LINUX_ANDROID_LA.UM.8.3.R1.10.00.00.520.058 Remote Branch : NONE Reconstruct Branch : NOTHING 2022-06-02 15:57:12.673 16213-16249/com.example.shellexecutor I/AdrenoGLES: Build Config : S P 8.0.11 AArch64 2022-06-02 15:57:12.675 16213-16249/com.example.shellexecutor I/AdrenoGLES: PFP: 0x016ee187, ME: 0x00000000 2022-06-02 15:57:12.676 16213-16249/com.example.shellexecutor W/AdrenoUtils: <ReadGpuID_from_sysfs:194>: Failed to open /sys/class/kgsl/kgsl-3d0/gpu_model 2022-06-02 15:57:12.676 16213-16249/com.example.shellexecutor W/AdrenoUtils: <ReadGpuID:218>: Failed to read chip ID from gpu_model. Fallback to use the GSL path 2022-06-02 15:57:12.695 16213-16249/com.example.shellexecutor W/Gralloc3: mapper 3.x is not supported 

    启动应用后,服务都没有被绑定成功。实在没招了,求助。

    第 1 条附言    2022-06-02 23:38:24 +08:00

    该功能已经通过Shizuku实现,特别感谢@ysc3839大佬提供的方案,感谢各位大佬鼎力帮助。

    x2

    x1

    12 条回复    2022-06-02 23:39:39 +08:00
    b1iy
        1
    b1iy  
       2022-06-02 16:13:59 +08:00
    ```java
    Runtime.getRuntime().exec()
    ```
    你指这个?
    passerby233
        2
    passerby233  
    OP
       2022-06-02 16:19:55 +08:00
    @b1iy 不是,这个执行了会提示没有权限。想问怎么用 root 用户或者 adb shell 用户的权限去执行 Linux 命令。现在用的系统给 APP 分配的用户的权限,执行个`ls -lrth`都提示权限拒绝,谢谢哈。
    passerby233
        3
    passerby233  
    OP
      &nbp;2022-06-02 16:20:49 +08:00
    我也不是很懂,我 giao ,Android 萌新。
    passerby233
        4
    passerby233  
    OP
       2022-06-02 16:22:48 +08:00
    Android 的权限现在控制的越来越严格了
    cxtrinityy
        5
    cxtrinityy  
       2022-06-02 16:26:41 +08:00 via Android
    Android 要执行 root 命令首先你的手机要 root ,这样才能申请 su 权限,不然啥都不好使
    普通的 linux 命令一楼的就可以
    ysc3839
        6
    ysc3839  
       2022-06-02 16:29:01 +08:00 via Android
    有 root 的情况下直接执行"su -c <命令>"就可以了,会提示授权的,你可以下载一个终端 app 执行一下看看效果
    ysc3839
        7
    ysc3839  
       2022-06-02 16:31:10 +08:00 via Android   1
    如果机子没有 root ,想以 shell 身份执行的话,可以看看 Shizuku https://shizuku.rikka.app/zh-hans/
    undownding
        8
    undownding  
       2022-06-02 16:34:11 +08:00
    su -c ls -lrth
    passerby233
        9
    passerby233  
    OP
       2022-06-02 16:34:18 +08:00
    @ysc3839 卧槽,我就是想搞这种,多谢大佬,我去瞅瞅,感谢~
    huage2580
        10
    huage2580  
       2022-06-02 18:26:57 +08:00
    咋说呢,你的应用是系统进程 fork 出来的,权限当然是没有的。如果是以 adb shell 来启动一个进程,这个进程就拥有 shell 的权限。shizuku 大概就是做的这种工作,一个拥有 shell 权限的进程,代理你的请求。Android11 以上支持无线 adb ,它就是通过这个起的进程。
    Buges
        11
    Buges  
       2022-06-02 19:08:32 +08:00 via Android
    你遇到的问题似乎正是 sui 针对的目标
    https://github.com/RikkaApps/Sui
    passerby233
        12
    passerby233  
    OP
       2022-06-02 23:39:39 +08:00
    功能已实现,结贴了。感谢大位大佬的鼎力帮助!
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     816 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 38ms UTC 20:05 PVG 04:05 LAX 12:05 JFK 15:05
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86