如何在Android Q(10)以后版本运行可执行文件

翻译自博客https://withme.skullzbones.com/blog/programming/execute-native-binaries-android-q-no-root/
Android10以后不再允许在app home目录(/data/data)运行可执行文件,这样就杜绝了从网络下载可执行文件之后再执行的情况,保证了系统安全性。
那么要想继续运行一些可执行文件怎么办呢?还是有办法的,就是把可执行文件打包在app内部。

  1. 在AndroidManifest.xml里面的application项里面添加下面的内容:
    android:extractNativeLibs="true"
  2. 在项目的build.gradle(:app)文件的dependencies里面添加:
    implementation fileTree(dir: "buildDir/native-libs", include: 'native-libs.jar') 并在全局task层级添加: task nativeLibsToJar(type: Jar, description: 'create a jar archive of the native libs') { destinationDir file("buildDir/native-libs")
    baseName 'native-libs'
    from fileTree(dir: 'mybins', include: '*/')
    into 'lib/'
    }
    tasks.withType(JavaCompile)
    {
    compileTask -> compileTask.dependsOn(nativeLibsToJar)
    }
  3. 在项目的根目录层级创建一个新的目录mybins,并创建跟平台相关的abi目录[arm64-v8a, arm64-v8a, x86, armeabi-v7a]等,并把你的可执行文件放入这些目录,下面是目录结构:
    project-folder/
    ├─ build/
    ├─ libs/
    ├─ src/
    ├─ mybins/
    │ ├─ arm64-v8a/
    │ │ ├─ ARM 64bit Binaries
    │ ├─ arm64-v8a/
    │ │ ├─ ARM 32bit Binaries
    │ ├─ x86/
    │ │ ├─ Intel 32bit Binaries
  4. 通过下面的方式执行上面的可执行文件:
    String basedir = appContext.getApplicationInfo().nativeLibraryDir;
    Process process = Runtime.getRuntime().exec(basedir + "/<executable name>");

github上有一个方便的库,可供参考:https://github.com/jaredrummler/KtSh

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容