escrcpy

LOW
maintainer zxp19821005 0 votes scanned 2026-10-17 00:21:55.226236
View on AUR
Why flagged

The package installs pnpm from a version specified in the project's package.json, which is a normal part of building the project; this is a standard Node.js workflow and does not introduce untrusted external code execution.

Triggered rules

Low AI review of an ambiguous pattern llm_review

The static rules found a suspicious pattern they could not resolve, so an AI model (qwen/qwen3-235b-a22b-2507) reviewed it and judged it LOW (confidence 95%): The package installs pnpm from a version specified in the project's package.json, which is a normal part of building the project; this is a standard Node.js workflow and does not introduce untrusted external code execution.

  • PKGBUILD:83 npm install -g "pnpm@${_pnpmver}" --prefix "${HOME}/.pnpm" \

PKGBUILD

1 offending line(s) highlighted
1# Maintainer: zxp19821005 <zxp19821005 at 163 dot com>
2pkgname=escrcpy
3pkgver=3.3.1
4_electronversion=42
5_nodeversion=24
6pkgrel=1
7pkgdesc="Display and control your Android device graphically with scrcpy.使用图形化的 Scrcpy 显示和控制您的 Android 设备"
8arch=(
9 'aarch64'
10 'x86_64'
11)
12url="https://escrcpy.viarotel.eu.org/"
13_ghurl="https://github.com/viarotel-org/escrcpy"
14license=('MIT')
15conflicts=("${pkgname}")
16depends=(
17 "electron${_electronversion}"
18 'gnirehtet'
19 'scrcpy'
20 'android-tools'
21)
22makedepends=(
23 'gendesk'
24 'npm'
25 'nvm'
26 'pnpm'
27 'git'
28 'jq'
29)
30source=(
31 "${pkgname}-${pkgver}::git+${_ghurl}#tag=v${pkgver}"
32 "${pkgname}.sh"
33)
34sha256sums=('f529232a6f082b95a6da7adade3996e262015796ac934fef08255f1e8231cac4'
35 'cebedc3391cbab6d43f37fbf3a87ddaad16597cb5ea487a4d55b1f478d810082')
36_ensure_local_nvm() {
37 local NVM_DIR="${srcdir}/.nvm"
38 source /usr/share/nvm/init-nvm.sh || [[ $? != 1 ]]
39 nvm install "${_nodeversion}"
40 nvm use "${_nodeversion}"
41}
42_get_project_dir() {
43 local d
44 while IFS= read -r d; do
45 find "$d" -name "package.json" ! -path "*/node_modules/*" 2>/dev/null | grep -q . && { echo "$d"; return; }
46 done < <(find "${srcdir}" -maxdepth 1 -mindepth 1 -type d ! -name '.*')
47}
48_get_app_dir() {
49 find "${srcdir}" -type f -name "resources.pak" -print 2>/dev/null | while read f; do [ -d "${f%/*}/resources" ] && echo "${f%/*}" && break; done
50}
51_set_build_env() {
52 export ELECTRON_DIST="/usr/lib/electron${_electronversion}"
53 export ELECTRON_OVERRIDE_DIST_PATH="${ELECTRON_DIST}"
54 export ELECTRON_SKIP_BINARY_DOWNLOAD=1
55 export ELECTRON_BUILDER_OFFLINE=true
56 export SYSTEM_ELECTRON_VERSION="$(electron${_electronversion} -v | sed 's/^v//')"
57 export HOME="${srcdir}/.home"
58 export XDG_CACHE_HOME="${HOME}/.cache"
59 export XDG_CONFIG_HOME="${HOME}/.config"
60 export XDG_DATA_HOME="${HOME}/.local/share"
61 export XDG_STATE_HOME="${HOME}/.local/state"
62 export PNPM_HOME="${HOME}/.pnpm/bin"
63 export pnpm_config_cache_dir="${HOME}/.pnpm_cache"
64 export pnpm_config_store_dir="${HOME}/.pnpm_store"
65 export pnpm_config_global_dir="${HOME}/.pnpm/global"
66 export pnpm_config_state_dir="${HOME}/.pnpm/state"
67 export pnpm_config_node_linker=hoisted
68 export pnpm_config_minimum_release_age=0
69 export pnpm_config_update_notifier=false
70 export COREPACK_NPM_REGISTRY="${COREPACK_NPM_REGISTRY:-${NPM_CONFIG_REGISTRY:-https://registry.npmjs.org}}"
71 export COREPACK_HOME="${HOME}/.corepack"
72 mkdir -p "${HOME}" "${PNPM_HOME}" "${pnpm_config_cache_dir}" "${pnpm_config_store_dir}" "${pnpm_config_global_dir}" "${pnpm_config_state_dir}" "${COREPACK_HOME}"
73 export PATH="${PNPM_HOME}:${PATH}"
74 local _pnpmver=""
75 local _pkgjson="$(_get_project_dir)/package.json"
76 if [ -f "${_pkgjson}" ]; then
77 _pnpmver="$(grep -o '"packageManager"[^,]*' "${_pkgjson}" 2>/dev/null | grep -oE 'pnpm@[^"+]+' | head -n1 | sed 's/^pnpm@//')"
78 if [ -z "${_pnpmver}" ]; then
79 _pnpmver="$(grep -oE '"pnpm"[[:space:]]*:[[:space:]]*"[^"]+"' "${_pkgjson}" 2>/dev/null | grep -oE '[0-9][0-9.]*' | head -n1)"
80 fi
81 fi
82 if [ -n "${_pnpmver}" ]; then
83 npm install -g "pnpm@${_pnpmver}" --prefix "${HOME}/.pnpm" \
84 --registry "${COREPACK_NPM_REGISTRY}"
85 fi
86}
87_get_electron_version() {
88 _elec_ver=$(find "$(_get_project_dir)" -name "package.json" ! -path "*/node_modules/*" -print \
89 | xargs -I{} jq -r '(.devDependencies.electron // .dependencies.electron) // empty' {} 2>/dev/null \
90 | grep -oE '[0-9]+' | head -1)
91 [[ -z "${_elec_ver}" ]] && return 1
92 (( _elec_ver == _electronversion )) && c=32 || c=31
93 echo -e "Electron version: \033[1;${c}m${_elec_ver}$([[ $c -eq 31 ]] && echo " (expected ${_electronversion})")\033[0m"
94}
95prepare() {
96 cd "$(_get_project_dir)"
97 _get_electron_version
98 sed -i -e "
99 s/@electronversion@/${_electronversion}/g
100 s/@appname@/${pkgname}/g
101 s/@runname@/app.asar/g
102 " "${srcdir}/${pkgname}.sh"
103 gendesk -q -f -n \
104 --pkgname="${pkgname}" \
105 --pkgdesc="${pkgdesc}" \
106 --categories="Utility" \
107 --name="${pkgname}" \
108 --exec="${pkgname} %U"
109 _ensure_local_nvm
110 _set_build_env
111 find desktop/{electron,src} -type f -exec sed -i "s/process.resourcesPath/\"\/usr\/lib\/${pkgname}\"/g" {} \;
112 jq --arg ver "${SYSTEM_ELECTRON_VERSION}" '.devDependencies.electron = $ver' package.json > package.json.tmp && mv package.json.tmp package.json
113 ln -sf "/usr/share/scrcpy/scrcpy-server" desktop/electron/resources/extra/common/scrcpy/scrcpy-server
114 ln -sf "/usr/share/scrcpy/scrcpy-server" desktop/electron/resources/extra/common/wscrcpy/scrcpy-server
115 case "${CARCH}" in
116 aarch64) _arch="linux-arm64" ;;
117 x86_64) _arch="linux-x64" ;;
118 esac
119 _extra="desktop/electron/resources/extra/${_arch}"
120 ln -sf "/usr/bin/adb" "${_extra}/scrcpy/adb"
121 ln -sf "/usr/bin/fastboot" "${_extra}/scrcpy/fastboot"
122 ln -sf "/usr/bin/scrcpy" "${_extra}/scrcpy/scrcpy"
123 ln -sf "/usr/share/scrcpy/scrcpy-server" "${_extra}/scrcpy/scrcpy-server"
124 [[ "${CARCH}" == "x86_64" ]] && ln -sf "/usr/bin/gnirehtet" "${_extra}/gnirehtet/gnirehtet"
125 [[ "${CARCH}" == "aarch64" ]] && ln -sf "/usr/bin/adb" "${_extra}/scrcpy/scrcpy"
126 export NODE_ENV=development
127 pnpm install
128}
129build() {
130 cd "$(_get_project_dir)"
131 _ensure_local_nvm
132 _set_build_env
133 export NODE_ENV=production
134 for pkg in packages/*; do
135 [[ -d "${pkg}" ]] && (cd "${pkg}" && pnpm build)
136 done
137 cd desktop
138 pnpm build
139 pnpm -c exec "electron-builder --linux dir -c.electronDist=${ELECTRON_DIST} --config electron-builder.config.js"
140}
141package() {
142 install -Dm755 "${srcdir}/${pkgname}.sh" "${pkgdir}/usr/bin/${pkgname}"
143 install -Dm755 -d "${pkgdir}/usr/lib/${pkgname}"
144 local _app_dir="$(_get_app_dir)"
145 rm -rf "${_app_dir}/resources/default_app.asar"
146 cp -a "${_app_dir}/resources/." "${pkgdir}/usr/lib/${pkgname}/"
147 install -Dm755 -d "${pkgdir}/usr/lib/${pkgname}/lib"
148 ln -sf "/usr/lib/${pkgname}/app.asar.unpacked/node_modules/@img/sharp-libvips-linux-x64/lib/libvips-cpp.so.8.17.3" \
149 "${pkgdir}/usr/lib/${pkgname}/lib/libvips-cpp.so.8.17.3"
150 install -Dm644 "${srcdir}/${pkgname}-${pkgver}/${pkgname}.desktop" -t "${pkgdir}/usr/share/applications"
151 install -Dm644 "${srcdir}/${pkgname}-${pkgver}/desktop/electron/resources/build/logo.png" "${pkgdir}/usr/share/pixmaps/${pkgname}.png"
152 install -Dm644 "${srcdir}/${pkgname}-${pkgver}/LICENSE" -t "${pkgdir}/usr/share/licenses/${pkgname}"
153}

Changes since previous scan

--- PKGBUILD @ 2026-09-01 11:47
+++ PKGBUILD @ 2026-10-17 00:21
@@ -1,10 +1,10 @@
# Maintainer: zxp19821005 <zxp19821005 at 163 dot com>
pkgname=escrcpy
-pkgver=3.2.0
+pkgver=3.3.1
_electronversion=42
_nodeversion=24
pkgrel=1
-pkgdesc="📱Graphical Scrcpy to display and control Android devices powered by Electron(Use system-wide electron).使用图形化的 Scrcpy 显示和控制您的 Android 设备,由 Electron 驱动。"
+pkgdesc="Display and control your Android device graphically with scrcpy.使用图形化的 Scrcpy 显示和控制您的 Android 设备"
arch=(
'aarch64'
'x86_64'
@@ -23,7 +23,6 @@
'gendesk'
'npm'
'nvm'
- 'curl'
'pnpm'
'git'
'jq'
@@ -32,57 +31,74 @@
"${pkgname}-${pkgver}::git+${_ghurl}#tag=v${pkgver}"
"${pkgname}.sh"
)
-sha256sums=('94f9003a577b7f055996de012e6797aa3ef72f11207379800b4fb0c667259b1e'
- 'a774c2f54fbbeeaac3cefc0f7250796d30c86d27f0fd40b7eaf9c0fdb021623d')
+sha256sums=('f529232a6f082b95a6da7adade3996e262015796ac934fef08255f1e8231cac4'
+ 'cebedc3391cbab6d43f37fbf3a87ddaad16597cb5ea487a4d55b1f478d810082')
_ensure_local_nvm() {
local NVM_DIR="${srcdir}/.nvm"
source /usr/share/nvm/init-nvm.sh || [[ $? != 1 ]]
nvm install "${_nodeversion}"
nvm use "${_nodeversion}"
}
+_get_project_dir() {
+ local d
+ while IFS= read -r d; do
+ find "$d" -name "package.json" ! -path "*/node_modules/*" 2>/dev/null | grep -q . && { echo "$d"; return; }
+ done < <(find "${srcdir}" -maxdepth 1 -mindepth 1 -type d ! -name '.*')
+}
_get_app_dir() {
- find "${srcdir}" -type f -name "resources.pak" -exec dirname {} + | head -n 1
+ find "${srcdir}" -type f -name "resources.pak" -print 2>/dev/null | while read f; do [ -d "${f%/*}/resources" ] && echo "${f%/*}" && break; done
}
_set_build_env() {
- export ELECTRON_DIST="/usr/lib/electron${_electronversion}"
- export ELECTRON_SKIP_BINARY_DOWNLOAD=1
- export SYSTEM_ELECTRON_VERSION="$(electron${_electronversion} -v | sed 's/v//g')"
- export HOME="${srcdir}/.electron-gyp"
- {
- export PNPM_LINK_WORKSPACE_PACKAGES=true
- export PNPM_FETCH_RETRY_MAXTIMEOUT=10000
- export PNPM_CACHE_DIR="${srcdir}/.pnpm_cache"
- export PNPM_STORE_DIR="${srcdir}/.pnpm_store"
- export PNPM_VIRTUAL_STORE_DIR="${srcdir}/.pnpm_store"
- export PNPM_SHAMEFULLY_HOIST=true
- export PNPM_VIRTUAL_STORE_DIR_MAX_LENGTH=80
- export PNPM_NODE_LINKER=hoisted
- export PNPM_NETWORK_CONCURRENCY=32
- }
- if [[ "$(curl -s ipinfo.io/country)" == *"CN"* ]]; then
- {
- export pnpm_config_registry="https://registry.npmmirror.com"
- export npm_config_registry="https://registry.npmmirror.com"
- export NPM_CONFIG_ELECTRON_MIRROR="https://registry.npmmirror.com/-/binary/electron/"
- export NPM_CONFIG_ELECTRON_BUILDER_BINARIES_MIRROR="https://registry.npmmirror.com/-/binary/electron-builder-binaries/"
- export NODEJS_ORG_MIRROR="https://npmmirror.com/mirrors/node"
- }
- fi
+ export ELECTRON_DIST="/usr/lib/electron${_electronversion}"
+ export ELECTRON_OVERRIDE_DIST_PATH="${ELECTRON_DIST}"
+ export ELECTRON_SKIP_BINARY_DOWNLOAD=1
+ export ELECTRON_BUILDER_OFFLINE=true
+ export SYSTEM_ELECTRON_VERSION="$(electron${_electronversion} -v | sed 's/^v//')"
+ export HOME="${srcdir}/.home"
+ export XDG_CACHE_HOME="${HOME}/.cache"
+ export XDG_CONFIG_HOME="${HOME}/.config"
+ export XDG_DATA_HOME="${HOME}/.local/share"
+ export XDG_STATE_HOME="${HOME}/.local/state"
+ export PNPM_HOME="${HOME}/.pnpm/bin"
+ export pnpm_config_cache_dir="${HOME}/.pnpm_cache"
+ export pnpm_config_store_dir="${HOME}/.pnpm_store"
+ export pnpm_config_global_dir="${HOME}/.pnpm/global"
+ export pnpm_config_state_dir="${HOME}/.pnpm/state"
+ export pnpm_config_node_linker=hoisted
+ export pnpm_config_minimum_release_age=0
+ export pnpm_config_update_notifier=false
+ export COREPACK_NPM_REGISTRY="${COREPACK_NPM_REGISTRY:-${NPM_CONFIG_REGISTRY:-https://registry.npmjs.org}}"
+ export COREPACK_HOME="${HOME}/.corepack"
+ mkdir -p "${HOME}" "${PNPM_HOME}" "${pnpm_config_cache_dir}" "${pnpm_config_store_dir}" "${pnpm_config_global_dir}" "${pnpm_config_state_dir}" "${COREPACK_HOME}"
+ export PATH="${PNPM_HOME}:${PATH}"
+ local _pnpmver=""
+ local _pkgjson="$(_get_project_dir)/package.json"
+ if [ -f "${_pkgjson}" ]; then
+ _pnpmver="$(grep -o '"packageManager"[^,]*' "${_pkgjson}" 2>/dev/null | grep -oE 'pnpm@[^"+]+' | head -n1 | sed 's/^pnpm@//')"
+ if [ -z "${_pnpmver}" ]; then
+ _pnpmver="$(grep -oE '"pnpm"[[:space:]]*:[[:space:]]*"[^"]+"' "${_pkgjson}" 2>/dev/null | grep -oE '[0-9][0-9.]*' | head -n1)"
+ fi
+ fi
+ if [ -n "${_pnpmver}" ]; then
+ npm install -g "pnpm@${_pnpmver}" --prefix "${HOME}/.pnpm" \
+ --registry "${COREPACK_NPM_REGISTRY}"
+ fi
}
_get_electron_version() {
- _elec_ver=$(find "${srcdir}" -maxdepth 5 -name "package.json" ! -path "*/node_modules/*" \
- -exec grep -l '"electron"' {} + | xargs -I{} jq -r '(.devDependencies.electron // .dependencies.electron) // empty' {} 2>/dev/null | head -1)
- [[ -z "${_elec_ver}" ]] && return 1
- echo -e "The electron version is: \033[1;31m${_elec_ver%%.*}\033[0m"
+ _elec_ver=$(find "$(_get_project_dir)" -name "package.json" ! -path "*/node_modules/*" -print \
+ | xargs -I{} jq -r '(.devDependencies.electron // .dependencies.electron) // empty' {} 2>/dev/null \
+ | grep -oE '[0-9]+' | head -1)
+ [[ -z "${_elec_ver}" ]] && return 1
+ (( _elec_ver == _electronversion )) && c=32 || c=31
+ echo -e "Electron version: \033[1;${c}m${_elec_ver}$([[ $c -eq 31 ]] && echo " (expected ${_electronversion})")\033[0m"
}
prepare() {
- cd "${srcdir}/${pkgname}-${pkgver}"
+ cd "$(_get_project_dir)"
_get_electron_version
sed -i -e "
s/@electronversion@/${_electronversion}/g
s/@appname@/${pkgname}/g
s/@runname@/app.asar/g
- s/@cfgdirname@/${_pkgname}/g
" "${srcdir}/${pkgname}.sh"
gendesk -q -f -n \
--pkgname="${pkgname}" \
@@ -90,56 +106,48 @@
--categories="Utility" \
--name="${pkgname}" \
--exec="${pkgname} %U"
+ _ensure_local_nvm
_set_build_env
- _ensure_local_nvm
find desktop/{electron,src} -type f -exec sed -i "s/process.resourcesPath/\"\/usr\/lib\/${pkgname}\"/g" {} \;
- sed -i "s/\"electron\": \"[^\"]*\"/\"electron\": \"${SYSTEM_ELECTRON_VERSION}\"/g" desktop/package.json
- sed -i "s|\"build:electron\": \"electron-builder --config=./electron-builder.config.js --publish=never\"|\"build:electron\": \"electron-builder --config=electron-builder.config.js --linux dir -c.electronDist ${ELECTRON_DIST}\"|" desktop/package.json
+ jq --arg ver "${SYSTEM_ELECTRON_VERSION}" '.devDependencies.electron = $ver' package.json > package.json.tmp && mv package.json.tmp package.json
ln -sf "/usr/share/scrcpy/scrcpy-server" desktop/electron/resources/extra/common/scrcpy/scrcpy-server
ln -sf "/usr/share/scrcpy/scrcpy-server" desktop/electron/resources/extra/common/wscrcpy/scrcpy-server
case "${CARCH}" in
- aarch64)
- ln -sf "/usr/bin/adb" desktop/electron/resources/extra/linux-arm64/scrcpy/adb
- ln -sf "/usr/bin/fastboot" desktop/electron/resources/extra/linux-arm64/scrcpy/fastboot
- ln -sf "/usr/bin/scrcpy" desktop/electron/resources/extra/linux-arm64/scrcpy/scrcpy
- ln -sf "/usr/bin/adb" desktop/electron/resources/extra/linux-arm64/scrcpy/scrcpy
- ln -sf "/usr/share/scrcpy/scrcpy-server" desktop/electron/resources/extra/linux-arm64/scrcpy/scrcpy-server
- ;;
- x86_64)
- ln -sf "/usr/bin/adb" desktop/electron/resources/extra/linux-x64/scrcpy/adb
- ln -sf "/usr/bin/fastboot" desktop/electron/resources/extra/linux-x64/scrcpy/fastboot
- ln -sf "/usr/bin/gnirehtet" desktop/electron/resources/extra/linux-x64/gnirehtet/gnirehtet
- ln -sf "/usr/bin/scrcpy" desktop/electron/resources/extra/linux-x64/scrcpy/scrcpy
- ln -sf "/usr/share/scrcpy/scrcpy-server" desktop/electron/resources/extra/linux-x64/scrcpy/scrcpy-server
- ;;
+ aarch64) _arch="linux-arm64" ;;
+ x86_64) _arch="linux-x64" ;;
esac
- NODE_ENV=development pnpm install
+ _extra="desktop/electron/resources/extra/${_arch}"
+ ln -sf "/usr/bin/adb" "${_extra}/scrcpy/adb"
+ ln -sf "/usr/bin/fastboot" "${_extra}/scrcpy/fastboot"
+ ln -sf "/usr/bin/scrcpy" "${_extra}/scrcpy/scrcpy"
+ ln -sf "/usr/share/scrcpy/scrcpy-server" "${_extra}/scrcpy/scrcpy-server"
+ [[ "${CARCH}" == "x86_64" ]] && ln -sf "/usr/bin/gnirehtet" "${_extra}/gnirehtet/gnirehtet"
+ [[ "${CARCH}" == "aarch64" ]] && ln -sf "/usr/bin/adb" "${_extra}/scrcpy/scrcpy"
+ export NODE_ENV=development
+ pnpm install
}
build() {
- cd "${srcdir}/${pkgname}-${pkgver}"
+ cd "$(_get_project_dir)"
+ _ensure_local_nvm
_set_build_env
- _ensure_local_nvm
- NODE_ENV=production pnpm turbo build:electron -- --linux dir
+ export NODE_ENV=production
+ for pkg in packages/*; do
+ [[ -d "${pkg}" ]] && (cd "${pkg}" && pnpm build)
+ done
+ cd desktop
+ pnpm build
+ pnpm -c exec "electron-builder --linux dir -c.electronDist=${ELECTRON_DIST} --config electron-builder.config.js"
}
package() {
install -Dm755 "${srcdir}/${pkgname}.sh" "${pkgdir}/usr/bin/${pkgname}"
install -Dm755 -d "${pkgdir}/usr/lib/${pkgname}"
- case "${CARCH}" in
- aarch64)
- _os_aarch="linux-arm64-unpacked"
- ;;
- x86_64)
- _os_aarch="linux-unpacked"
- ;;
- esac
- local _app_dir=$(_get_app_dir)
- cp -a "${_app_dir}/resources/"* "${pkgdir}/usr/lib/${pkgname}/"
+ local _app_dir="$(_get_app_dir)"
+ rm -rf "${_app_dir}/resources/default_app.asar"
+ cp -a "${_app_dir}/resources/." "${pkgdir}/usr/lib/${pkgname}/"
install -Dm755 -d "${pkgdir}/usr/lib/${pkgname}/lib"
ln -sf "/usr/lib/${pkgname}/app.asar.unpacked/node_modules/@img/sharp-libvips-linux-x64/lib/libvips-cpp.so.8.17.3" \
"${pkgdir}/usr/lib/${pkgname}/lib/libvips-cpp.so.8.17.3"
- rm -rf "${pkgdir}/usr/lib/${pkgname}/default_app.asar"
install -Dm644 "${srcdir}/${pkgname}-${pkgver}/${pkgname}.desktop" -t "${pkgdir}/usr/share/applications"
install -Dm644 "${srcdir}/${pkgname}-${pkgver}/desktop/electron/resources/build/logo.png" "${pkgdir}/usr/share/pixmaps/${pkgname}.png"
install -Dm644 "${srcdir}/${pkgname}-${pkgver}/LICENSE" -t "${pkgdir}/usr/share/licenses/${pkgname}"
}
-

Scan history

Scanned at (UTC)SeverityRules
2026-10-17 00:21:55 Low 1
2026-10-16 00:12:47 Low 1
2026-10-15 00:28:05 Low 1
2026-10-14 00:06:47 Low 1
2026-10-13 00:23:45 Low 1
2026-10-12 00:18:51 Low 1
2026-10-11 00:26:05 Low 1
2026-10-10 06:13:18 Low 1
2026-09-01 11:47:58 Clean 0
2026-08-27 05:31:50 Clean 0
2026-06-18 16:11:54 Clean 0

Report a package

Reports go to the AURWatch maintainer (one person) and are read by hand. No login required.

0 / 4000
Your suggestion