翻译自博客https://withme.skullzbones.com/blog/programming/execute-native-binaries-android-q-no-root/
Android10以后不再允许在app home目录(/data/data)运行可执行文件,这样就杜绝了从网络下载可执行文件之后再执行的情况,保证了系统安全性。
那么要想继续运行一些可执行文件怎么办呢?还是有办法的,就是把可执行文件打包在app内部。
- 在AndroidManifest.xml里面的application项里面添加下面的内容:
android:extractNativeLibs="true" - 在项目的build.gradle(:app)文件的dependencies里面添加:
implementation fileTree(dir: "buildDir/native-libs")
baseName 'native-libs'
from fileTree(dir: 'mybins', include: '*/')
into 'lib/'
}
tasks.withType(JavaCompile)
{
compileTask -> compileTask.dependsOn(nativeLibsToJar)
} - 在项目的根目录层级创建一个新的目录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 - 通过下面的方式执行上面的可执行文件:
String basedir = appContext.getApplicationInfo().nativeLibraryDir;
Process process = Runtime.getRuntime().exec(basedir + "/<executable name>");
github上有一个方便的库,可供参考:https://github.com/jaredrummler/KtSh