美文网首页Android收藏
Android10以上无Root权限执行二进制文件

Android10以上无Root权限执行二进制文件

作者: 飞哥278999401 | 来源:发表于2022-01-13 13:59 被阅读0次

    根据 https://www.it1352.com/752040.html 这篇文章整理而来

    Android exe native
    Android10以下,可以直接把二进制文件拷贝到data/data/包名下/xxx文件,使用Runtime.getInstance().exec就可以了,但是Android10和11会报

    java.io.IOException: Cannot run program "data/data/包名/xxx文件": error=13, Permission denied
    

    猜测原因是存储分区权限改变导致的问题

    我们的.so文件也是二进制文件,放在data/data/包名下/lib路径下面,有权限去运行,那我们把二进制文件放在.so文件的地方,android打包即可自动把我们的二进制文件打到该路径下,我们就可以有权限去运行二进制文件了。

    我们把我们要用的二进制文件,名字改成so文件名字的格式,libxxx.so这种形式,放在app/libs/armeabi路径下。这样我们运行后,就可以发现我们的二进制文件在data/data/包名下/lib路径下面。如果不改成这种形式,系统不会把该文件打包过去,估计做判断了

    我们把原文件hello的文件名字改成libhello.so

    7CF182EA44EF1D6FDCB5D4CFFADD3A63.jpg

    程序运行后,这个假的so文件就自动被存到这里了

    7480905C8A6EF892E48E20821A561C05.jpg

    后续就直接

            Process process = runtime.exec(“data/data/包名/lib/libtest.so”);
    

    就可以无Root权限执行且兼容Android低版本,也不需要拷贝二进制文件到制定目录,系统会自动把我们要运行的二进制文件放到可执行的地方。

    class MainActivity : AppCompatActivity() {
    
        private var LOCAL = "/data/data/com.example.myapplication/lib/libhello.so"
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)
            val thread = Thread {
    
                val output = exec(LOCAL)
    
    
            }
            thread.start()
        }
    
    
        private fun exec(command: String): String? {
            return try {
    
                val process = Runtime.getRuntime().exec(command)
                val reader = BufferedReader(
                    InputStreamReader(process.inputStream)
                )
                var read: Int
                val buffer = CharArray(4096)
                val output = StringBuffer()
                while (reader.read(buffer).also { read = it } > 0) {
                    output.append(buffer, 0, read)
                }
                reader.close()
                process.waitFor()
                output.toString()
            } catch (e: IOException) {
                throw RuntimeException(e)
            } catch (e: InterruptedException) {
                throw RuntimeException(e)
            }
        }
    
    
    }
    

    app/build.gradle

      sourceSets {
            main{
                jniLibs.srcDirs = ['libs']
            }
        }
    

    相关文章

      网友评论

        本文标题:Android10以上无Root权限执行二进制文件

        本文链接:https://www.haomeiwen.com/subject/knuncrtx.html