如何用 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 中。
我正尝试通过 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 中那样)
所以我找到了解决方案(描述