如何用 android studio 打包 "wrap.sh" shell 脚本

How to package "wrap.sh" shell script with android studio

我正尝试通过 wrap.sh 脚本启动我的应用程序,如 here 所示,但是当我将 wrap.sh 放在正确的位置时,它没有捆绑在我的 apk 中。

这是相关的 build.gradle 文件:

android {
    compileSdkVersion rootProject.ext.compileSdkVersion
    buildToolsVersion rootProject.ext.buildToolsVersion
    sourceSets.main {
        res.srcDirs "res"
        assets.srcDirs '../../Resources/data/app', '../../Resources/data/content'
        jniLibs.srcDirs "jni"
        java.srcDirs "javasrc"
        manifest.srcFile "AndroidManifest.xml"
    }
    buildTypes {
        sanitize_debug {
            initWith buildTypes.debug
            minifyEnabled false
            useProguard false

            sourceSets.main {
                jniLibs.srcDirs +=  "jni/sanitizer/libs"
            }

[...]

tasks.whenTaskAdded { task ->
    if (task.name == 'generateSanitize_debugBuildConfig') {
        task.dependsOn createWrapScriptAddDir
    }
}

static def writeWrapScriptToFullyCompileJavaApp(wrapFile, abi) {
    if(abi == "armeabi" || abi == "armeabi-v7a")
        abi = "arm"
    if(abi == "arm64-v8a")
        abi = "aarch64"
    if (abi == "x86")
        abi = "i686"
    wrapFile.withWriter { writer ->
        writer.write('#!/system/bin/sh\n')
        writer.write('HERE="$(cd "$(dirname "[=13=]")" && pwd)"\n')
        writer.write('export ASAN_OPTIONS=log_to_syslog=false,allow_user_segv_handler=1,detect_container_overflow=0\n')
        //writer.write('export ASAN_ACTIVATION_OPTIONS=include_if_exists=/data/local/tmp/asan.options.b\n')
        writer.write("export LD_PRELOAD=$HERE/libclang_rt.asan-${abi}-android.so\n")
        writer.write('$@\n')
    }
}

task createWrapScriptAddDir(dependsOn: copyASANLibs) {
    for (String abi : rootProject.ext.abiFilters) {
        def dir = new File("jni/sanitizer/libs/" + abi)
        dir.mkdirs()
        def wrapFile = new File(dir, "wrap.sh")
        writeWrapScriptToFullyCompileJavaApp(wrapFile, abi)
        println "write file " + wrapFile.path
    }
}

我的 apk 中生成的 lib 文件夹只包含我的 so 文件(这些文件从它们各自的 "jni/sanitizer/libs/abi" 文件夹正确复制到 apk 中的 lib 文件夹)而不是我的 wrap.sh 文件。

我确实在我的 android 工作室文件夹视图(和我的磁盘上)中看到了我的 wrap.sh 文件,但是在 apk 中有 none。

(我正在尝试在 android 工作室中构建我的 so 文件,如 here 中那样)

所以我找到了解决方案(描述)。解决方法是将脚本放在 "resources/targetArchitecture" 文件夹中,然后您可以将其捆绑在 apk 中。