{"id":7960,"date":"2025-04-22T21:43:11","date_gmt":"2025-04-22T13:43:11","guid":{"rendered":"https:\/\/www.wangonc.com\/?p=7960"},"modified":"2025-04-23T11:39:38","modified_gmt":"2025-04-23T03:39:38","slug":"developing-android-native-elf-with-vs-code","status":"publish","type":"post","link":"https:\/\/www.wangonc.com\/index.php\/2025\/04\/22\/developing-android-native-elf-with-vs-code\/","title":{"rendered":"\u7528VS Code\u5f00\u53d1Android\u539f\u751felf"},"content":{"rendered":"<h2>\u524d\u8a00<\/h2>\n<p>\u6700\u8fd1\u63a5\u5230\u4e86\u4e00\u4e2a\u9700\u6c42\uff0c\u9700\u8981\u5f00\u53d1\u4e00\u4e2aAndroid\u7684elf\u7684demo\u3002\u5728Android Studio\u4e0a\u6298\u817e\u4e86\u4e00\u4e0b\uff0c\u867d\u7136\u4ee3\u7801\u63d0\u793a\u5f88\u5b8c\u7f8e\uff0c\u4f46\u662f\u90e8\u7f72\u8c03\u8bd5\u4e0d\u80fd\u4ee4\u6211\u6ee1\u610f\uff08\u6bd5\u7adf\u662f\u62ff\u6765\u5f00\u53d1app\u7684\uff09\uff0c\u6240\u4ee5\u6298\u817e\u4e00\u4e0bVSCode\u3002<\/p>\n<p>\u4e0b\u9762\u7684\u914d\u7f6e\u6240\u5fc5\u987b\u7684\u63d2\u4ef6\uff1a<code>C\/C++<\/code>\u3001<code>CMake Tools<\/code>\u3001<code>CodeLLDB<\/code><\/p>\n<h2>\u914d\u7f6e\u5bfc\u5165\u8def\u5f84<\/h2>\n<p>\u8fd9\u91cc\u4f7f\u7528\u7684\u662f\u6bd4\u8f83\u65b0\u7684NDK\uff0827.2\uff09\uff0c\u65e7\u7248\u672c\u7684NDK\u8def\u5f84\u53ef\u80fd\u4e0d\u4e00\u6837<\/p>\n<p>\u9996\u5148\u4f7f\u7528NDK\u4e2d\u7684clang\u67e5\u8be2\u5176\u5bfc\u5165\u6587\u4ef6\u7684\u8def\u5f84<code>aarch64-linux-android22-clang++.cmd -E -x c++ - -v<\/code>\uff0c\u67e5\u770b<code>#include &lt;...&gt; search starts here:<\/code>\u90e8\u5206<\/p>\n<p>\u8fd9\u91cc\u9700\u8981\u9700\u8981\u56db\u4e2ainclude\u8def\u5f84\uff0c\u5982\u4e0b<br \/>\n<code>{ndkdir}\\\\toolchains\\\\llvm\\\\prebuilt\\\\windows-x86_64\\\\sysroot\\\\usr\\\\include<\/code><br \/>\n<code>{ndkdir}\\\\toolchains\\\\llvm\\\\prebuilt\\\\windows-x86_64\\\\sysroot\\\\usr\\\\include\\\\aarch64-linux-android<\/code><br \/>\n<code>{ndkdir}\\\\toolchains\\\\llvm\\\\prebuilt\\\\windows-x86_64\\\\sysroot\\\\usr\\\\include\\\\c++\\\\v1<\/code><br \/>\n<code>{ndkdir}\\\\toolchains\\\\llvm\\\\prebuilt\\\\windows-x86_64\\\\lib\\\\clang\\\\18\\\\include<\/code><\/p>\n<p>\u5176\u4e2d<code>include\\\\aarch64-linux-android<\/code>\u662f\u7279\u5b9a\u67b6\u6784\u7684\u5934\u6587\u4ef6\uff0c\u8fd9\u91cc\u5982\u679c\u60f3\u8981\u5728vscode\u4e2d\u53ef\u4ee5\u6839\u636e\u9009\u62e9\u7684\u914d\u7f6e\u6765\u4f7f\u7528\u4e0d\u540c\u7684\u5934\u6587\u4ef6\uff0c\u5219\u9700\u8981\u5728<code>.vscode<\/code>\u76ee\u5f55\u4e2d\u521b\u5efa\u4e00\u4e2a\u6587\u4ef6<code>c_cpp_properties.json<\/code>\uff0c\u6dfb\u52a0\u5982\u4e0b\u5185\u5bb9(\u6ce8\u610f\u4fee\u6539ndk\u8def\u5f84)<\/p>\n<pre><code class=\"language-json\">{\n    &quot;configurations&quot;: [\n        {\n            &quot;name&quot;: &quot;ARM (32-bit)&quot;,\n            &quot;includePath&quot;: [\n                {ndkdir}\\\\toolchains\\\\llvm\\\\prebuilt\\\\windows-x86_64\\\\sysroot\\\\usr\\\\include&quot;,\n                {ndkdir}\\\\toolchains\\\\llvm\\\\prebuilt\\\\windows-x86_64\\\\sysroot\\\\usr\\\\include\\\\arm-linux-androideabi&quot;,\n                {ndkdir}\\\\toolchains\\\\llvm\\\\prebuilt\\\\windows-x86_64\\\\sysroot\\\\usr\\\\include\\\\c++\\\\v1&quot;,\n                {ndkdir}\\\\toolchains\\\\llvm\\\\prebuilt\\\\windows-x86_64\\\\lib\\\\clang\\\\18\\\\include&quot;\n            ],\n            &quot;defines&quot;: [&quot;__ARM_ARCH_7A__&quot;, &quot;ANDROID&quot;],\n            &quot;intelliSenseMode&quot;: &quot;linux-clang-arm&quot;\n        },\n        {\n            &quot;name&quot;: &quot;ARM64 (64-bit)&quot;,\n            &quot;includePath&quot;: [\n                {ndkdir}\\\\toolchains\\\\llvm\\\\prebuilt\\\\windows-x86_64\\\\sysroot\\\\usr\\\\include&quot;,\n                {ndkdir}\\\\toolchains\\\\llvm\\\\prebuilt\\\\windows-x86_64\\\\sysroot\\\\usr\\\\include\\\\aarch64-linux-android&quot;,\n                {ndkdir}\\\\toolchains\\\\llvm\\\\prebuilt\\\\windows-x86_64\\\\sysroot\\\\usr\\\\include\\\\c++\\\\v1&quot;,\n                {ndkdir}\\\\toolchains\\\\llvm\\\\prebuilt\\\\windows-x86_64\\\\lib\\\\clang\\\\18\\\\include&quot;\n            ],\n            &quot;defines&quot;: [&quot;__aarch64__&quot;, &quot;ANDROID&quot;],\n            &quot;intelliSenseMode&quot;: &quot;linux-clang-arm64&quot;\n        },\n        {\n            &quot;name&quot;: &quot;x86_64 (64-bit)&quot;,\n            &quot;includePath&quot;: [\n                {ndkdir}\\\\toolchains\\\\llvm\\\\prebuilt\\\\windows-x86_64\\\\sysroot\\\\usr\\\\include&quot;,\n                {ndkdir}\\\\toolchains\\\\llvm\\\\prebuilt\\\\windows-x86_64\\\\sysroot\\\\usr\\\\include\\\\x86_64-linux-android&quot;,\n                {ndkdir}\\\\toolchains\\\\llvm\\\\prebuilt\\\\windows-x86_64\\\\sysroot\\\\usr\\\\include\\\\c++\\\\v1&quot;,\n                {ndkdir}\\\\toolchains\\\\llvm\\\\prebuilt\\\\windows-x86_64\\\\lib\\\\clang\\\\18\\\\include&quot;\n            ],\n            &quot;defines&quot;: [&quot;__x86_64__&quot;, &quot;ANDROID&quot;],\n            &quot;intelliSenseMode&quot;: &quot;linux-clang-x64&quot;\n        }\n        ,{\n            &quot;name&quot;: &quot;x86 (32-bit)&quot;,\n            &quot;includePath&quot;: [\n                {ndkdir}\\\\toolchains\\\\llvm\\\\prebuilt\\\\windows-x86_64\\\\sysroot\\\\usr\\\\include&quot;,\n                {ndkdir}\\\\toolchains\\\\llvm\\\\prebuilt\\\\windows-x86_64\\\\sysroot\\\\usr\\\\include\\\\i686-linux-android&quot;,\n                {ndkdir}\\\\toolchains\\\\llvm\\\\prebuilt\\\\windows-x86_64\\\\sysroot\\\\usr\\\\include\\\\c++\\\\v1&quot;,\n                {ndkdir}\\\\toolchains\\\\llvm\\\\prebuilt\\\\windows-x86_64\\\\lib\\\\clang\\\\18\\\\include&quot;\n            ],\n            &quot;defines&quot;: [&quot;__i386__&quot;, &quot;ANDROID&quot;],\n            &quot;intelliSenseMode&quot;: &quot;linux-clang-x86&quot;\n        },\n        {\n            &quot;name&quot;: &quot;RISC-V (64-bit)&quot;,\n            &quot;includePath&quot;: [\n                {ndkdir}\\\\toolchains\\\\llvm\\\\prebuilt\\\\windows-x86_64\\\\sysroot\\\\usr\\\\include&quot;,\n                {ndkdir}\\\\toolchains\\\\llvm\\\\prebuilt\\\\windows-x86_64\\\\sysroot\\\\usr\\\\include\\\\riscv64-linux-android&quot;,\n                {ndkdir}\\\\toolchains\\\\llvm\\\\prebuilt\\\\windows-x86_64\\\\sysroot\\\\usr\\\\include\\\\c++\\\\v1&quot;,\n                {ndkdir}\\\\toolchains\\\\llvm\\\\prebuilt\\\\windows-x86_64\\\\lib\\\\clang\\\\18\\\\include&quot;\n            ],\n            &quot;defines&quot;: [&quot;__riscv&quot;, &quot;__riscv_xlen=64&quot;, &quot;ANDROID&quot;],\n            &quot;intelliSenseMode&quot;: &quot;clang-x64&quot;\n        }\n    ],\n    &quot;version&quot;: 4\n}<\/code><\/pre>\n<p>\u7136\u540e\u5c31\u53ef\u4ee5\u5728\u53f3\u4e0b\u89d2\u9009\u62e9\u4e0d\u540c\u7684\u67b6\u6784<br \/>\n<div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.wangonc.com\/wp-content\/uploads\/2025\/04\/image-1745220096693.png'><img class=\"lazyload lazyload-style-3\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/www.wangonc.com\/wp-content\/uploads\/2025\/04\/image-1745220096693.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"file\" \/><\/div><\/p>\n<p>\u6b64\u65f6\u4ee3\u7801\u63d0\u793a\u5df2\u7ecf\u6b63\u5e38\u4e86\uff0c\u4ee3\u7801\u4e5f\u4e0d\u4f1a\u56e0\u4e3a\u627e\u4e0d\u5230\u5934\u6587\u4ef6\u62a5\u9519<\/p>\n<h2>CMake\u4e0e\u6784\u5efa<\/h2>\n<h3>\u8bbe\u5b9aCMake\u8def\u5f84<\/h3>\n<p>\u9996\u5148\u9700\u8981\u8bbe\u5b9acmake\u7684\u8def\u5f84\uff0c\u8fd9\u91cc\u4f7f\u7528\u7684\u662fAndroidSDK\u4e2d\u7684CMake\u3002\u6253\u5f00VS Code\u8bbe\u7f6e\u4e2d\u7684\u5de5\u4f5c\u533a\uff08\u9488\u5bf9\u5f53\u524d\u6587\u4ef6\u5939\u7684\u5355\u72ec\u8bbe\u5b9a\uff09\uff0c\u641c\u7d22\u627e\u5230<code>CMake Path<\/code>\uff0c\u8bbe\u5b9a\u4e3a\u8def\u5f84<code>{SDKDir}\\cmake\\3.31.6\\bin\\cmake.exe<\/code><\/p>\n<p>\u6216\u8005\u76f4\u63a5\u5728\u6587\u4ef6\u5939\u4e0b\u7684.settings.json\u4e2d\u6dfb\u52a0\u4e00\u6761<code>&quot;cmake.cmakePath&quot;: &quot;{SDKDir}\\\\cmake\\\\3.31.6\\\\bin\\\\cmake.exe&quot;<\/code>,\u4e5f\u662f\u4e00\u6837\u7684\u6548\u679c<\/p>\n<h3>CMake\u914d\u7f6e<\/h3>\n<p>\u9996\u5148\u5728\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u521b\u5efaCMakeList.txt<\/p>\n<pre><code class=\"language-cmake\">cmake_minimum_required(VERSION 3.22.1)\n\n# \u8bbe\u7f6e Android NDK \u8def\u5f84\nset(ANDROID_NDK_HOME &quot;path\/to\/ndk&quot;)\n# \u8bbe\u7f6e CMake Toolchain \u6587\u4ef6\u8def\u5f84\nset(CMAKE_TOOLCHAIN_FILE &quot;${ANDROID_NDK_HOME}\/build\/cmake\/android.toolchain.cmake&quot;)\n# \u8bbe\u7f6e\u7f16\u8bd1\u5668\u8def\u5f84\nset(CMAKE_C_COMPILER &quot;${ANDROID_NDK_HOME}\/toolchains\/llvm\/prebuilt\/windows-x86_64\/bin\/aarch64-linux-android21-clang.cmd&quot;)\nset(CMAKE_CXX_COMPILER &quot;${ANDROID_NDK_HOME}\/toolchains\/llvm\/prebuilt\/windows-x86_64\/bin\/aarch64-linux-android21-clang++.cmd&quot;)\n\n# Android \u76f8\u5173\u914d\u7f6e\nset(ANDROID_PLATFORM android-21)  # \u6700\u4f4e\u652f\u6301\u7684 API \u7ea7\u522b\nset(ANDROID_ABI arm64-v8a)  # \u76ee\u6807\u67b6\u6784\nset(CMAKE_EXPORT_COMPILE_COMMANDS ON)\n\nproject(vtouchtest)\n\ninclude_directories(&quot;.&quot;)\n\n# \u6dfb\u52a0\u5934\u6587\u4ef6\u8def\u5f84\ninclude_directories(include)\ninclude_directories(${ANDROID_NDK_HOME}\/toolchains\/llvm\/prebuilt\/windows-x86_64\/lib\/clang\/18\/include) # clang\u7684\u5934\u6587\u4ef6\ninclude_directories(${ANDROID_NDK_HOME}\/toolchains\/llvm\/prebuilt\/windows-x86_64\/include\/c++\/4.9.x) # c++\u6807\u51c6\u5934\u6587\u4ef6\ninclude_directories(${ANDROID_NDK_HOME}\/toolchains\/llvm\/prebuilt\/windows-x86_64\/sysroot\/usr\/include) # \u7cfb\u7edf\u5934\u6587\u4ef6\n# \u67b6\u6784\u7279\u5b9a\u7684\u5934\u6587\u4ef6\nif(ANDROID_ABI STREQUAL &quot;arm64-v8a&quot;)\n    include_directories(${ANDROID_SYSROOT}\/usr\/include\/aarch64-linux-android)\nelseif(ANDROID_ABI STREQUAL &quot;armeabi-v7a&quot;)\n    include_directories(${ANDROID_SYSROOT}\/usr\/include\/arm-linux-androideabi)\nelseif(ANDROID_ABI STREQUAL &quot;x86_64&quot;)\n    include_directories(${ANDROID_SYSROOT}\/usr\/include\/x86_64-linux-android)\nelseif(ANDROID_ABI STREQUAL &quot;x86&quot;)\n    include_directories(${ANDROID_SYSROOT}\/usr\/include\/i686-linux-android)\nelseif(ANDROID_ABI STREQUAL &quot;riscv64&quot;)\n    include_directories(${ANDROID_SYSROOT}\/usr\/include\/riscv64-linux-android)\nendif()\n\n# \u6536\u96c6\u6e90\u6587\u4ef6\nfile(GLOB_RECURSE SOURCE_FILES &quot;src\/*.cpp&quot; &quot;src\/*.c&quot;)\n\n# \u521b\u5efa\u53ef\u6267\u884c\u6587\u4ef6\nadd_executable(${CMAKE_PROJECT_NAME} ${SOURCE_FILES})\n\n# \u4f9d\u8d56\u5e93\uff0c\u6309\u9700\u6dfb\u52a0\ntarget_link_libraries(${CMAKE_PROJECT_NAME} &quot;log&quot;)\ntarget_link_libraries(${CMAKE_PROJECT_NAME} &quot;z&quot;)\ntarget_link_libraries(${CMAKE_PROJECT_NAME} &quot;dl&quot;)\ntarget_link_libraries(${CMAKE_PROJECT_NAME} &quot;m&quot;)<\/code><\/pre>\n<p>\u6b64\u65f6\u5c31\u5df2\u7ecf\u53ef\u4ee5\u5728\u7ec8\u7aef\u4e2d\u4f7f\u7528CMake\u8fdb\u884c\u6784\u5efa\u4e86\uff0c\u547d\u4ee4\u5982\u4e0b<\/p>\n<pre><code class=\"language-shell\">\\path\\to\\sdk\\cmake\\3.31.6\\bin\\cmake.exe -G Ninja -DCMAKE_MAKE_PROGRAM=&quot;\\path\\to\\sdk\/cmake\/3.31.6\/bin\/ninja.exe&quot; .\n\\path\\to\\sdk\\cmake\\3.31.6\\bin\\cmake.exe --build .<\/code><\/pre>\n<p>\u4f46\u662f\u8fd9\u6837\u5e76\u4e0d\u4f18\u96c5\uff0c\u6240\u4ee5\u8fd8\u662f\u63a5\u7740\u914d\u7f6evscode<\/p>\n<p>\u8fd9\u91cc\u4f7f\u7528<code class=\"kb-btn\">Ctrl<\/code>+<code class=\"kb-btn\">Shift<\/code>+<code class=\"kb-btn\">P<\/code>\u6253\u5f00\u547d\u4ee4\u9762\u677f\uff0c\u641c\u7d22\u5e76\u6267\u884c<code>CMake: Add Configure Preset <\/code>,\u8f93\u5165\u540d\u79f0\uff0c\u8fd9\u4f1a\u5728\u9879\u76ee\u76ee\u5f55\u4e0b\u521b\u5efa\u4e00\u4e2a<code>CMakePresets.json<\/code>\uff0c\u5e76\u751f\u6210\u4e00\u4e2a\u6a21\u677f\u914d\u7f6e\u5185\u5bb9\uff0c\u8fd9\u91cc\u8865\u5145CMAKE_MAKE_PROGRAM\u3001CMAKE_TOOLCHAIN_FILE\u3001ANDROID_ABI\u3001ANDROID_PLATFORM\uff0c\u6269\u5c55\u4e3a\u4e3a\u5982\u4e0b\u5185\u5bb9<\/p>\n<pre><code class=\"language-json\">{\n    &quot;name&quot;: &quot;android-arm64-debug&quot;,\n    &quot;displayName&quot;: &quot;\u4f7f\u7528\u5de5\u5177\u94fe\u6587\u4ef6\u914d\u7f6e\u9884\u8bbe&quot;,\n    &quot;description&quot;: &quot;\u8bbe\u7f6e Ninja \u751f\u6210\u5668\u3001\u7248\u672c\u548c\u5b89\u88c5\u76ee\u5f55&quot;,\n    &quot;generator&quot;: &quot;Ninja&quot;,\n    &quot;binaryDir&quot;: &quot;${sourceDir}\/out\/build\/${presetName}&quot;,\n    &quot;cacheVariables&quot;: {\n        &quot;CMAKE_MAKE_PROGRAM&quot;: &quot;\/Path\/To\/SDK\/cmake\/3.31.6\/bin\/ninja.exe&quot;,\n        &quot;CMAKE_TOOLCHAIN_FILE&quot;: &quot;\/Path\/To\/NDK\/build\/cmake\/android.toolchain.cmake&quot;,\n        &quot;CMAKE_BUILD_TYPE&quot;: &quot;Debug&quot;,\n        &quot;ANDROID_ABI&quot;: &quot;arm64-v8a&quot;,\n        &quot;ANDROID_PLATFORM&quot;: &quot;android-21&quot;,\n        &quot;CMAKE_INSTALL_PREFIX&quot;: &quot;${sourceDir}\/out\/install\/${presetName}&quot;\n    }\n}<\/code><\/pre>\n<p>\u6b64\u65f6\u5c31\u53ef\u4ee5\u5220\u6389<code>CMakeList.txt<\/code>\u4e2d\u7684<code>set(ANDROID_PLATFORM android-21)<\/code>\u548c<code>set(ANDROID_ABI arm64-v8a)<\/code>\u4e86\uff0c\u901a\u8fc7\u9884\u8bbe\u53ef\u4ee5\u8bbe\u5b9a\u76ee\u6807\u67b6\u6784<\/p>\n<p>\u8fd9\u65f6\u5728vscode\u7684CMake\u4fa7\u8fb9\u680f\u4e2d\uff0c\u914d\u7f6e\u9884\u8bbe\u4e2d\u9009\u62e9\u521a\u624d\u521b\u5efa\u7684\u9884\u8bbe<\/p>\n<p><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.wangonc.com\/wp-content\/uploads\/2025\/04\/image-1745224859896.png'><img class=\"lazyload lazyload-style-3\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/www.wangonc.com\/wp-content\/uploads\/2025\/04\/image-1745224859896.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"file\" \/><\/div><\/p>\n<p>\u8fd9\u4f1a\u6267\u884c\u914d\u7f6e\u64cd\u4f5c\uff0c\u4e5f\u5c31\u662f\u4e0a\u9762\u7684<code>\\path\\to\\sdk\\cmake\\3.31.6\\bin\\cmake.exe -G Ninja -DCMAKE_MAKE_PROGRAM=&quot;\\path\\to\\sdk\/cmake\/3.31.6\/bin\/ninja.exe&quot; .<\/code>\u64cd\u4f5c<\/p>\n<p>\u7136\u540e\u5728\u751f\u6210\u5904\u70b9\u51fb\u201c\u751f\u6210\u201d\uff0c\u5373\u53ef\u7f16\u8bd1\u5904\u76ee\u6807\u6587\u4ef6\u3002\u6216\u8005\u5728\u6253\u5f00\u7684cpp\u6587\u4ef6\u53f3\u4e0a\u89d2\uff0c\u70b9\u51fb\u7f16\u8bd1\u6d3b\u52a8\u6587\u4ef6\uff0c\u4e5f\u662f\u4e00\u6837\u7684<\/p>\n<p><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.wangonc.com\/wp-content\/uploads\/2025\/04\/image-1745225152239.png'><img class=\"lazyload lazyload-style-3\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/www.wangonc.com\/wp-content\/uploads\/2025\/04\/image-1745225152239.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"file\" \/><\/div><\/p>\n<h2>\u90e8\u7f72\u4e0e\u8fd0\u884c<\/h2>\n<p>\u8fd9\u91cc\u8bf4\u7684\u90e8\u7f72\uff0c\u5b9e\u9645\u4e0a\u5c31\u662f\u53d1\u9001\u5230\u76ee\u6807\u8bbe\u5907\u4e0a\uff0c\u8fd0\u884c\u3002<\/p>\n<p>\u9700\u8981\u6ce8\u610f\u7684\u662f\uff0c\u53d7\u5230vscode\u7684\u9650\u5236\uff0c\u6ca1\u4ec0\u4e48\u6bd4\u8f83\u597d\u7684\u65b9\u6848\u5728\u4e0d\u7f16\u5199\u65b0\u63d2\u4ef6\u7684\u60c5\u51b5\u4e0b\uff0c\u5728\u8fd0\u884c\u4eba\u7269\u6216\u8005launch\u7684\u65f6\u5019\u652f\u6301\u591a\u8bbe\u5907\u9009\u62e9\uff0c\u4ee5\u53ca\u5904\u7406\u591a\u67b6\u6784\u90e8\u7f72\u7b49\u7b49\u60c5\u51b5\u3002<\/p>\n<p>\u9996\u5148\u521b\u5efa\u4e00\u4e2a\u540d\u4e3a<code>deploy.ps1<\/code>\u7684\u8f85\u52a9\u811a\u672c\u7528\u4e8e\u90e8\u7f72\u548c\u8fd0\u884celf\uff0c\u5177\u4f53\u5982\u4e0b\uff08\u5176\u4ed6\u7cfb\u7edf\u5bf9\u7740\u6539\u4e00\u4e0b\u5c31\u597d\uff09\uff0c\u653e\u7f6e\u5728\u9879\u76ee\u6839\u76ee\u5f55\u7684<code>tools<\/code>\u76ee\u5f55\u4e0b<\/p>\n<pre><code class=\"language-shell\">param (\n    [string]$BinaryPath=&quot;&quot;,      # \u4e8c\u8fdb\u5236\u6587\u4ef6\u8def\u5f84\n    [string]$DeviceTarget=&quot;\/data\/local\/tmp&quot;,    # \u53ef\u9009: \u8bbe\u5907\u4e2d\u76ee\u6807\u4e8c\u8fdb\u5236\u7684\u8def\u5f84\n    [string]$DeviceSerial=&quot;&quot;, # \u53ef\u9009: \u7279\u5b9a\u8bbe\u5907\u5e8f\u5217\u53f7\n    [switch]$Deploy,  # \u662f\u5426\u90e8\u7f72\n    [switch]$Run,  # \u662f\u5426\u540e\u8fd0\u884c\n    [switch]$Root,        # \u662f\u5426\u4f7f\u7528root\u8fd0\u884c\n)\n\nfunction Exit-WithError {\n    param (\n        [string]$Message,\n        [int]$ExitCode = 1\n    )\n    Write-Error $Message\n    exit $ExitCode\n}\n\n# \u83b7\u53d6root\u6743\u9650\u5e76\u8fd4\u56deroot\u65b9\u6cd5\nfunction Get-RootAccess {\n    param (\n        [string]$AdbCmd\n    )\n\n    $rootMethod = $null\n\n    # \u68c0\u67e5su\u547d\u4ee4\u662f\u5426\u53ef\u7528\n    $suCheck = Invoke-Expression &quot;$AdbCmd shell &#039;which su&#039;&quot;\n    if ($suCheck -and $suCheck -ne &quot;&quot; -and $LASTEXITCODE -eq 0) {\n        Write-Host &quot;Device has su binary available.&quot;\n        $rootMethod = &quot;su&quot;\n        return $rootMethod\n    }\n\n    # \u5c1d\u8bd5adb root\n    Write-Host &quot;Attempting to restart adb as root...&quot;\n    Invoke-Expression &quot;$AdbCmd root&quot;\n    if ($LASTEXITCODE -eq 0) {\n        # \u7b49\u5f85adb\u91cd\u65b0\u8fde\u63a5\n        Start-Sleep -Seconds 2\n\n        # \u9a8c\u8bc1adb\u662f\u5426\u771f\u6b63\u4ee5root\u8fd0\u884c\n        $idCheck = Invoke-Expression &quot;$AdbCmd shell id&quot;\n        if ($idCheck -match &quot;uid=0\\(root\\)&quot;) {\n            Write-Host &quot;ADB restarted in root mode successfully.&quot;\n            $rootMethod = &quot;adb_root&quot;\n            return $rootMethod\n        } else {\n            Write-Host &quot;ADB root command didn&#039;t grant root privileges.&quot;\n            return $null\n        }\n    }\n\n    # \u5982\u679c\u4e24\u79cd\u65b9\u6cd5\u90fd\u5931\u8d25\uff0c\u8fd4\u56denull\n    return $null\n}\n\n# \u4f7f\u7528root\u6743\u9650\u6267\u884c\u547d\u4ee4\nfunction Invoke-RootCommand {\n    param (\n        [string]$AdbCmd,\n        [string]$RootMethod,\n        [string]$Command\n    )\n\n    if ($RootMethod -eq &quot;su&quot;) {\n        # \u4f7f\u7528su\u6267\u884c\u547d\u4ee4\n        return Invoke-Expression &quot;$AdbCmd shell `&quot;su -c &#039;$Command&#039;`&quot;&quot;\n    } \n    elseif ($RootMethod -eq &quot;adb_root&quot;) {\n        # \u76f4\u63a5\u6267\u884c\u547d\u4ee4(adb\u5df2\u7ecf\u4ee5root\u8fd0\u884c)\n        return Invoke-Expression &quot;$AdbCmd shell `&quot;$Command`&quot;&quot;\n    }\n    else {\n        Exit-WithError &quot;No root method available.&quot;\n    }\n}\n\n# \u68c0\u67e5adb\u662f\u5426\u53ef\u7528\ntry {\n    Invoke-Expression &quot;adb version&quot;\n} catch {\n    Exit-WithError &quot;ADB not found in PATH. Please install Android SDK Platform Tools or add it to PATH.&quot;\n}\n\nif ($Deploy) {\n    # \u786e\u4fdd\u53c2\u6570\u6709\u6548\n    if (-not $BinaryPath -or $BinaryPath -eq &quot;&quot;) {\n        Exit-WithError &quot;Missing binary file path!&quot;\n    }\n\n    # \u68c0\u67e5\u4e8c\u8fdb\u5236\u6587\u4ef6\u662f\u5426\u5b58\u5728\n    if (-not (Test-Path $BinaryPath)) {\n        Exit-WithError &quot;Binary file does not exist: $BinaryPath&quot;\n        exit 1\n    }\n}\n\n# \u6784\u5efaadb\u547d\u4ee4\n$adbCmd = &quot;adb&quot;\nif ($DeviceSerial) {\n    $adbCmd = &quot;adb -s $DeviceSerial&quot;\n}\n\n# \u68c0\u67e5\u8bbe\u5907\u8fde\u63a5\u72b6\u6001\n$deviceCheck = Invoke-Expression &quot;$adbCmd devices&quot; | Select-String &quot;device$&quot;\nif (-not $deviceCheck) {\n    if ($DeviceSerial) {\n        Exit-WithError &quot;Device with serial &#039;$DeviceSerial&#039; not found or not authorized.&quot;\n    } else {\n        Exit-WithError &quot;No connected devices found. Please connect a device or start an emulator.&quot;\n    }\n}\n\n# \u68c0\u67e5\u662f\u5426\u8fde\u63a5\u4e86\u591a\u4e2a\u8bbe\u5907\uff0c\u4f46\u672a\u6307\u5b9a\u8bbe\u5907\u5e8f\u5217\u53f7\nif (-not $DeviceSerial) {\n    $deviceCount = @(Invoke-Expression &quot;adb devices&quot; | Select-String &quot;device$&quot;).Count\n    if ($deviceCount -gt 1) {\n        $devicesList = Invoke-Expression &quot;adb devices&quot; | Select-String &quot;device$&quot;\n        $devicesInfo = &quot;Connected devices:`n&quot; + ($devicesList -join &quot;`n&quot;)\n        Exit-WithError &quot;Multiple devices detected but no specific device specified. Please use the -DeviceSerial parameter.`n$devicesInfo&quot;\n    }\n}\n\n# \u63d0\u53d6\u6587\u4ef6\u540d\n$fileName = Split-Path $BinaryPath -Leaf\n\nif ($Deploy) {\n    # \u6267\u884c\u90e8\u7f72\n    Write-Host &quot;Deploying $fileName to device...&quot;\n    Invoke-Expression &quot;$adbCmd push `&quot;$BinaryPath`&quot; `&quot;$DeviceTarget\/$fileName`&quot;&quot;\n\n    if ($LASTEXITCODE -ne 0) {\n        Exit-WithError &quot;Deployment failed! Check if target directory is writable.&quot; $LASTEXITCODE\n    }\n\n    # \u8bbe\u7f6e\u6267\u884c\u6743\u9650\n    Write-Host &quot;Setting execution permissions...&quot;\n    Invoke-Expression &quot;$adbCmd shell chmod 755 `&quot;$DeviceTarget\/$fileName`&quot;&quot;\n\n    if ($LASTEXITCODE -ne 0) {\n        Exit-WithError &quot;Failed to set execution permissions.&quot; $LASTEXITCODE\n    }\n}\n\n# \u662f\u5426\u9700\u8981\u8fd0\u884c\nif ($Run) {\n    Write-Host &quot;Running application on device...&quot;\n\n    if ($Root) {\n        # \u83b7\u53d6root\u6743\u9650\n        $rootMethod = Get-RootAccess -AdbCmd $adbCmd\n\n        if (-not $rootMethod) {\n            Exit-WithError &quot;Device does not appear to be rooted. Cannot run as root.&quot;\n        }\n\n        Write-Host &quot;Running with root privileges...&quot;\n        $command = &quot;cd $DeviceTarget &amp;&amp; .\/$fileName&quot;\n        Invoke-RootCommand -AdbCmd $adbCmd -RootMethod $rootMethod -Command $command\n    } else {\n        Write-Host &quot;Running with normal privileges...&quot;\n        Invoke-Expression &quot;$adbCmd shell `&quot;cd $DeviceTarget &amp;&amp; .\/$fileName`&quot;&quot;\n    }\n\n    if ($LASTEXITCODE -ne 0) {\n        Exit-WithError &quot;Application execution failed with exit code $LASTEXITCODE.&quot; $LASTEXITCODE\n    }\n}<\/code><\/pre>\n<p>\u811a\u672c\u7531\u5c06\u90e8\u7f72\u548c\u6267\u884c\u529f\u80fd\u5206\u5f00\uff0c\u540e\u9762\u914d\u7f6e\u8d77\u6765\u66f4\u52a0\u7075\u6d3b\u3002<\/p>\n<p>\u7136\u540e\u7ed9CMake\u6dfb\u52a0\u7f16\u8bd1\u76ee\u6807\uff0c\u7531CMake\u8c03\u7528\u811a\u672c\uff0c\u8fd9\u6837\u514d\u53bb\u4e86\u624b\u52a8\u6307\u5b9a\u7f16\u8bd1\u4ea7\u7269\u7684\u9ebb\u70e6<\/p>\n<p>\u5728CMakeList.txt\u4e0b\u540e\u65b9\u6dfb\u52a0\u5982\u4e0b\u5185\u5bb9\uff0c\u5982\u679c\u9700\u8981\u6307\u5b9a\u8bbe\u5907\u5219\u9700\u8981\u628a\u8bbe\u5907\u4ee3\u7801\u586b\u5145\u5230&quot;&quot;\u4e2d<\/p>\n<pre><code class=\"language-cmake\"># \u914d\u7f6e\u6587\u4ef6\u540e\u7f00\nif(CMAKE_HOST_WIN32)\n    set(SCRIPT_EXT &quot;.ps1&quot;)\n    set(SCRIPT_CMD powershell)\n    set(SCRIPT_ARGS -ExecutionPolicy Bypass -File)\nelse()\n    set(SCRIPT_EXT &quot;.sh&quot;) \n    set(SCRIPT_PREFIX &quot;sh&quot;)\nendif()\n\n# \u83b7\u53d6\u76ee\u6807\u6587\u4ef6\u7684\u8def\u5f84 - \u4fee\u590d\u7684\u90e8\u5206\nset(TARGET_NAME ${CMAKE_PROJECT_NAME})  # \u786e\u4fdd\u8fd9\u662f\u60a8\u7684\u5b9e\u9645\u76ee\u6807\u540d\u79f0\n\n# \u4ec5\u90e8\u7f72\u5230\u8bbe\u5907\nadd_custom_target(deploy\n    COMMAND ${SCRIPT_CMD} ${SCRIPT_ARGS} &quot;${CMAKE_CURRENT_SOURCE_DIR}\/tools\/deploy${SCRIPT_EXT}&quot; \n            &quot;$&lt;TARGET_FILE:${TARGET_NAME}&gt;&quot;\n            &quot;\/data\/local\/tmp&quot; \n            &quot;&quot; \n            &quot;-Deploy&quot;\n    DEPENDS vtouchtest\n    COMMENT &quot;\u90e8\u7f72\u5230\u8bbe\u5907(\u4e0d\u6267\u884c)&quot;\n    VERBATIM\n)\n\n# \u4ee5\u666e\u901a\u6743\u9650\u6267\u884c\nadd_custom_target(run\n    COMMAND ${SCRIPT_CMD} ${SCRIPT_ARGS} &quot;${CMAKE_CURRENT_SOURCE_DIR}\/tools\/deploy${SCRIPT_EXT}&quot; \n            &quot;$&lt;TARGET_FILE:${TARGET_NAME}&gt;&quot;\n            &quot;\/data\/local\/tmp&quot; \n            &quot;&quot; \n            &quot;-Run&quot;\n    DEPENDS vtouchtest\n    COMMENT &quot;\u5728\u8bbe\u5907\u4e2d\u6267\u884c&quot;\n    VERBATIM\n)\n\n# \u4ee5root\u6743\u9650\u6267\u884c\nadd_custom_target(run_as_root\n    COMMAND ${SCRIPT_CMD} ${SCRIPT_ARGS} &quot;${CMAKE_CURRENT_SOURCE_DIR}\/tools\/deploy${SCRIPT_EXT}&quot; \n            &quot;$&lt;TARGET_FILE:${TARGET_NAME}&gt;&quot;\n            &quot;\/data\/local\/tmp&quot; \n            &quot;&quot; \n            &quot;-Run&quot; \n            &quot;-Root&quot;\n    DEPENDS vtouchtest\n    COMMENT &quot;\u5728\u8bbe\u5907\u4e2d\u4ee5root\u6743\u9650\u6267\u884c&quot;\n    VERBATIM\n)<\/code><\/pre>\n<p>\u6700\u540e\u5728.vscode\u76ee\u5f55\u4e2d\u6dfb\u52a0\u4e00\u4e2atasks.json\u6587\u4ef6\uff0c\u6dfb\u52a0\u4e0a\u5bf9\u5e94\u7684\u4efb\u52a1\u5373\u53ef<\/p>\n<pre><code class=\"language-json\">{\n    &quot;version&quot;: &quot;2.0.0&quot;,\n    &quot;tasks&quot;: [\n        {\n            &quot;type&quot;: &quot;cmake&quot;,\n            &quot;label&quot;: &quot;CMake: configure&quot;,\n            &quot;command&quot;: &quot;configure&quot;,\n            &quot;preset&quot;: &quot;${command:cmake.activeConfigurePresetName}&quot;,\n            &quot;detail&quot;: &quot;CMake template configure task&quot;,\n            &quot;group&quot;: {\n                &quot;kind&quot;: &quot;build&quot;,\n                &quot;isDefault&quot;: true\n            }\n        },\n        {\n            &quot;type&quot;: &quot;cmake&quot;,\n            &quot;label&quot;: &quot;CMake: build&quot;,\n            &quot;command&quot;: &quot;build&quot;,\n            &quot;preset&quot;: &quot;${command:cmake.activeBuildPresetName}&quot;,\n            &quot;detail&quot;: &quot;CMake template build task&quot;,\n            &quot;group&quot;: {\n                &quot;kind&quot;: &quot;build&quot;,\n                &quot;isDefault&quot;: true\n            },\n            &quot;dependsOn&quot;: [\n                &quot;CMake: configure&quot;\n            ]\n        },\n        {\n            &quot;type&quot;: &quot;cmake&quot;,\n            &quot;label&quot;: &quot;CMake: install&quot;,\n            &quot;command&quot;: &quot;install&quot;,\n            &quot;preset&quot;: &quot;${command:cmake.activeBuildPresetName}&quot;,\n            &quot;detail&quot;: &quot;CMake template install task&quot;,\n            &quot;group&quot;: {\n                &quot;kind&quot;: &quot;build&quot;,\n                &quot;isDefault&quot;: true\n            },\n            &quot;dependsOn&quot;: [\n                &quot;CMake: build&quot;\n            ]\n        },\n        {\n            &quot;type&quot;: &quot;cmake&quot;,\n            &quot;label&quot;: &quot;CMake: clean&quot;,\n            &quot;command&quot;: &quot;clean&quot;,\n            &quot;preset&quot;: &quot;${command:cmake.activeBuildPresetName}&quot;,\n            &quot;detail&quot;: &quot;CMake template clean task&quot;,\n            &quot;group&quot;: {\n                &quot;kind&quot;: &quot;build&quot;,\n                &quot;isDefault&quot;: true\n            }\n        },\n        {\n            &quot;type&quot;: &quot;cmake&quot;,\n            &quot;label&quot;: &quot;CMake: clean rebuild&quot;,\n            &quot;command&quot;: &quot;cleanRebuild&quot;,\n            &quot;preset&quot;: &quot;${command:cmake.activeBuildPresetName}&quot;,\n            &quot;detail&quot;: &quot;CMake template clean rebuild task&quot;,\n            &quot;group&quot;: {\n                &quot;kind&quot;: &quot;build&quot;,\n                &quot;isDefault&quot;: true\n            }\n        },\n        {\n            &quot;label&quot;: &quot;\u90e8\u7f72&quot;,\n            &quot;type&quot;: &quot;cmake&quot;,\n            &quot;command&quot;: &quot;build&quot;,\n            &quot;targets&quot;: [\n                &quot;deploy&quot;\n            ],\n            &quot;detail&quot;: &quot;\u90e8\u7f72\u8f93\u51fa\u9879\u76ee\u5230\u76ee\u6807\u8bbe\u5907&quot;,\n            &quot;group&quot;: {\n                &quot;kind&quot;: &quot;build&quot;,\n                &quot;isDefault&quot;: true\n            },\n            &quot;dependsOn&quot;: [\n                &quot;CMake: build&quot;\n            ]\n        },\n        {\n            &quot;label&quot;: &quot;\u4ec5\u8fd0\u884c&quot;,\n            &quot;type&quot;: &quot;cmake&quot;,\n            &quot;command&quot;: &quot;build&quot;,\n            &quot;targets&quot;: [\n                &quot;run&quot;\n            ],\n            &quot;group&quot;: {\n                &quot;kind&quot;: &quot;build&quot;,\n                &quot;isDefault&quot;: true\n            }\n        },\n        {\n            &quot;label&quot;: &quot;\u4ec5\u8fd0\u884c (root)&quot;,\n            &quot;type&quot;: &quot;cmake&quot;,\n            &quot;command&quot;: &quot;build&quot;,\n            &quot;targets&quot;: [\n                &quot;run_as_root&quot;\n            ],\n            &quot;group&quot;: {\n                &quot;kind&quot;: &quot;build&quot;,\n                &quot;isDefault&quot;: true\n            }\n        },\n        {\n            &quot;label&quot;: &quot;\u6784\u5efa\u5e76\u8fd0\u884c&quot;,\n            &quot;type&quot;: &quot;cmake&quot;,\n            &quot;command&quot;: &quot;build&quot;,\n            &quot;targets&quot;: [\n                &quot;run&quot;\n            ],\n            &quot;group&quot;: {\n                &quot;kind&quot;: &quot;build&quot;,\n                &quot;isDefault&quot;: true\n            },\n            &quot;dependsOn&quot;: [\n                &quot;\u90e8\u7f72&quot;\n            ]\n        },\n        {\n            &quot;label&quot;: &quot;\u6784\u5efa\u5e76\u8fd0\u884c (root)&quot;,\n            &quot;type&quot;: &quot;cmake&quot;,\n            &quot;command&quot;: &quot;build&quot;,\n            &quot;targets&quot;: [\n                &quot;run_as_root&quot;\n            ],\n            &quot;group&quot;: {\n                &quot;kind&quot;: &quot;build&quot;,\n                &quot;isDefault&quot;: true\n            },\n            &quot;dependsOn&quot;: [\n                &quot;\u90e8\u7f72&quot;\n            ]\n        }\n    ],\n}<\/code><\/pre>\n<p>\u73b0\u5728\u5c31\u53ef\u4ee5\u5728\u7f16\u5199\u5b8c\u4ee3\u7801\u540e\uff0c\u901a\u8fc7\u6267\u884c\u4efb\u52a1\uff08\u5177\u4f53\u6765\u8bf4\uff0c<code>Task: Run Task<\/code>\u4e2d\u9009\u62e9\u914d\u7f6e\u7684\u4efb\u52a1)\uff0c\u5b9e\u73b0\u4ece\u6784\u5efa\u5230\u5728\u8bbe\u5907\u4e0a\u6267\u884celf\uff0c\u4e00\u6c14\u5475\u6210\u3002<\/p>\n<p>\u81f3\u4e8e\u914d\u7f6elaunch.json\uff0c\u65e0\u8bba\u662f\u8fd0\u884c\u8fd8\u662f\u8c03\u8bd5\uff0c\u90fd\u9700\u8981lldb\uff0c\u6240\u4ee5\u653e\u5230\u540e\u9762\u7684\u6b65\u9aa4\u8fdb\u884c<\/p>\n<h2>\u8c03\u8bd5<\/h2>\n<p>\u73b0\u5728\u53ef\u4ee5\u8fd0\u884c\uff0c\u5c31\u53ea\u5269\u4e0b\u8c03\u8bd5\u4e86\u3002<\/p>\n<p>\u5bf9\u4e8e\u8c03\u8bd5\u6765\u8bf4\uff0c\u65b0\u7248\u672c\u7684ndk\u53ea\u5269\u4e0blldb-server\uff0c\u5df2\u7ecf\u4e0d\u9002\u7528gdb\u4e86\uff0c\u6240\u4ee5\u8fd9\u91cc\u4e5f\u4f7f\u7528lldb-server\u3002<\/p>\n<h3>lldv-server\u542f\u505c<\/h3>\n<p>\u9996\u5148\u9700\u8981\u505a\u7684\u5c31\u662f\u7ba1\u7406lldb-server\u7684\u542f\u505c\u3002<\/p>\n<p>\u5bf9\u4e8e\u542f\u52a8\u6765\u8bf4\uff0c\u6574\u4f53\u5206\u4e3a\u4e24\u6b65\uff0c\u5373\u542f\u52a8\u548c\u7aef\u53e3\u8f6c\u53d1\u3002<\/p>\n<p>\u8f85\u52a9powershell\u811a\u672c\u6dfb\u52a0\u4e09\u4e2a\u53c2\u6570\uff0c\u540c\u6837\u6bcf\u4e2a\u529f\u80fd\u5355\u72ec\u914d\u7f6e<\/p>\n<pre><code class=\"language-shell\">[switch]$StartLldb,  # \u662f\u5426\u5f00\u542flldb-server\n[switch]$StopLldb,   # \u662f\u5426\u505c\u6b62lldb-server\n[int]$LldbPort=8086  # LLDB \u7aef\u53e3\uff0c\u9ed8\u8ba48086<\/code><\/pre>\n<p>\u5bf9\u4e8e\u505c\u6b62\u6765\u8bf4\uff0c\u65e0\u975e\u5c31\u662f\u68c0\u67e5ps\u4e2d\u6709\u6ca1\u6709lldb-server\uff0c\u6709\u7684\u8bdd\u5e72\u6389\u4ed6\u3002\u6dfb\u52a0\u4e00\u4e2a\u51fd\u6570<\/p>\n<pre><code class=\"language-shell\"># \u505c\u6b62LLDB\u670d\u52a1\u5668\u8fdb\u7a0b\nfunction Stop-LldbServer {\n    param (\n        [string]$AdbCmd,\n        [bool]$FailOnError = $true\n    )\n\n    # \u68c0\u67e5lldb-server\u662f\u5426\u5728\u8fd0\u884c\n    $lldbRunning = Invoke-Expression &quot;$AdbCmd shell &#039;ps | grep lldb-server | grep -v grep&#039;&quot;\n\n    if ($lldbRunning) {\n        Write-Host &quot;Terminating lldb-server processes...&quot;\n\n        # \u68c0\u67e5lldb-server\u8fdb\u7a0b\u662f\u5426\u5c5e\u4e8eroot\n        $isRootProcess = $lldbRunning -match &quot;root&quot;\n\n        # \u6839\u636e\u8fdb\u7a0b\u6240\u6709\u8005\u9009\u62e9\u5408\u9002\u7684\u6743\u9650\u8fdb\u884c\u7ec8\u6b62\n        if ($isRootProcess) {\n            Write-Host &quot;LLDB server is running as root, using root privileges to stop it...&quot;\n            # \u83b7\u53d6root\u6743\u9650\n            $rootMethod = Get-RootAccess -AdbCmd $AdbCmd\n\n            if (-not $rootMethod) {\n                if ($FailOnError) {\n                    Exit-WithError &quot;Device does not have root access. Cannot stop root LLDB server.&quot;\n                } else {\n                    Write-Warning &quot;Device does not have root access. Cannot stop root LLDB server.&quot;\n                    return $false\n                }\n            }\n\n            # \u4f7f\u7528root\u6743\u9650\u7ec8\u6b62\u8fdb\u7a0b\n            $command = &quot;killall lldb-server 2&gt;\/dev\/null || true&quot;\n            Invoke-RootCommand -AdbCmd $AdbCmd -RootMethod $rootMethod -Command $command\n        } else {\n            # \u666e\u901a\u6743\u9650\u7ec8\u6b62\u8fdb\u7a0b\n            Write-Host &quot;Stopping LLDB server with normal privileges...&quot;\n            Invoke-Expression &quot;$AdbCmd shell &#039;killall lldb-server 2&gt;\/dev\/null || true&#039;&quot;\n        }\n\n        # \u9a8c\u8bc1\u8fdb\u7a0b\u662f\u5426\u771f\u7684\u88ab\u7ec8\u6b62\n        Start-Sleep -Seconds 1\n        $stillRunning = Invoke-Expression &quot;$AdbCmd shell &#039;ps | grep lldb-server | grep -v grep&#039;&quot;\n        if ($stillRunning) {\n            if ($FailOnError) {\n                Exit-WithError &quot;Failed to stop lldb-server processes. Please restart your device or check permissions.&quot;\n            } else {\n                Write-Warning &quot;Failed to stop lldb-server processes. Please restart your device or check permissions.&quot;\n                return $false\n            }\n        } else {\n            Write-Host &quot;Successfully stopped lldb-server processes.&quot;\n        }\n    } else {\n        Write-Host &quot;No running lldb-server processes found.&quot;\n    }\n\n    return $true\n}<\/code><\/pre>\n<p>\u8fd9\u91cc\u9700\u8981\u6ce8\u610f\u7684\u662f\uff0c\u5982\u679clldb-server\u7684\u7528\u6237\u662froot\uff0c\u5219\u4e5f\u9700\u8981root\u7528\u6237\u5173\u95ed\u624d\u884c\u3002<\/p>\n<p>\u7136\u540e\u7ed9\u5173\u95ed\u53c2\u6570\u6dfb\u52a0\u4e00\u4e2a\u529f\u80fd<\/p>\n<pre><code class=\"language-shell\">if ($StopLldb) {\n    Write-Host &quot;Stopping LLDB server...&quot;\n\n    # \u505c\u6b62lldb-server\u8fdb\u7a0b\n    Stop-LldbServer -AdbCmd $adbCmd\n\n    # \u79fb\u9664\u7aef\u53e3\u8f6c\u53d1\n    Write-Host &quot;Removing port forwarding...&quot;\n    Invoke-Expression &quot;$adbCmd forward --remove tcp:$LldbPort 2&gt;\/dev\/null&quot; | Out-Null\n\n    if ($LASTEXITCODE -ne 0) {\n        Exit-WithError &quot;Failed to remove port forwarding.&quot; $LASTEXITCODE\n    }\n\n    Write-Host &quot;LLDB server successfully stopped.&quot;\n    exit 0\n}<\/code><\/pre>\n<p>\u5bf9\u4e8e\u5f00\u542f\u6765\u8bf4\uff0c\u5219\u9700\u8981\uff0c\u6839\u636e\u8def\u5f84\u627e\u5230lldb-server\uff0c\u5e76\u4f7f\u7528\u8bbe\u5b9a\u7684\u7aef\u53e3\u542f\u52a8\u5b83\u3002\u518d\u542f\u52a8\u4e4b\u524d\u4f1a\u9996\u5148\u68c0\u67e5\u8bbe\u5b9a\u7684\u7aef\u53e3\u662f\u5426\u88ab\u5360\u7528\uff0c\u5e76\u5c1d\u8bd5\u5220\u9664\u73b0\u6709\u7684\u7aef\u53e3\u8f6c\u53d1\uff0c\u6700\u7ec8\u542f\u52a8lldb\u3002<\/p>\n<p>\u9996\u5148\u9700\u8981\u4e00\u4e2a\u51fd\u6570\u6765\u68c0\u67e5\u8bbe\u5907\u7aef\u53e3\u548c\u672c\u5730pc\u7aef\u53e3\u662f\u5426\u88ab\u5360\u7528\uff0c\u662f\u5426\u53ef\u4ee5\u542f\u7528lldb-server\u548c\u8f6c\u53d1<\/p>\n<pre><code class=\"language-shell\"># \u68c0\u67e5\u7aef\u53e3\u662f\u5426\u88ab\u5360\u7528\nfunction Test-PortInUse {\n    param (\n        [string]$AdbCmd,\n        [int]$Port\n    )\n\n    # \u5728\u8bbe\u5907\u4e0a\u68c0\u67e5\u7aef\u53e3\u662f\u5426\u88ab\u5360\u7528\n    $netstatOutput = Invoke-Expression &quot;$AdbCmd shell &#039;netstat -tunla&#039;&quot;\n    $netstatCheck = Write-Output $netstatOutput | Select-String &#039;(?&lt;=\\s(?:\\[?[\\da-fA-F:\\.]+]?:|0\\.0\\.0\\.0:))$Port(?=\\s|$)&#039;\n\n    if ($netstatCheck) {\n        # \u7aef\u53e3\u88ab\u5360\u7528\n        return $true\n    }\n\n    # \u5728\u4e3b\u673a\u4e0a\u68c0\u67e5ADB\u8f6c\u53d1\u7684\u7aef\u53e3\u662f\u5426\u88ab\u5360\u7528\n    $portCheck = $null\n\n    # \u4f7f\u7528\u6b63\u5219\u8868\u8fbe\u5f0f\u5339\u914d\u672c\u5730\u7aef\u53e3\n    $portCheck = Invoke-Expression &#039;netstat -ano | Select-String -Pattern &quot;(?:TCP|UDP)\\s+.*\\b$Port\\b(?=\\s|$)&quot;&#039;\n\n    return ($null -ne $portCheck -and $portCheck -ne &quot;&quot;)\n}<\/code><\/pre>\n<p>\u56e0\u4e3alldb\u662f\u4e00\u4e2a\u963b\u585e\u8fdb\u7a0b\uff0c\u6240\u4ee5\u8fd8\u9700\u8981\u5229\u7528powershell\u7684Start-Job\u975e\u963b\u585e\u542f\u52a8lldb-server,\u6dfb\u52a0\u4e00\u4e2a\u51fd\u6570<\/p>\n<pre><code class=\"language-shell\"># \u4f7f\u7528PowerShell\u540e\u53f0\u4f5c\u4e1a\u975e\u963b\u585e\u542f\u52a8lldb-server\nfunction Start-LldbServer {\n    param (\n        [string]$AdbCmd,\n        [string]$DeviceTarget,\n        [int]$Port,\n        [bool]$UseRoot = $false\n    )\n\n    if ($UseRoot) {\n        # \u83b7\u53d6root\u6743\u9650\n        $rootMethod = Get-RootAccess -AdbCmd $AdbCmd\n\n        if (-not $rootMethod) {\n            Exit-WithError &quot;Device is not rooted. Cannot start lldb-server as root.&quot;\n        }\n\n        Write-Host &quot;Starting lldb-server with root privileges...&quot;\n        if ($rootMethod -eq &quot;su&quot;) {\n            # \u4f7f\u7528su\u8fd0\u884clldb-server\n            $command = &quot;su -c &#039;cd $DeviceTarget &amp;&amp; .\/lldb-server platform --server --listen *:$Port &gt; \/dev\/null 2&gt;&amp;1 &amp;&#039;&quot;\n            # \u4f7f\u7528PowerShell\u540e\u53f0\u4f5c\u4e1a\u542f\u52a8\n            $job = Start-Job -ScriptBlock { \n                param($cmd, $shellcmd)\n                &amp; cmd \/c &quot;$cmd shell `&quot;$shellcmd`&quot;&quot;\n            } -ArgumentList $AdbCmd, $command\n        } else {\n            # \u4f7f\u7528adb root\u8fd0\u884c\n            $command = &quot;cd $DeviceTarget &amp;&amp; .\/lldb-server platform --server --listen *:$Port &gt; \/dev\/null 2&gt;&amp;1 &amp;&quot;\n            # \u4f7f\u7528PowerShell\u540e\u53f0\u4f5c\u4e1a\u542f\u52a8\n            $job = Start-Job -ScriptBlock { \n                param($cmd, $shellcmd)\n                &amp; cmd \/c &quot;$cmd shell `&quot;$shellcmd`&quot;&quot;\n            } -ArgumentList $AdbCmd, $command\n        }\n    } else {\n        # \u666e\u901a\u6743\u9650\u8fd0\u884c\n        Write-Host &quot;Starting lldb-server with normal privileges...&quot;\n        $command = &quot;cd $DeviceTarget &amp;&amp; .\/lldb-server platform --server --listen *:$Port &gt; \/dev\/null 2&gt;&amp;1 &amp;&quot;\n        # \u4f7f\u7528PowerShell\u540e\u53f0\u4f5c\u4e1a\u542f\u52a8\n        $job = Start-Job -ScriptBlock { \n            param($cmd, $shellcmd)\n            &amp; cmd \/c &quot;$cmd shell `&quot;$shellcmd`&quot;&quot;\n        } -ArgumentList $AdbCmd, $command\n    }\n\n    # \u7ed9lldb-server\u542f\u52a8\u4e00\u70b9\u65f6\u95f4\n    Start-Sleep -Seconds 1\n\n    # \u68c0\u67e5\u4f5c\u4e1a\u72b6\u6001\u5e76\u6e05\u7406\n    if (Get-Job -Id $job.Id -ErrorAction SilentlyContinue) {\n        Write-Host &quot;Cleaning up background job...&quot;\n        Remove-Job -Id $job.Id -Force -ErrorAction SilentlyContinue\n    }\n}<\/code><\/pre>\n<p>\u6700\u540e\u5b8c\u6210lldb\u542f\u52a8\u529f\u80fd<\/p>\n<pre><code class=\"language-shell\">if ($StartLldb) {\n    Write-Host &quot;Setting up LLDB server...&quot;\n\n    # \u68c0\u67e5\u8bbe\u5907\u4e0a\u662f\u5426\u5b58\u5728lldb\u670d\u52a1\u5668\n    $lldbPath = &quot;$DeviceTarget\/lldb-server&quot;\n    $lldbCheck = Invoke-Expression &quot;$adbCmd shell &#039;ls $lldbPath 2&gt;\/dev\/null&#039;&quot;\n    $lldbExists = ($LASTEXITCODE -eq 0)\n\n    if (-not $lldbExists) {\n        Exit-WithError &quot;lldb-server not found at $lldbPath on device. Please push it first.&quot;\n    }\n\n    # \u7aef\u53e3\u672a\u88ab\u5360\u7528\uff0c\u5c1d\u8bd5\u79fb\u9664\u73b0\u6709\u7684\u7aef\u53e3\u8f6c\u53d1\uff08\u5982\u679c\u5b58\u5728\uff09\n    Write-Host &quot;Removing any existing port forwarding...&quot;\n    try {\n        Invoke-Expression &quot;$adbCmd forward --remove tcp:$LldbPort 2&gt;&amp;1&quot; | Out-Null\n    } catch {\n        # \u5ffd\u7565\u9519\u8bef\uff0c\u56e0\u4e3a\u53ef\u80fd\u6ca1\u6709\u73b0\u6709\u7684\u7aef\u53e3\u8f6c\u53d1\n    }\n\n    # \u68c0\u67e5\u8bbe\u5907\u4e0a\u7aef\u53e3\u662f\u5426\u88ab\u5360\u7528\n    Write-Host &quot;Checking if port $LldbPort is available on device...&quot;\n    $devicePortInUse = Test-PortInUse -AdbCmd $adbCmd -Port $LldbPort\n\n    if ($devicePortInUse) {\n        Exit-WithError &quot;Port $LldbPort is already in use on the device. Cannot start lldb-server. Please choose a different port or stop the process using this port.&quot;\n    }\n\n    # \u8bbe\u7f6e\u7aef\u53e3\u8f6c\u53d1\n    Write-Host &quot;Setting up port forwarding from localhost:$LldbPort to device:$LldbPort...&quot;\n    Invoke-Expression &quot;$adbCmd forward tcp:$LldbPort tcp:$LldbPort&quot;\n\n    if ($LASTEXITCODE -ne 0) {\n        Exit-WithError &quot;Failed to set up port forwarding.&quot; $LASTEXITCODE\n    }\n\n    # \u4f7f\u7528\u975e\u963b\u585e\u65b9\u5f0f\u542f\u52a8lldb-server\n    Start-LldbServer -AdbCmd $adbCmd -DeviceTarget $DeviceTarget -Port $LldbPort -UseRoot $Root\n\n    # \u68c0\u67e5lldb-server\u662f\u5426\u6210\u529f\u542f\u52a8\n    Start-Sleep -Seconds 1\n    $lldbRunning = Invoke-Expression &quot;$adbCmd shell &#039;ps | grep lldb-server | grep -v grep&#039;&quot;\n\n    if (-not $lldbRunning) {\n        Exit-WithError &quot;lldb-server failed to start properly.&quot;\n    }\n\n    Write-Host &quot;LLDB server successfully started on port $LldbPort&quot;\n    Write-Host &quot;Port forwarding established: localhost:$LldbPort -&gt; device:$LldbPort&quot;\n    exit 0\n}<\/code><\/pre>\n<p>\u7ed9CMakeList\u6dfb\u52a0\u4e0a\u6700\u786c\u7684target\uff08\u5176\u5b9e\u4e0d\u52a0\u4e5f\u884c\uff0c\u4e4b\u524d\u662f\u4e3a\u4e86\u65b9\u4fbf\u5904\u7406\u7f16\u8bd1\u8f93\u51fa\u7269\u8def\u5f84\uff0c\u4f46\u662f\u501f\u52a9CMake Tool\u63d2\u4ef6\u6dfb\u52a0task\u66f4\u65b9\u4fbf\uff09\uff0c\u5e76\u6dfb\u52a0task\u5373\u53ef\uff0c\u5982\u4e0b<\/p>\n<pre><code class=\"language-cmake\"># \u542f\u52a8lldb-server\nadd_custom_target(start_lldb\n    COMMAND ${SCRIPT_CMD} ${SCRIPT_ARGS} &quot;${CMAKE_CURRENT_SOURCE_DIR}\/tools\/deploy${SCRIPT_EXT}&quot; \n            &quot;&quot; \n            &quot;\/data\/local\/tmp&quot; \n            &quot;&quot; \n            &quot;-StartLldb&quot;\n    COMMENT &quot;Starting LLDB server on device&quot;\n    VERBATIM\n)\n\n# root\u6743\u9650\u542f\u52a8lldb-server\nadd_custom_target(start_lldb_root\n    COMMAND ${SCRIPT_CMD} ${SCRIPT_ARGS} &quot;${CMAKE_CURRENT_SOURCE_DIR}\/tools\/deploy${SCRIPT_EXT}&quot; \n            &quot;&quot; \n            &quot;\/data\/local\/tmp&quot; \n            &quot;&quot; \n            &quot;-StartLldb&quot;\n            &quot;-Root&quot;\n    COMMENT &quot;Starting LLDB server with root privileges&quot;\n    VERBATIM\n)\n\n# \u505c\u6b62lldb-server\nadd_custom_target(stop_lldb\n    COMMAND ${SCRIPT_CMD} ${SCRIPT_ARGS} &quot;${CMAKE_CURRENT_SOURCE_DIR}\/tools\/deploy${SCRIPT_EXT}&quot; \n            &quot;&quot; \n            &quot;\/data\/local\/tmp&quot; \n            &quot;&quot; \n            &quot;-StopLldb&quot;\n    COMMENT &quot;Stopping LLDB server on device&quot;\n    VERBATIM\n)<\/code><\/pre>\n<pre><code class=\"language-json\">        {\n            &quot;label&quot;: &quot;\u542f\u52a8LLDB\u670d\u52a1\u5668&quot;,\n            &quot;type&quot;: &quot;cmake&quot;,\n            &quot;command&quot;: &quot;build&quot;,\n            &quot;targets&quot;: [\n                &quot;start_lldb&quot;\n            ],\n            &quot;group&quot;: &quot;build&quot;,\n            &quot;detail&quot;: &quot;\u542f\u52a8\u8bbe\u5907\u4e0a\u7684lldb\u670d\u52a1\u5668&quot;\n        },\n        {\n            &quot;label&quot;: &quot;\u542f\u52a8LLDB\u670d\u52a1\u5668 (Root)&quot;,\n            &quot;type&quot;: &quot;cmake&quot;,\n            &quot;command&quot;: &quot;build&quot;,\n            &quot;targets&quot;: [\n                &quot;start_lldb_root&quot;\n            ],\n            &quot;group&quot;: &quot;build&quot;,\n            &quot;detail&quot;: &quot;root\u6743\u9650\u4e0b\u542f\u52a8\u8bbe\u5907\u4e0a\u7684lldb\u670d\u52a1\u5668&quot;\n        },\n        {\n            &quot;label&quot;: &quot;\u505c\u6b62LLDB\u670d\u52a1\u5668&quot;,\n            &quot;type&quot;: &quot;cmake&quot;,\n            &quot;command&quot;: &quot;build&quot;,\n            &quot;targets&quot;: [\n                &quot;stop_lldb&quot;\n            ],\n            &quot;group&quot;: &quot;build&quot;,\n            &quot;detail&quot;: &quot;\u505c\u6b62\u8bbe\u5907\u4e0a\u7684LLDB\u670d\u52a1\u5668&quot;\n        }<\/code><\/pre>\n<h3>\u542f\u52a8\u548c\u8c03\u8bd5<\/h3>\n<p>\u5230\u8fd9\u4e00\u6b65\u7ec8\u4e8e\u5f00\u59cb\u914d\u7f6elaunch\u4e86\u3002\u56e0\u4e3a\u4f7f\u7528\u7684\u662flldb\uff0c\u6240\u4ee5\u8fd9\u91cc\u4f7f\u7528\u63d2\u4ef6codeLLDB\u3002<\/p>\n<p>\u56e0\u4e3a\u76ee\u524d\u8fd9\u79cd\u65b9\u6848\u7684\u8fd0\u884c\u662f\u57fa\u4e8ecmake\u7684target\u7684\uff0c\u5e76\u4e14launch\u4e5f\u4e0d\u652f\u6301shell\u547d\u4ee4\u6267\u884c\uff0c\u4e5f\u6ca1\u627e\u5230\u529e\u6cd5\u521b\u5efa\u4e00\u4e2a\u7a7alaunch\u4f7f\u5176\u53ea\u6267\u884cTASK\uff0c\u6240\u4ee5\u8fd9\u91cc\u5c31\u4e0d\u521b\u5efa\u6267\u884c\u7684launch\u4e86\uff0c\u8fd9\u4e2a\u4ea4\u7ed9\u63d2\u4ef6\u505a\u66f4\u597d\u3002<\/p>\n<p>\u8fd9\u91cc\u9488\u5bf9\u8c03\u8bd5\uff0c\u9700\u8981\u6dfb\u52a0\u4e00\u4e2atask\u6765\u51c6\u5907lldb\u73af\u5883\u3002\u51c6\u786e\u6765\u8bf4\u5c31\u662f\u542f\u52a8lldb-server\uff0c\u4ee5\u53ca\u7f16\u8bd1\u90e8\u7f72\u597d\u4ea7\u7269\u3002<\/p>\n<p>\u6dfb\u52a0\u4e24\u4e2atask\uff0c\u5206\u522b\u6267\u884c\u6784\u5efa\u3001\u90e8\u7f72\u3001lldb-server\u7684\u505c\u6b62\u548c\u542f\u52a8\uff0c\u975eroot\u548croot\u521b\u5efa\u4e24\u4e2a<\/p>\n<pre><code class=\"language-json\">        {\n            &quot;label&quot;: &quot;\u8fd0\u884c\u8c03\u8bd5\u51c6\u5907&quot;,\n            &quot;dependsOrder&quot;: &quot;sequence&quot;,\n            &quot;dependsOn&quot;: [\n                &quot;CMake: build&quot;,\n                &quot;\u90e8\u7f72&quot;,\n                &quot;\u505c\u6b62LLDB\u670d\u52a1\u5668&quot;,\n                &quot;\u542f\u52a8LLDB\u670d\u52a1\u5668&quot;\n            ],\n            &quot;group&quot;: {\n                &quot;kind&quot;: &quot;build&quot;,\n                &quot;isDefault&quot;: true\n            },\n            &quot;presentation&quot;: {\n                &quot;reveal&quot;: &quot;silent&quot;,\n                &quot;revealProblems&quot;: &quot;onProblem&quot;,\n                &quot;close&quot;: true\n            }\n        },\n        {\n            &quot;label&quot;: &quot;\u8fd0\u884c\u8c03\u8bd5\u51c6\u5907 (Root)&quot;,\n            &quot;dependsOrder&quot;: &quot;sequence&quot;,\n            &quot;dependsOn&quot;: [\n                &quot;CMake: build&quot;,\n                &quot;\u90e8\u7f72&quot;,\n                &quot;\u505c\u6b62LLDB\u670d\u52a1\u5668&quot;,\n                &quot;\u542f\u52a8LLDB\u670d\u52a1\u5668 (Root)&quot;\n            ],\n            &quot;group&quot;: &quot;build&quot;,\n            &quot;presentation&quot;: {\n                &quot;reveal&quot;: &quot;silent&quot;,\n                &quot;revealProblems&quot;: &quot;onProblem&quot;,\n                &quot;close&quot;: true\n            }\n        }<\/code><\/pre>\n<p>\u7136\u540e\u5229\u7528codelldb\u63d2\u4ef6\u521b\u5efalaunch\uff0c\u5177\u4f53\u5982\u4e0b<\/p>\n<pre><code class=\"language-json\">{\n    &quot;version&quot;: &quot;0.2.0&quot;,\n    &quot;configurations&quot;: [\n        {\n            &quot;name&quot;: &quot;\u8fdc\u7a0b\u8c03\u8bd5&quot;,\n            &quot;type&quot;: &quot;lldb&quot;,\n            &quot;request&quot;: &quot;launch&quot;,\n            &quot;program&quot;: &quot;${command:cmake.launchTargetPath}&quot;,\n            &quot;cwd&quot;: &quot;\/data\/local\/tmp&quot;,\n            &quot;initCommands&quot;: [\n                &quot;platform select remote-android&quot;,\n                &quot;platform connect connect:\/\/localhost:28086&quot;,\n                &quot;platform settings -w \/data\/local\/tmp&quot;,\n                &quot;settings set target.inherit-env false&quot;, \/\/ \u7981\u7528\u7ee7\u627f\u73af\u5883\u53d8\u91cf\n            ],\n            &quot;stopOnEntry&quot;: false,\n            &quot;preLaunchTask&quot;: &quot;\u8fd0\u884c\u8c03\u8bd5\u51c6\u5907&quot;,\n            &quot;sourceMap&quot;: {\n                &quot;\/data\/local\/tmp&quot;: &quot;${workspaceFolder}&quot;\n            },\n            &quot;preTerminateCommands&quot;: [\n                &quot;process kill&quot;,  \/\/ \u786e\u4fdd\u8fdb\u7a0b\u88ab\u6b63\u786e\u7ec8\u6b62\n                &quot;process detach&quot;,\n                &quot;platform disconnect connect:\/\/localhost:28086&quot;\n            ],\n            &quot;postDebugTask&quot;: &quot;\u505c\u6b62LLDB\u670d\u52a1\u5668&quot;,\n            &quot;presentation&quot;: {\n                &quot;hidden&quot;: false,\n                &quot;group&quot;: &quot;\u8c03\u8bd5&quot;,\n                &quot;order&quot;: 1\n            }\n        },\n        {\n            &quot;name&quot;: &quot;\u8fdc\u7a0b\u8c03\u8bd5 (Root)&quot;,\n            &quot;type&quot;: &quot;lldb&quot;,\n            &quot;request&quot;: &quot;launch&quot;,\n            &quot;program&quot;: &quot;${command:cmake.launchTargetPath}&quot;,\n            &quot;cwd&quot;: &quot;\/data\/local\/tmp&quot;,\n            &quot;initCommands&quot;: [\n                &quot;platform select remote-android&quot;,\n                &quot;platform connect connect:\/\/localhost:28086&quot;,\n                &quot;platform settings -w \/data\/local\/tmp&quot;,\n                &quot;settings set target.inherit-env false&quot; \/\/ \u7981\u7528\u7ee7\u627f\u73af\u5883\u53d8\u91cf\n            ],\n            &quot;stopOnEntry&quot;: false,\n            &quot;preLaunchTask&quot;: &quot;\u8fd0\u884c\u8c03\u8bd5\u51c6\u5907 (Root)&quot;,\n            &quot;sourceMap&quot;: {\n                &quot;\/data\/local\/tmp&quot;: &quot;${workspaceFolder}&quot;\n            },\n            &quot;preTerminateCommands&quot;: [\n                &quot;process kill&quot;,  \/\/ \u786e\u4fdd\u8fdb\u7a0b\u88ab\u6b63\u786e\u7ec8\u6b62\n                &quot;process detach&quot;,\n                &quot;platform disconnect connect:\/\/localhost:28086&quot;\n            ],\n            &quot;postDebugTask&quot;: &quot;\u505c\u6b62LLDB\u670d\u52a1\u5668&quot;,\n            &quot;presentation&quot;: {\n                &quot;hidden&quot;: false,\n                &quot;group&quot;: &quot;\u8c03\u8bd5&quot;,\n                &quot;order&quot;: 2\n            }\n        }\n    ]\n}<\/code><\/pre>\n<p>\u9700\u8981\u6ce8\u610f\u7684\u662f\uff0ccwd\u9700\u8981\u586b\u5199\u7684\u662f\u76ee\u6807\u8bbe\u5907\u7684\u8def\u5f84\uff0c\u800c\u4e0d\u662f\u672c\u5730\u7684\u3002\u5e76\u4e14\u53d7\u5230codelldb\u63d2\u4ef6\u9650\u5236\uff0c\u5176attach\u4f3c\u4e4e\u53ea\u80fd\u9009\u62e9\u5f53\u524d\u7535\u8111\u672c\u5730\u7684pid\uff0c\u6240\u4ee5\u5c31\u53ea\u6dfb\u52a0\u4e86\u8c03\u8bd5\u3002<\/p>\n<p>\u81f3\u6b64\uff0c\u53ef\u4ee5\u5728vscode\u4e2d\u6109\u5feb\u7684\u5f00\u53d1Android\u7684elf\u4e86\u3002<\/p>\n<h2>\u540e\u8bb0<\/h2>\n<p>\u5b8c\u6574\u73af\u5883\u89c1<a href=\"https:\/\/github.com\/WangONC\/VSCode-Android-ELF-Template\" title=\"WangONC \/ VSCode-Android-ELF-Template\">WangONC \/ VSCode-Android-ELF-Template<\/a><\/p>\n<p>\u914d\u7f6e\u5230\u6700\u540e\u53d1\u73b0\uff0c\u914d\u7f6e\u6587\u4ef6\u7684\u5c40\u9650\u6027\u5f88\u5927\uff0c\u60f3\u53d8\u5f97\u66f4\u597d\u7528\u4e00\u70b9\uff0c\u81ea\u52a8\u5316\u7684\u914d\u7f6e\u66f4\u591a\u4e1c\u897f\u975e\u5e38\u56f0\u96be\uff0c\u6240\u4ee5\u6bd4\u8f83\u597d\u7684\u9009\u62e9\u8fd8\u662f\uff0c\u76f4\u63a5\u5f00\u53d1\u4e00\u4e2a\u63d2\u4ef6&#8230;\u5f53\u4f5c\u4e0b\u4e00\u6b65\u7684\u76ee\u6807\u5427<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u524d\u8a00 \u6700\u8fd1\u63a5\u5230\u4e86\u4e00\u4e2a\u9700\u6c42\uff0c\u9700\u8981\u5f00\u53d1\u4e00\u4e2aAndroid\u7684elf\u7684demo\u3002\u5728Android Studio\u4e0a\u6298\u817e\u4e86 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[10,11,70],"tags":[42,65,123,124,122],"series":[],"class_list":["post-7960","post","type-post","status-publish","format-standard","hentry","category-development","category-toss-record","category-scripts-and-tools","tag-android","tag-c","tag-elf","tag-lldb","tag-vscode"],"_links":{"self":[{"href":"https:\/\/www.wangonc.com\/index.php\/wp-json\/wp\/v2\/posts\/7960","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.wangonc.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.wangonc.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.wangonc.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.wangonc.com\/index.php\/wp-json\/wp\/v2\/comments?post=7960"}],"version-history":[{"count":4,"href":"https:\/\/www.wangonc.com\/index.php\/wp-json\/wp\/v2\/posts\/7960\/revisions"}],"predecessor-version":[{"id":7967,"href":"https:\/\/www.wangonc.com\/index.php\/wp-json\/wp\/v2\/posts\/7960\/revisions\/7967"}],"wp:attachment":[{"href":"https:\/\/www.wangonc.com\/index.php\/wp-json\/wp\/v2\/media?parent=7960"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.wangonc.com\/index.php\/wp-json\/wp\/v2\/categories?post=7960"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.wangonc.com\/index.php\/wp-json\/wp\/v2\/tags?post=7960"},{"taxonomy":"series","embeddable":true,"href":"https:\/\/www.wangonc.com\/index.php\/wp-json\/wp\/v2\/series?post=7960"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}