翻譯自博客https://withme.skullzbones.com/blog/programming/execute-native-binaries-android-q-no-root/
Android10以后不再允許在app home目錄(/data/data)運(yùn)行可執(zhí)行文件,這樣就杜絕了從網(wǎng)絡(luò)下載可執(zhí)行文件之后再執(zhí)行的情況,保證了系統(tǒng)安全性档玻。
那么要想繼續(xù)運(yùn)行一些可執(zhí)行文件怎么辦呢脆粥?還是有辦法的瘟斜,就是把可執(zhí)行文件打包在app內(nèi)部翁垂。
- 在AndroidManifest.xml里面的application項(xiàng)里面添加下面的內(nèi)容:
android:extractNativeLibs="true" - 在項(xiàng)目的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)
} - 在項(xiàng)目的根目錄層級(jí)創(chuàng)建一個(gè)新的目錄mybins弱贼,并創(chuàng)建跟平臺(tái)相關(guān)的abi目錄[arm64-v8a, arm64-v8a, x86, armeabi-v7a]等撕攒,并把你的可執(zhí)行文件放入這些目錄陡鹃,下面是目錄結(jié)構(gòu):
project-folder/
├─ build/
├─ libs/
├─ src/
├─ mybins/
│ ├─ arm64-v8a/
│ │ ├─ ARM 64bit Binaries
│ ├─ arm64-v8a/
│ │ ├─ ARM 32bit Binaries
│ ├─ x86/
│ │ ├─ Intel 32bit Binaries - 通過(guò)下面的方式執(zhí)行上面的可執(zhí)行文件:
String basedir = appContext.getApplicationInfo().nativeLibraryDir;
Process process = Runtime.getRuntime().exec(basedir + "/<executable name>");
github上有一個(gè)方便的庫(kù),可供參考:https://github.com/jaredrummler/KtSh