{"id":351,"date":"2025-02-07T14:53:53","date_gmt":"2025-02-07T06:53:53","guid":{"rendered":"https:\/\/blog.king011.com\/?p=351"},"modified":"2025-02-07T15:35:19","modified_gmt":"2025-02-07T07:35:19","slug":"%e4%bd%bf%e7%94%a8-appimage-%e6%89%93%e5%8c%85-flutter","status":"publish","type":"post","link":"https:\/\/blog.king011.com\/?p=351","title":{"rendered":"\u4f7f\u7528 AppImage \u6253\u5305 flutter"},"content":{"rendered":"\n<p>\u6b64\u6587\u7e3d\u7d50\u4e86\u6211\u5982\u4f55\u5c07 flutter \u4f7f\u7528 AppImage \u6253\u5305\u767c\u4f48\u7684\u7d93\u904e\uff0c\u96d6\u7136\u662f\u91dd\u5c0d\u7684 flutter \u7a0b\u5e8f\uff0c\u4f46\u5b83\u61c9\u8a72\u4e5f\u80fd\u9069\u7528\u65bc\u5176\u5b83\u6709\u985e\u4f3c\u554f\u984c\u7684\u7a0b\u5e8f\u6253\u5305<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"#package\">\u6253\u5305\u5de5\u5177\u9078\u64c7<\/a><\/li>\n\n\n\n<li><a href=\"#AppImage\">AppImage \u5b98\u65b9\u65b9\u6848<\/a><\/li>\n\n\n\n<li><a href=\"#glibc\">glibc<\/a><\/li>\n\n\n\n<li><a href=\"#ld\">ld-linux.so<\/a><\/li>\n\n\n\n<li><a href=\"#patchelf\">patchelf<\/a><\/li>\n\n\n\n<li><a href=\"#bash\">\u81ea\u52d5\u5316\u8173\u672c<\/a><\/li>\n<\/ul>\n\n\n\n<h1 class=\"wp-block-heading\" id=\"package\">\u6253\u5305\u5de5\u5177\u9078\u64c7<\/h1>\n\n\n\n<p>\u524d\u6bb5\u6642\u9593\u672c\u55b5\u958b\u767c\u4e86\u4e00\u500b android \u8996\u983b\u64ad\u653e\u5668\uff0c\u56e0\u7232\u662f\u4f7f\u7528 flutter \u958b\u767c\u7684\u6240\u4ee5\u6253\u7b97\u79fb\u690d\u5230 linux \u4f7f\u7528\u3002\u7232\u4e86\u7c21\u55ae\u4e0d\u60f3\u4ee5\u7cfb\u7d71\u5305\u7ba1\u7406\u5668\u5206\u767c(\u592a\u591a\u4e0d\u540c\u767c\u884c\u5e73\u81fa\u4e86\uff0c\u5373\u4f7f\u672c\u55b5\u672c\u5730\u4e5f\u56e0\u7232\u65b0\u8001\u8a2d\u5099\u800c\u5b58\u5728\u591a\u500b\u4e0d\u540c\u7248\u672c\u7684 ubuntu\uff0c \u5b83\u5011\u8edf\u4ef6\u5305\u4f9d\u8cf4\u4e26\u4e0d\u517c\u5bb9)\uff0c\u63db\u4ee5\u8de8\u591a\u7a2e\u767c\u4f48\u5e73\u81fa\u7684\u6253\u5305\u65b9\u5f0f\u4f86\u5206\u767c\uff0c\u65bc\u662f\u9762\u81e8\u4e86\u4e09\u500b\u76ee\u524d\u4e3b\u6d41\u7684\u9078\u64c7\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>appimage<\/li>\n\n\n\n<li>flatpak<\/li>\n\n\n\n<li>snap<\/li>\n<\/ol>\n\n\n\n<p>\u8003\u616e\u5230 snap \u548c flatpak \u90fd\u4ee5\u6c99\u7bb1\u6a21\u5f0f\u904b\u884c\uff0c\u8abf\u7528\u986f\u5361\u89e3\u78bc\u8996\u983b\u53ef\u80fd\u6703\u6bd4\u8f03\u9ebb\u7169\uff0c\u65bc\u662f\u679c\u65b7\u9078\u64c7\u4e86 appimage<\/p>\n\n\n\n<h1 class=\"wp-block-heading\" id=\"AppImage\">AppImage \u5b98\u65b9\u65b9\u6848<\/h1>\n\n\n\n<p>\u9996\u5148\u76f4\u63a5\u4f7f\u7528 AppImage <a href=\"https:\/\/appimage-builder.readthedocs.io\/en\/latest\/examples\/flutter.html\">\u5b98\u65b9\u63d0\u4f9b\u7684\u65b9\u6848<\/a> \u9032\u884c\u4e86\u6253\u5305\uff0c\u5f88\u626f\uff0c\u64cd\u4f5c\u5f88\u9ebb\u7169\u4e0b\u8f09\u4e86\u4e00\u5806\u6771\u897f\u7136\u5f8c\u6700\u5f8c\u5931\u6557\u4e86<\/p>\n\n\n\n<p>\u56e0\u7232\u5b83\u6c92\u6709\u6253\u5305 glibc\uff0c\u6240\u4ee5\u7576\u6211\u5728\u4e00\u500b\u548c\u7de8\u8b6f\u74b0\u5883 glibc \u7248\u672c\u4e0d\u517c\u5bb9\u7684\u7cfb\u7d71\u4e0a\u904b\u884c\u662f\uff0c\u76f4\u63a5\u5831\u932f\u4e86\u7a0b\u5e8f\u7121\u6cd5\u5553\u52d5\uff0c\u63a7\u5236\u6aaf\u6253\u5370\u4e86\u7f3a\u5c11\u67d0\u4e9b glibc \u5eab\u6a94\u6848\u5f8c\u5c31\u9000\u51fa\u4e86\uff0c\u5927\u6982\u5c31\u662f\u985e\u4f3c\u4e0b\u9762\u9019\u6a23\u7684\u932f\u8aa4\u4fe1\u606f<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>.\/XXX: \/lib\/x86_64-linux-gnu\/libc.so.6: version `GLIBC_2.34' not found (required by .\/XXX)<\/code><\/pre>\n\n\n\n<h1 class=\"wp-block-heading\" id=\"glibc\">glibc<\/h1>\n\n\n\n<p>\u65e2\u7136\u662f glibc \u7684\u554f\u984c\u90a3\u7c21\u55ae\uff0c\u65bc\u662f\u6211\u76f4\u63a5\u5beb\u4e86\u500b\u8173\u672c\uff0c\u4f7f\u7528 ldd \u905e\u6b78\u53bb\u628a\u6240\u6709\u4f9d\u8cf4\u7684\u52d5\u614b\u5eab\u4e00\u8d77\u6253\u5305\u4e0d\u5c31\u597d\u4e86\u3002\u7576\u7136\u65e2\u7136\u662f\u6240\u6709\u4e5f\u81ea\u7136\u5305\u542b\u4e86 glibc<\/p>\n\n\n\n<p>\u7576\u5b8c\u6210\u5f8c\u767c\u73fe\u6c92\u6709\u4efb\u4f55\u932f\u8aa4\u6253\u5370\uff0c\u7a0b\u5e8f\u76f4\u63a5\u5d29\u6f70\u4e86\u3002\u901a\u904e\u548c gemini \u7684\u63a2\u8a0e\uff0c\u767c\u73fe\u61c9\u8a72\u662f ld-linux.so \u7684\u554f\u984c\uff0clinux \u4f7f\u7528 ld-linux.so \u4f86\u52a0\u8f09\u52d5\u614b\u5eab\uff08\u5c0d\u65bc x64 \u7cfb\u7d71\u4f86\u8aaa\u5b83\u901a\u5e38\u662f <strong>\/lib\/x86_64-linux-gnu\/ld-linux-x86-64.so.2<\/strong>\uff09<\/p>\n\n\n\n<h1 class=\"wp-block-heading\" id=\"ld\">ld-linux.so<\/h1>\n\n\n\n<p>\u4e92\u4e0d\u517c\u5bb9\u7684 ld-linux.so \u7121\u6cd5\u6b63\u78ba\u52a0\u8f09\u4e0d\u517c\u5bb9\u7684 \u52d5\u614b\u5eab\uff0c\u90a3\u592a\u7c21\u55ae\u4e86\uff0c\u628a ld-linux.so \u4e5f\u6253\u5305\u5c31\u597d\u4e86\uff0c\u4f46\u662f\u52d5\u614b\u5eab\u641c\u7d22\u8def\u5f91\u53ef\u4ee5\u901a\u904e LD_LIBRARY_PATH \u74b0\u5883\u8b8a\u91cf\u4f86\u8a2d\u7f6e\uff0c\u4f46 gemini \u537b\u544a\u8a34\u672c\u55b5\u7121\u6cd5\u6307\u5b9a\u4f7f\u7528\u7279\u5b9a ld-linux.so \u4f86\u52a0\u8f09\u52d5\u614b\u5eab<\/p>\n\n\n\n<p>\u65bc\u662f\u9084\u662f google \u5f8c\uff0c\u5728 github \u4e0a\u770b\u5230\u985e\u4f3c\u9700\u6c42\uff0c\u4ed6\u5979\u5b83\u5011\u89e3\u6c7a\u65b9\u6cd5\u662f\u76f4\u63a5\u4f7f\u7528  ld-linux.so \u53bb\u57f7\u884c\u7a0b\u5e8f<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><strong>\/lib\/x86_64-linux-gnu\/ld-linux-x86-64.so.2<\/strong> your_commnad<\/code><\/pre>\n\n\n\n<p>\u539f\u4f86\u4e0d\u9700\u8981\u6307\u5b9a\u53ef\u4ee5\u76f4\u63a5\u4f7f\u7528\u5b83\u4f86\u57f7\u884c\uff0c\u90a3\u99ac\u4e0a\u8a66\u8a66\u770b\uff0c\u7d50\u679c flutter \u8fd4\u56de\u4e86\u4e0b\u8ff0\u932f\u8aa4<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>embedder.cc (1613): 'FlutterEngineCreateAOTData' returned 'kInvalidArguments'. Invalid ELF path specified.<\/code><\/pre>\n\n\n\n<p>\u96d6\u7136\u7a97\u53e3\u5553\u52d5\u4e86\uff0c\u4f46\u521d\u59cb\u5316\u5931\u6557\u4e00\u76f4\u5c31\u4e00\u500b\u9ed1\u8272\u7a97\u53e3\u6c92\u4ec0\u9ebc\u7528\u3002\u4e0d\u904e\u672c\u55b5\u6e2c\u8a66\u4e86\u4e0b\u6253\u5305 bash \u662f\u53ef\u4ee5\u6b63\u5e38\u904b\u884c\u7684\uff0c\u61c9\u8a72\u53ea\u662fflutter \u4e0d\u80fd\u4f7f\u7528 ld-linux.so \u53bb\u76f4\u63a5\u57f7\u884c\u3002\u5176\u5b83\u7a0b\u5e8f\u8981\u6253\u5305 glibc \u4e0d\u59a8\u5148\u8a66\u4e0b\u76f4\u63a5\u6253\u5305 ld-linux.so \u4e26\u4f7f\u7528 ld-linux.so \u57f7\u884c\u770b\u770b\u80fd\u5426\u6210\u529f<\/p>\n\n\n\n<h1 class=\"wp-block-heading\" id=\"patchelf\">patchelf<\/h1>\n\n\n\n<p>gemini \u9084\u662f\u7121\u80fd\u7232\u529b\u53ef\u80fd\u672c\u55b5\u554f\u984c\u6c92\u554f\u5c0d\u5427\u3002\u65bc\u662f\u518d\u6b21google \u767c\u73fe\u4e86\uff0c\u539f\u4f86 elf \u6a94\u6848(linux \u4e8c\u9032\u5236\u57f7\u884c\u6a94\u6848) \u6703\u6307\u5b9a ld-linux.so \u7684\u8def\u5f91\uff0c\u7de8\u8b6f\u6642\u6307\u5b9a\u5c31\u597d\u4e86\uff0c\u53e6\u5916 <a href=\"https:\/\/github.com\/NixOS\/patchelf\">patchelf<\/a> \u9019\u500b\u7a0b\u5e8f\u53ef\u4ee5\u4fee\u88dc\u5df2\u7d93\u7de8\u8b6f\u597d\u7684 elf \u7684 ld-linux.so \u52a0\u8f09\u8def\u5f91\uff0c\u5617\u8a66\u4e86\u4e0b\u679c\u7136\u904b\u884c\u6210\u529f\u4e86<\/p>\n\n\n\n<p>\u90a3\u554f\u984c\u5c31\u89e3\u6c7a\u4e86<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u9996\u5148\u6253\u5305\u6240\u6709\u4f9d\u8cf4<\/li>\n\n\n\n<li>\u4f7f\u7528 patchelf \u4fee\u88dc flutter elf \u6a94\u6848\u53bb\u52a0\u8f09\u6211\u5011\u6e96\u5099\u597d\u7684 ld-linux.so<\/li>\n\n\n\n<li>AppRun \u5c07\u6253\u5305\u7684 ld-linux.so \u91cb\u653e\u5230 \/tmp\/ \u4e0b\u9762\u53bb<\/li>\n<\/ol>\n\n\n\n<p>AppImage \u904b\u884c\u6642\u7684\u8def\u5f91\u662f\u96a8\u6a5f\u7684\u7136\u800c patchelf \u4fee\u88dc\u7684 ld-linux.so \u8def\u5f91\u5fc5\u9808\u662f\u7d55\u5c0d\u8def\u5f91\uff0c\u6545\u6b65\u9a5f3\u4e2d\u53ea\u80fd\u5c07\u5176\u91cb\u653e\u5230 \/tmp\/ \u4e0b\uff0c\u9078\u64c7 tmp \u662f\u56e0\u7232\u9019\u500b\u8def\u5f91\u6240\u6709\u4eba\u90fd\u6709\u8b80\u5beb\u6b0a\u9650<\/p>\n\n\n\n<p>\u53e6\u5916\u7232\u4e86\u512a\u5316\uff0c\u61c9\u8a72\u5728 \/tmp \u4e0b\u4ee5 777 \u6b0a\u9650\u5275\u5efa\u4e00\u500b\u6a94\u6848\u593e\u4f86\u5b58\u5132\u4e0d\u540c\u7248\u672c\u7684 ld-linux.so \u4e26\u4e14\u53ea\u5728\u4e0d\u5b58\u5728\u6642\u91cb\u653e ld-linux.so\u3002\u9019\u6a23\u591a\u500b\u4f7f\u7528\u6b64\u65b9\u6848\u6253\u5305\u7684\u7a0b\u5e8f\u5c31\u53ef\u4ee5\u5171\u7528\u76f8\u540c\u517c\u5bb9\u7248\u672c\u7684 ld-linux.so \u6a94\u6848<\/p>\n\n\n\n<h1 class=\"wp-block-heading\" id=\"bash\">\u81ea\u52d5\u5316\u8173\u672c<\/h1>\n\n\n\n<p>\u6240\u6709\u5de5\u4f5c\u6d41\u7a0b\u6e05\u695a\u5f8c\uff0c\u5beb\u500bbash\u81ea\u52d5\u8173\u672c\u5c31\u5b8c\u5de5\u4e86\uff0c\u8acb\u53c3\u8003\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#!\/usr\/bin\/env bash\n#Program:\n#    flutter \u81ea\u52d5\u6253\u5305\u5230 AppImage\n#History:\n#       2025-02-07 \n#Email:\n#    zuiwuchang@gmail.com\n#\n\n# \u8acb\u5c07\u4e0b\u8ff0\u8b8a\u91cf\u4fee\u6539\u7232\u4f60\u7684\u771f\u5be6\u74b0\u5883\n\n# appimagetool \u5de5\u5177\u8def\u5f91\uff0c\u8acb\u5f9e\u6b64\u8655\u4e0b\u8f09 https:\/\/github.com\/AppImage\/AppImageKit\/releases\/latest\nAppimagetool=\"appimagetool-x86_64\"\n# patchelf \u5de5\u5177\u8def\u5f91\uff0c\u8acb\u5f9e\u6b64\u8655\u4e0b\u8f09 https:\/\/github.com\/NixOS\/patchelf\/releases\/latest\nPatchelf=\"patchelf\"\n\n# \u8981\u5275\u5efa\u7684 AppImage \u6a94\u6848\u593e\u4f4d\u7f6e\nAppDir=\"bin\/myapp\"\n# \u8981\u5beb\u5165\u7684 AppImage \u61c9\u7528\u540d\u7a31\nAppName=\"com.king011.myapp\"\n# \u684c\u9762\u5716\u7247\uff0c\u6703\u81ea\u52d5\u62f7\u8c9d\u5230 \"$AppDir\/myapp.png\"\nAppLogo=\"assets\/logo.png\"\n# \u8981\u57f7\u884c\u7684\u9032\u7a0b\u540d\u7a31(flutter \u6253\u5305\u8f38\u51fa\u7684\u53ef\u57f7\u884c\u7a0b\u5f0f)\nAppExec=\"myapp\"\n# flutter \u7522\u51fa\u7684\u8edf\u4ef6\u5305\n# \u5982\u679c\u662f\u76ee\u9304\uff0c\u6703\u81ea\u52d5\u8907\u88fd\u5230 \"$AppDir\/usr\/bin\" \u4e0b\u9762\uff0c\u5982\u679c\u662f\u58d3\u7e2e\u5305(\u50c5\u652f\u6301\u5e38\u898b\u7684 tar \u7cfb\u5217)\u6703\u81ea\u52d5\u89e3\u58d3\nAppSource=\"bin\/myapp.tar.gz\"\n# \u8981\u8f38\u51fa\u7684 AppImage \u540d\u7a31\nAppOutput=\"bin\/myapp.AppImage\"\n\n# \u8981\u6253\u5305\u7684\u52d5\u614b\u5eab\u9023\u63a5\u7a0b\u5e8f\uff0c\u901a\u5e38\u4e0d\u9700\u8981\u586b\u5beb\uff0c\u8173\u672c\u6703\u5617\u8a66\u81ea\u52d5\u7372\u53d6\n# \/lib\/x86_64-linux-gnu\/ld-linux-x86-64.so.2\nDynamicLinkerPath=\"\"\n# \u52d5\u614b\u5eab\u9023\u63a5\u7a0b\u5e8f\u7248\u865f\uff0c\u901a\u5e38\u4e0d\u9700\u8981\u586b\u5beb\uff0c\u8173\u672c\u6703\u5617\u8a66\u81ea\u52d5\u7372\u53d6\n# \/lib\/x86_64-linux-gnu\/ld-linux-x86-64.so.2 --version\nDynamicLinkerVersion=\"\"\n# \u8981\u5c07\u9023\u63a5\u5668\u91cb\u653e\u7684\u6a94\u6848\u593e\u8def\u5f91\uff0c\u9ed8\u8a8d\u7232 \/tmp\/ld-linux.so.hook.d\nDynamicLinkerDir=\"\"\n\nset -e\nBashDir=$(cd \"$(dirname $BASH_SOURCE)\" &amp;&amp; pwd)\nif &#91;&#91; \"$Command\" == \"\" ]];then\n    Command=\"$0\"\nfi\n\nfunction help(){\n    echo \"use AppImage packaging for linux\"\n    echo\n    echo \"Usage:\"\n    echo \"  $Command &#91;flags]\"\n    echo\n    echo \"Flags:\"\n    echo \"  -c, --create       create AppImage dir\"\n}\n\nARGS=`getopt -o hc --long help,create -n \"$Command\" -- \"$@\"`\neval set -- \"${ARGS}\"\nCREATE=0\n\nwhile true\ndo\n    case \"$1\" in\n        -h|--help)\n            help\n            exit 0\n        ;;\n        -c|--CREATE)\n            CREATE=1\n            shift\n        ;;\n        --)\n            shift\n            break\n        ;;\n        *)\n            echo Error: unknown flag \"$1\" for \"$Command\"\n            echo \"Run '$Command --help' for usage.\"\n            exit 1\n        ;;\n    esac\ndone\n\nSO=0\ndoDeps(){\n    local str=\"`ldd \"$1\" |egrep '\\(0x&#91;0-9a-fA-F]+\\)'`\"\n    ifs=$IFS\n    IFS=\"\n\"\n    local strs=($str)\n    IFS=$ifs\n    local s\n    local name\n    local path\n    for s in \"${strs&#91;@]}\";do\n\n        name=${s%=&gt;*}\n        name=${name%(0x*}\n        name=\"${name#*&#91;&#91;:space:]]}\"\n        name=${name##*\/}        \n        name=\"${name%*&#91;&#91;:space:]]}\"\n\n        path=${s##*=&gt;}\n        path=${path%(0x*}\n        path=\"${path#*&#91;&#91;:space:]]}\"\n        path=\"${path%*&#91;&#91;:space:]]}\"\n\n        if &#91;&#91; \"$path\" =~ ^\\\/.+ ]];then\n            if &#91;&#91; ! -f \"$2\/$name\" ]];then\n                SO=$((SO+1))\n                echo \" $SO. '$path' =&gt; '$2\/$name'\"\n                cp \"$path\" \"$2\/$name\"\n\n                doDeps \"$path\" \"$2\"\n            fi\n        fi\n    done\n}\n\ndoCreateDir(){\n    if &#91;&#91; -d \"$AppDir\" ]];then\n        rm \"$AppDir\" -rf\n    fi\n\n    mkdir \"$AppDir\/lib\" -p\n    if &#91;&#91; -d \"$AppSource\" ]];then\n        cp \"$AppSource\" \"${AppDir}\/bin\" -r\n    elif &#91;&#91; -f \"$AppSource\" ]];then\n        mkdir \"$AppDir\/bin\" -p\n        if &#91;&#91; \"$AppSource\" = *.tar ]];then\n            tar -xvf \"$AppSource\" -C \"${AppDir}\/bin\/\"\n        elif &#91;&#91; \"$AppSource\" = *.tgz ]] || &#91;&#91; \"$AppSource\" = *.tar.gz ]];then\n            tar -zxvf \"$AppSource\" -C \"${AppDir}\/bin\/\"\n        elif &#91;&#91; \"$AppSource\" = *.tbz ]] || &#91;&#91; \"$AppSource\" = *.tar.bz2 ]];then\n            tar -jxvf \"$AppSource\" -C \"${AppDir}\/bin\/\"\n        elif &#91;&#91; \"$AppSource\" = *.txz ]] || &#91;&#91; \"$AppSource\" = *.tar.xz ]];then\n            tar -jxvf \"$AppSource\" -C \"${AppDir}\/bin\/\"\n        else\n            echo \"AppSource format unknow: $AppSource\"\n            exit 1\n        fi\n    else\n        echo \"AppSource not found: $AppSource\"\n        exit 1\n    fi\n\n\n    # \u5beb\u5165\u914d\u7f6e\n    local filepath=\"$AppDir\/myapp.desktop\"\n    echo \"&#91;Desktop Entry]\" &gt; \"$filepath\"\n    echo \"Name=$AppName\" &gt;&gt; \"$filepath\"\n    echo \"Exec=$AppExec\" &gt;&gt; \"$filepath\"\n    echo \"Icon=myapp\" &gt;&gt; \"$filepath\"\n    echo \"Type=Application\" &gt;&gt; \"$filepath\"\n    echo \"Categories=Utility\" &gt;&gt; \"$filepath\"\n\n    cp \"$AppLogo\" \"$AppDir\/myapp.png\"\n\n    # \u62f7\u8c9d\u76f4\u63a5\u4f9d\u8cf4\n    doDeps \"$AppDir\/bin\/$AppExec\" \"$AppDir\/lib\"\n\n    local ifs=$IFS\n    IFS=\"\n\"\n    # \u62f7\u8c9d lib \u6a94\u6848\u593e\u4e0b\u7684\u9593\u63a5\u4f9d\u8cf4\n    local files=(`find \"$AppDir\/bin\/lib\" -maxdepth 1 -type f`)\nIFS=$ifs\n    for file in \"${files&#91;@]}\";do\n        if &#91;&#91; -f \"$file\" ]];then\n            doDeps \"$file\" \"$AppDir\/lib\"\n        fi\n    done\n\n    # \u522a\u9664\u8207 bin\/lib \u4e2d\u91cd\u8907\u7684\u4f9d\u8cf4\u6a94\u6848\n    for file in \"${files&#91;@]}\";do\n        name=${file##*\/}\n        if &#91;&#91; -f \"$AppDir\/lib\/$name\" ]];then\n            echo rm \"$AppDir\/lib\/$name\"\n            rm \"$AppDir\/lib\/$name\"\n        fi\n    done\n\n    # \u62f7\u8c9d\u52d5\u614b\u5eab\u9023\u63a5\u7a0b\u5e8f\n    if &#91;&#91; \"$DynamicLinkerPath\" == \"\" ]];then\n        DynamicLinkerPath=\"\/lib\/x86_64-linux-gnu\/ld-linux-x86-64.so.2\"\n    fi\n    if &#91;&#91; ! -f \"$DynamicLinkerPath\" ]];then\n        echo \"DynamicLinkerPath not found: $DynamicLinkerPath\"\n        exit 1\n    fi\n    local name=${DynamicLinkerPath##*\/}\n    if &#91;&#91; \"$name\" == \"\" ]];then\n        echo \"DynamicLinkerPath not found: $DynamicLinkerPath\"\n        exit \n    fi\n    echo \"DynamicLinkerPath: $DynamicLinkerPath\"\n    if &#91;&#91; ! -f \"$AppDir\/lib\/$name\" ]];then\n        cp \"$DynamicLinkerPath\" \"$AppDir\/lib\/\"\n    fi\n    if &#91;&#91; \"$DynamicLinkerVersion\" == \"\" ]];then\n        DynamicLinkerVersion=`\"$DynamicLinkerPath\" --version | egrep version`\n        DynamicLinkerVersion=${DynamicLinkerVersion##*version }\n    fi\n    if &#91;&#91; \"$DynamicLinkerVersion\" =~ ^&#91;0-9]+\\.&#91;0-9]+\\.&#91;0-9]*$ ]];then\n        echo \"DynamicLinkerVersion: $DynamicLinkerVersion\"\n    else\n        echo \"DynamicLinkerVersion not supported: '$DynamicLinkerVersion'\"\n        exit 1\n    fi\n    if &#91;&#91; \"$DynamicLinkerDir\" == \"\" ]];then\n        DynamicLinkerDir=\"\/tmp\/ld-linux.so.hook.d\"\n    fi\n    if &#91;&#91; \"$DynamicLinkerDir\" != *\/ ]];then\n        DynamicLinkerDir=\"$DynamicLinkerDir\/\"\n    fi\n    echo \"DynamicLinkerDir: $DynamicLinkerDir\"\n\n    # \u4fee\u88dc flutter \u53ef\u57f7\u884c\u6a94\u6848\uff0c\u6307\u5b9a\u4f7f\u7528\u5c08\u7528\u7684\u52d5\u614b\u5eab\u52a0\u8f09\u5668\n    local ld=\"${DynamicLinkerDir}ld-linux-x86-64.so.$DynamicLinkerVersion\"\n    echo \"'$Patchelf' --set-interpreter '$ld' '$AppDir\/bin\/$AppExec'\"\n    \"$Patchelf\" --set-interpreter \"$ld\" \"$AppDir\/bin\/$AppExec\"\n\n    # \u5beb\u5165\u4f9d\u8cf4\u5553\u52d5\u8173\u672c\n    filepath=\"$AppDir\/AppRun\"\n    echo '#!\/bin\/bash' &gt; \"$filepath\"\n    echo 'set -e' &gt;&gt; \"$filepath\"\n    echo 'if &#91;&#91; \"$APPDIR\" == \"\" ]];then' &gt;&gt; \"$filepath\"\n    echo '  APPDIR=$(cd \"$(dirname \"$BASH_SOURCE\")\" &amp;&amp; pwd)' &gt;&gt; \"$filepath\"\n    echo 'fi' &gt;&gt; \"$filepath\"\n    echo 'if &#91;&#91; ! -f \"'\"$ld\"'\" ]];then' &gt;&gt; \"$filepath\"\n    echo '  mkdir -p \"'\"$DynamicLinkerDir\"'\"' &gt;&gt; \"$filepath\"\n    echo '  chmod 777 \"'\"$DynamicLinkerDir\"'\"' &gt;&gt; \"$filepath\"\n    echo '  cp \"$APPDIR\/lib\/'\"$name\"'\" \"'\"$ld\"'\"' &gt;&gt; \"$filepath\"\n    echo 'fi' &gt;&gt; \"$filepath\"\n    echo 'if &#91;&#91; \"$LD_LIBRARY_PATH\" == \"\" ]];then' &gt;&gt; \"$filepath\"\n    echo '  export LD_LIBRARY_PATH=\"$APPDIR\/lib\"' &gt;&gt; \"$filepath\"\n    echo 'else' &gt;&gt; \"$filepath\"\n    echo '  export LD_LIBRARY_PATH=\"$APPDIR\/usr\/lib:$LD_LIBRARY_PATH\"' &gt;&gt; \"$filepath\"\n    echo 'fi' &gt;&gt; \"$filepath\"\n    echo '\"$APPDIR\/bin\/'\"$AppExec\"'\" \"$@\"' &gt;&gt; \"$filepath\"\n    chmod a+x \"$filepath\"\n\n    echo Appimage dir ready\n}\nif &#91;&#91; -d \"$AppDir\" ]];then\n    if &#91;&#91; $CREATE == 1 ]] ;then\n        doCreateDir\n    fi\nelse\n    doCreateDir\nfi\n\n\"$Appimagetool\" \"$AppDir\" \"$AppOutput\"\ndu \"$AppOutput\" -h\nsha256sum \"$AppOutput\" &gt; \"$AppOutput.sha256.txt\"\ncat \"$AppOutput.sha256.txt\"<\/code><\/pre>\n\n\n\n<p>\u5c07\u8173\u672c\u6700\u524d\u9762\u5b9a\u7fa9\u7684\u8b8a\u91cf\u4fee\u6539\u7232\u4f60\u7684\u771f\u5be6\u60c5\u6cc1\uff0c\u4e4b\u5f8c\u57f7\u884c\u8173\u672c\u5b83\u5c31\u6703\u81ea\u52d5\u5b8c\u6210\u6253\u5305\uff0c\u5b83\u505a\u4e86\u5982\u4e0b\u5de5\u4f5c<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u5275\u5efa\u4e00\u500b AppDir \u76ee\u9304\u4f5c\u7232 AppImage \u6253\u5305\u6839\u76ee\u9304\uff0c\u540c\u6642\u5275\u5efa\u5fc5\u8981\u7684\u6253\u5305\u6a94\u6848<\/li>\n\n\n\n<li>\u628a flutter \u7de8\u8b6f\u7522\u51fa\u7684\u53ef\u57f7\u884c\u6a94\uff0c\u8cc7\u7522\uff0c\u52d5\u614b\u5eab\uff0c\u62f7\u8c9d\u5230 $AppDir\/bin<\/li>\n\n\n\n<li>\u4f7f\u7528 ldd \u5206\u6790 flutter \u7522\u51fa\uff0c\u5c07\u4f9d\u8cf4\u905e\u6b78\u62f7\u8c9d\u5230 $AppDir\/lib<\/li>\n\n\n\n<li>\u6253\u5305 ld-linux.so \u5230 $AppDir\/lib<\/li>\n\n\n\n<li>\u4f7f\u7528 patchelf \u4fee\u88dc flutter \u53ef\u57f7\u884c\u6a94\u6848\u4f7f\u7528\u7684 ld-linux.so \u8def\u5f91<\/li>\n\n\n\n<li>\u5275\u5efa $AppDir\/AppRun \u7684 AppImage \u5165\u53e3\u8173\u672c\u3002\u5b83\u6703\u8ca0\u8cac\u91cb\u653e ld-linux.so \u5230\u7cfb\u7d71\u4e26\u6700\u7d42\u8abf\u7528 flutter \u751f\u6210\u7684\u684c\u9762\u7a0b\u5f0f<\/li>\n\n\n\n<li>\u6253\u5305\u751f\u6210 AppImage \u6a94\u6848<\/li>\n<\/ol>\n","protected":false},"excerpt":{"rendered":"<p>\u5982\u4f55\u4f7f\u7528 AppImage \u6253\u5305 flutter \u7a0b\u5e8f\uff0cAppImage \u61c9\u8a72\u5982\u4f55\u6253\u5305 glibc \u548c ld-linux.so<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[59,50,2],"tags":[],"class_list":["post-351","post","type-post","status-publish","format-standard","hentry","category-flutter","category-linux","category-code"],"blocksy_meta":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/blog.king011.com\/index.php?rest_route=\/wp\/v2\/posts\/351","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.king011.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.king011.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.king011.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.king011.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=351"}],"version-history":[{"count":5,"href":"https:\/\/blog.king011.com\/index.php?rest_route=\/wp\/v2\/posts\/351\/revisions"}],"predecessor-version":[{"id":358,"href":"https:\/\/blog.king011.com\/index.php?rest_route=\/wp\/v2\/posts\/351\/revisions\/358"}],"wp:attachment":[{"href":"https:\/\/blog.king011.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=351"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.king011.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=351"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.king011.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=351"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}