) Fixes the trapped-modal bug: modals are no longer nested inside backdrop-filter cards, which used to become their containing block. ========================================================================== */ .reader-overlay { position: fixed; inset: 0; z-index: 2000; display: flex; align-items: center; justify-content: center; padding: 28px; background: rgba(3, 5, 9, 0.68); backdrop-filter: blur(18px); -webkit-backdrop-filter: blur(18px); } .reader-panel { display: flex; flex-direction: column; width: min(960px, 94vw); max-height: 88vh; background: var(--bg-modal); border: 1px solid var(--border-medium); border-radius: 22px; box-shadow: var(--shadow-elevation); overflow: hidden; animation: modalScaleIn 0.34s cubic-bezier(0.16, 1, 0.3, 1) both; } .reader-head { display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: 15px 20px; border-bottom: 1px solid var(--border-subtle); background: var(--badge-bg); } .reader-head-left { display: flex; align-items: center; gap: 9px; } .reader-kicker { font-size: 13px; font-weight: 700; letter-spacing: 0.04em; color: var(--text-main); } .reader-count { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 11px; font-weight: 700; padding: 2px 8px; border-radius: 999px; color: var(--accent-primary); background: rgba(var(--accent-rgb), 0.12); border: 1px solid rgba(var(--accent-rgb), 0.28); } .reader-close { width: 32px; height: 32px; border-radius: 10px; display: inline-flex; align-items: center; justify-content: center; color: var(--text-muted); background: var(--bg-surface); border: 1px solid var(--border-subtle); transition: all 0.22s cubic-bezier(0.16, 1, 0.3, 1); } .reader-close:hover { color: var(--text-main); border-color: var(--border-medium); transform: rotate(90deg); } .reader-tabs { display: flex; gap: 6px; padding: 10px 16px; overflow-x: auto; border-bottom: 1px solid var(--border-subtle); scrollbar-width: none; } .reader-tabs::-webkit-scrollbar { display: none; } .reader-tab { display: inline-flex; align-items: center; gap: 7px; padding: 7px 12px; border-radius: 10px; font-size: 12.5px; white-space: nowrap; color: var(--text-muted); border: 1px solid transparent; transition: all 0.2s ease; } .reader-tab:hover { color: var(--text-main); background: var(--badge-bg); } .reader-tab.is-active { color: var(--accent-primary); background: var(--seg-indicator-bg); border-color: var(--seg-indicator-border); font-weight: 650; } .reader-pin { font-size: 10px; font-weight: 600; padding: 1px 6px; border-radius: 5px; color: var(--accent-amber); background: rgba(245, 158, 11, 0.12); border: 1px solid rgba(245, 158, 11, 0.28); } .reader-tab-text { max-width: 250px; overflow: hidden; text-overflow: ellipsis; } .reader-body { flex: 1; overflow-y: auto; padding: 34px 48px 44px; } .reader-article { max-width: 720px; margin: 0 auto; } .reader-meta { display: flex; align-items: center; justify-content: space-between; font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 11.5px; color: var(--text-dim); margin-bottom: 12px; } .reader-title { font-size: 25px; font-weight: 800; letter-spacing: -0.02em; line-height: 1.34; color: var(--text-main); margin: 0 0 22px; padding-bottom: 18px; border-bottom: 1px solid var(--border-subtle); } .reader-foot { display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: 12px 20px; border-top: 1px solid var(--border-subtle); background: var(--bg-surface); } .reader-hint { font-size: 11.5px; font-family: ui-monospace, SFMono-Regular, Menlo, monospace; color: var(--text-dim); } .reader-pop-enter-active, .reader-pop-leave-active { transition: opacity 0.24s ease; } .reader-pop-enter-from, .reader-pop-leave-to { opacity: 0; } @media (max-width: 768px) { .reader-overlay { padding: 0; } .reader-panel { width: 100vw; height: 100vh; max-height: 100vh; border-radius: 0; border: none; } .reader-body { padding: 22px 20px 30px; } .reader-title { font-size: 20px; } .reader-tab-text { max-width: 150px; } .reader-hint { display: none; } } /* ========================================================================== 12. LANDING PAGE SECTIONS ========================================================================== */ .land-section { position: relative; z-index: 10; max-width: 1440px; margin: 0 auto; padding: 96px 24px; } .land-section--tight { padding: 68px 24px; } .land-eyebrow { display: inline-flex; align-items: center; gap: 8px; padding: 6px 14px; border-radius: 999px; font-size: 12px; font-weight: 600; letter-spacing: 0.02em; color: var(--accent-primary); background: var(--badge-bg); border: 1px solid var(--border-subtle); } .land-h2 { font-size: clamp(26px, 3.2vw, 40px); font-weight: 800; letter-spacing: -0.03em; line-height: 1.2; color: var(--text-main); margin: 18px 0 12px; } .land-lede { font-size: 15px; line-height: 1.72; color: var(--text-muted); max-width: 62ch; } .land-head { margin-bottom: 44px; } /* ========================================================================== HERO: reserved, theme-configurable slots .hero-site-title <- 站点标题 (theme config: site_title) .hero-site-subtitle <- 站点副标题 (theme config: site_subtitle) ========================================================================== */ .hero-site-title { font-size: clamp(30px, 4.4vw, 58px); font-weight: 800; letter-spacing: -0.035em; line-height: 1.08; color: var(--text-main); margin: 22px 0 10px; } .hero-site-subtitle { font-size: clamp(13px, 1.5vw, 16px); font-weight: 600; letter-spacing: 0.02em; color: var(--accent-primary); margin-bottom: 18px; } .hero-tagline { max-width: 52ch; font-size: 15px; line-height: 1.72; color: var(--text-muted); } /* Deck brand slots also read from theme config */ .deck-brand-title { display: block; font-size: 15px; font-weight: 800; letter-spacing: -0.02em; line-height: 1.15; color: var(--text-main); max-width: 260px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .deck-brand-sub { display: block; font-size: 10px; font-family: var(--font-mono); letter-spacing: 0.14em; color: var(--text-dim); max-width: 260px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } /* Metric strip */ .metric-strip { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 1px; overflow: hidden; border-radius: 18px; background: var(--bg-card); backdrop-filter: blur(24px); -webkit-backdrop-filter: blur(24px); border: 1px solid var(--border-subtle); box-shadow: var(--shadow-card); } .metric-cell { padding: 26px 24px; background: transparent; text-align: left; } .metric-cell + .metric-cell { box-shadow: inset 1px 0 0 var(--border-subtle); } .metric-value { font-family: var(--font-mono); font-size: 27px; font-weight: 700; letter-spacing: -0.03em; color: var(--text-main); } .metric-label { margin-top: 5px; font-size: 12.5px; color: var(--text-dim); } /* Bento grid — 5 content cells, asymmetric rhythm */ .bento { display: grid; grid-template-columns: repeat(6, minmax(0, 1fr)); gap: 18px; } .bento-cell { padding: 28px; display: flex; flex-direction: column; } .bento-cell--wide { grid-column: span 4; } .bento-cell--tall { grid-column: span 2; grid-row: span 2; } .bento-cell--half { grid-column: span 3; } .bento-cell--third { grid-column: span 2; } .bento-cell--full { grid-column: span 6; } /* Client compatibility chips */ .client-chip { display: inline-flex; align-items: center; gap: 8px; padding: 9px 15px; border-radius: 11px; font-size: 12.5px; font-weight: 500; color: var(--text-muted); background: var(--badge-bg); border: 1px solid var(--border-subtle); transition: transform 0.2s cubic-bezier(0.16, 1, 0.3, 1), color 0.2s ease, border-color 0.2s ease; } .client-chip:hover { transform: translateY(-2px); color: var(--text-main); border-color: var(--border-medium); } /* Mini stat inside the tall bento cell */ .topo-row { display: flex; align-items: center; justify-content: space-between; padding: 11px 0; font-size: 12.5px; color: var(--text-muted); } .topo-row + .topo-row { box-shadow: inset 0 1px 0 var(--border-subtle); } .topo-row strong { color: var(--text-main); font-family: var(--font-mono); font-weight: 650; } .bento-icon { width: 42px; height: 42px; border-radius: 12px; display: inline-flex; align-items: center; justify-content: center; color: var(--accent-primary); background: rgba(var(--accent-rgb), 0.1); border: 1px solid rgba(var(--accent-rgb), 0.22); margin-bottom: 16px; } .bento-title { font-size: 16.5px; font-weight: 700; letter-spacing: -0.02em; color: var(--text-main); margin-bottom: 8px; } .bento-copy { font-size: 13.5px; line-height: 1.72; color: var(--text-muted); } /* Mini terminal inside bento */ .bento-term { margin-top: 18px; padding: 14px 16px; border-radius: 16px; font-family: var(--font-mono); font-size: 11.5px; line-height: 1.9; color: var(--text-muted); background: rgba(6, 9, 16, 0.55); border: 1px solid var(--border-subtle); } html.light .bento-term { background: rgba(15, 23, 42, 0.05); } /* Node network */ .node-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(210px, 1fr)); gap: 14px; } .node-chip { display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: 15px 18px; border-radius: 16px; background: var(--bg-card); border: 1px solid var(--border-subtle); transition: transform 0.2s cubic-bezier(0.16, 1, 0.3, 1), border-color 0.2s ease; } .node-chip:hover { transform: translateY(-2px); border-color: var(--border-medium); } .node-name { font-size: 13.5px; font-weight: 650; color: var(--text-main); } .node-sub { font-size: 11px; color: var(--text-dim); font-family: var(--font-mono); } .node-status { font-family: var(--font-mono); font-size: 12px; font-weight: 700; white-space: nowrap; color: var(--text-muted); } .node-status--online { color: var(--accent-emerald); } .node-status--offline { color: var(--accent-rose); } .node-status--unknown { color: var(--text-dim); } /* Pricing preview */ .price-grid { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 20px; } .price-cut { font-family: var(--font-mono); font-size: 30px; font-weight: 750; letter-spacing: -0.03em; color: var(--text-main); } .price-feat { display: flex; align-items: flex-start; gap: 9px; font-size: 13px; color: var(--text-muted); line-height: 1.6; } .price-feat svg { flex-shrink: 0; margin-top: 2px; color: var(--accent-emerald); } /* Steps */ .step-row { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 20px; } .step-num { font-family: var(--font-mono); font-size: 12px; font-weight: 700; letter-spacing: 0.1em; color: var(--accent-primary); } /* FAQ */ .faq-item { border-radius: 16px; overflow: hidden; background: var(--bg-card); border: 1px solid var(--border-subtle); transition: border-color 0.2s ease; } .faq-item:hover { border-color: var(--border-medium); } .faq-q { width: 100%; display: flex; align-items: center; justify-content: space-between; gap: 16px; padding: 17px 22px; font-size: 14px; font-weight: 600; color: var(--text-main); text-align: left; } .faq-caret { flex-shrink: 0; color: var(--text-dim); transition: transform 0.28s cubic-bezier(0.16, 1, 0.3, 1); } .faq-item.is-open .faq-caret { transform: rotate(180deg); color: var(--accent-primary); } .faq-a { padding: 0 22px 19px; font-size: 13.5px; line-height: 1.78; color: var(--text-muted); animation: riseIn 0.3s cubic-bezier(0.16, 1, 0.3, 1) both; } /* Final CTA */ .cta-band { position: relative; overflow: hidden; border-radius: 22px; padding: 60px 44px; text-align: center; background: radial-gradient(120% 160% at 15% 0%, rgba(var(--accent-rgb), 0.16), transparent 58%), radial-gradient(120% 160% at 85% 100%, rgba(99, 102, 241, 0.14), transparent 58%), var(--bg-card); border: 1px solid var(--border-subtle); box-shadow: var(--shadow-card); } /* Landing footer */ .land-footer { position: relative; z-index: 10; border-top: 1px solid var(--border-subtle); background: var(--badge-bg); } .land-footer-inner { max-width: 1440px; margin: 0 auto; padding: 44px 24px 34px; display: grid; grid-template-columns: 1.6fr repeat(3, minmax(0, 1fr)); gap: 30px; } .land-footer h4 { font-size: 12px; font-weight: 700; letter-spacing: 0.06em; color: var(--text-dim); margin-bottom: 12px; } .land-footer a { display: block; font-size: 13px; color: var(--text-muted); padding: 4px 0; } .land-footer a:hover { color: var(--accent-primary); } @media (max-width: 1023px) { .land-section { padding: 68px 18px; } .metric-strip { grid-template-columns: repeat(2, minmax(0, 1fr)); } .bento { grid-template-columns: repeat(2, minmax(0, 1fr)); } /* Every base span must be reset here, including --full: leaving span 6 in a 2-column grid creates implicit tracks and stretches the grid. */ .bento-cell--wide, .bento-cell--tall, .bento-cell--half, .bento-cell--third, .bento-cell--full { grid-column: span 2; grid-row: auto; } .price-grid, .step-row { grid-template-columns: 1fr; } .land-footer-inner { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 24px; } } @media (max-width: 640px) { .metric-strip { grid-template-columns: 1fr; } .bento { grid-template-columns: 1fr; gap: 14px; } .bento-cell--wide, .bento-cell--tall, .bento-cell--half, .bento-cell--third, .bento-cell--full { grid-column: span 1; } .bento-cell { padding: 20px; } .bento-title { font-size: 15.5px; } .bento-copy { font-size: 13px; } .client-chip { padding: 7px 12px; font-size: 12px; } .land-footer-inner { grid-template-columns: 1fr; } .cta-band { padding: 40px 22px; } } /* --- 13. Responsive --- */ @media (max-width: 1023px) { .deck-inner { height: 60px; padding: 0 16px; gap: 12px; } .deck-inner > .segmented-nav { display: none; } .deck-inner > .deck-brand { min-width: 0; flex-shrink: 1; } .deck-brand > span:last-child { min-width: 0; } .deck-brand-title, .deck-brand-sub { max-width: 100%; } .deck-main { padding: 20px 16px 36px; } .deck-brand-sub { display: none; } } @media (max-width: 640px) { .segmented-item { padding: 7px 10px; font-size: 12.5px; } .segmented-item span.seg-label { display: none; } .deck-balance { display: none; } .landing-deck-inner { display: grid; grid-template-columns: minmax(0, 1fr); height: auto; min-height: 60px; gap: 10px; padding: 10px 16px; } .landing-deck-inner .deck-brand { min-width: 0; max-width: 100%; } .landing-deck-inner .deck-actions { width: 100%; min-width: 0; margin-left: 0; justify-content: flex-start; gap: 8px; } .landing-deck-inner .theme-toggle-btn, .landing-deck-inner .deck-actions > button, .landing-deck-inner .deck-actions > a { min-height: 44px; } .landing-deck-inner .theme-toggle-btn, .landing-deck-inner .deck-actions > button:not(.btn-geek-primary):not(.btn-geek-secondary) { min-width: 44px; } .landing-deck-inner .deck-actions > .btn-geek-primary, .landing-deck-inner .deck-actions > .btn-geek-secondary { padding: 9px 12px; white-space: nowrap; } .land-h2--capabilities { overflow-wrap: anywhere; } .capabilities-break { display: none; } } /* ========================================================================== Nexus Markdown Typography Styling (Light / Dark Adaptive) ========================================================================== */ .markdown-body { color: var(--text-main); font-family: inherit; font-size: 14.5px; line-height: 1.75; word-wrap: break-word; } .markdown-body h1, .markdown-body h2, .markdown-body h3, .markdown-body h4, .markdown-body h5, .markdown-body h6 { color: var(--text-main); font-weight: 700; margin-top: 24px; margin-bottom: 12px; line-height: 1.35; letter-spacing: -0.01em; } .markdown-body h1 { font-size: 22px; padding-bottom: 8px; border-bottom: 1px solid var(--border-subtle); } .markdown-body h2 { font-size: 18px; padding-bottom: 6px; border-bottom: 1px solid var(--border-subtle); } .markdown-body h3 { font-size: 16px; } .markdown-body p { margin-top: 0; margin-bottom: 14px; } .markdown-body a { color: var(--accent-primary) !important; text-decoration: none !important; font-weight: 500; border-bottom: 1px dashed var(--accent-primary); transition: all 0.2s ease; } .markdown-body a:hover { opacity: 0.85; border-bottom-style: solid; } .markdown-body strong { color: var(--text-main); font-weight: 600; } .markdown-body ul, .markdown-body ol { margin-top: 0; margin-bottom: 14px; padding-left: 22px; } .markdown-body li { margin-bottom: 6px; } .markdown-body blockquote { margin: 16px 0; padding: 12px 18px; background: var(--badge-bg); border-left: 3px solid var(--accent-primary); border-radius: 0 10px 10px 0; color: var(--text-muted); font-size: 14px; } .markdown-body blockquote p:last-child { margin-bottom: 0; } .markdown-body code { font-family: 'JetBrains Mono', monospace; font-size: 12.5px; background: var(--badge-bg); color: var(--accent-primary); padding: 2px 6px; border-radius: 5px; border: 1px solid var(--border-subtle); } .markdown-body pre { margin: 16px 0; background: #090c13 !important; border: 1px solid rgba(255, 255, 255, 0.1); border-radius: 12px; padding: 16px; overflow-x: auto; position: relative; box-shadow: inset 0 2px 6px rgba(0, 0, 0, 0.4); } .markdown-body pre code { background: transparent !important; border: 0 !important; padding: 0 !important; color: #e2e8f0 !important; font-size: 13px; line-height: 1.6; } .markdown-body table { width: 100%; margin: 16px 0; border-collapse: separate; border-spacing: 0; border: 1px solid var(--border-subtle); border-radius: 10px; overflow: hidden; } .markdown-body th { background: var(--badge-bg); color: var(--text-main); font-weight: 600; padding: 10px 14px; text-align: left; border-bottom: 1px solid var(--border-subtle); font-size: 13px; } .markdown-body td { padding: 10px 14px; border-bottom: 1px solid var(--border-subtle); color: var(--text-muted); font-size: 13px; } .markdown-body tr:last-child td { border-bottom: none; } 机场不能用了怎么办?订阅失效、客户端报错与连接失败排查指南) Fixes the trapped-modal bug: modals are no longer nested inside backdrop-filter cards, which used to become their containing block. ========================================================================== */ .reader-overlay { position: fixed; inset: 0; z-index: 2000; display: flex; align-items: center; justify-content: center; padding: 28px; background: rgba(3, 5, 9, 0.68); backdrop-filter: blur(18px); -webkit-backdrop-filter: blur(18px); } .reader-panel { display: flex; flex-direction: column; width: min(960px, 94vw); max-height: 88vh; background: var(--bg-modal); border: 1px solid var(--border-medium); border-radius: 22px; box-shadow: var(--shadow-elevation); overflow: hidden; animation: modalScaleIn 0.34s cubic-bezier(0.16, 1, 0.3, 1) both; } .reader-head { display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: 15px 20px; border-bottom: 1px solid var(--border-subtle); background: var(--badge-bg); } .reader-head-left { display: flex; align-items: center; gap: 9px; } .reader-kicker { font-size: 13px; font-weight: 700; letter-spacing: 0.04em; color: var(--text-main); } .reader-count { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 11px; font-weight: 700; padding: 2px 8px; border-radius: 999px; color: var(--accent-primary); background: rgba(var(--accent-rgb), 0.12); border: 1px solid rgba(var(--accent-rgb), 0.28); } .reader-close { width: 32px; height: 32px; border-radius: 10px; display: inline-flex; align-items: center; justify-content: center; color: var(--text-muted); background: var(--bg-surface); border: 1px solid var(--border-subtle); transition: all 0.22s cubic-bezier(0.16, 1, 0.3, 1); } .reader-close:hover { color: var(--text-main); border-color: var(--border-medium); transform: rotate(90deg); } .reader-tabs { display: flex; gap: 6px; padding: 10px 16px; overflow-x: auto; border-bottom: 1px solid var(--border-subtle); scrollbar-width: none; } .reader-tabs::-webkit-scrollbar { display: none; } .reader-tab { display: inline-flex; align-items: center; gap: 7px; padding: 7px 12px; border-radius: 10px; font-size: 12.5px; white-space: nowrap; color: var(--text-muted); border: 1px solid transparent; transition: all 0.2s ease; } .reader-tab:hover { color: var(--text-main); background: var(--badge-bg); } .reader-tab.is-active { color: var(--accent-primary); background: var(--seg-indicator-bg); border-color: var(--seg-indicator-border); font-weight: 650; } .reader-pin { font-size: 10px; font-weight: 600; padding: 1px 6px; border-radius: 5px; color: var(--accent-amber); background: rgba(245, 158, 11, 0.12); border: 1px solid rgba(245, 158, 11, 0.28); } .reader-tab-text { max-width: 250px; overflow: hidden; text-overflow: ellipsis; } .reader-body { flex: 1; overflow-y: auto; padding: 34px 48px 44px; } .reader-article { max-width: 720px; margin: 0 auto; } .reader-meta { display: flex; align-items: center; justify-content: space-between; font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 11.5px; color: var(--text-dim); margin-bottom: 12px; } .reader-title { font-size: 25px; font-weight: 800; letter-spacing: -0.02em; line-height: 1.34; color: var(--text-main); margin: 0 0 22px; padding-bottom: 18px; border-bottom: 1px solid var(--border-subtle); } .reader-foot { display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: 12px 20px; border-top: 1px solid var(--border-subtle); background: var(--bg-surface); } .reader-hint { font-size: 11.5px; font-family: ui-monospace, SFMono-Regular, Menlo, monospace; color: var(--text-dim); } .reader-pop-enter-active, .reader-pop-leave-active { transition: opacity 0.24s ease; } .reader-pop-enter-from, .reader-pop-leave-to { opacity: 0; } @media (max-width: 768px) { .reader-overlay { padding: 0; } .reader-panel { width: 100vw; height: 100vh; max-height: 100vh; border-radius: 0; border: none; } .reader-body { padding: 22px 20px 30px; } .reader-title { font-size: 20px; } .reader-tab-text { max-width: 150px; } .reader-hint { display: none; } } /* ========================================================================== 12. LANDING PAGE SECTIONS ========================================================================== */ .land-section { position: relative; z-index: 10; max-width: 1440px; margin: 0 auto; padding: 96px 24px; } .land-section--tight { padding: 68px 24px; } .land-eyebrow { display: inline-flex; align-items: center; gap: 8px; padding: 6px 14px; border-radius: 999px; font-size: 12px; font-weight: 600; letter-spacing: 0.02em; color: var(--accent-primary); background: var(--badge-bg); border: 1px solid var(--border-subtle); } .land-h2 { font-size: clamp(26px, 3.2vw, 40px); font-weight: 800; letter-spacing: -0.03em; line-height: 1.2; color: var(--text-main); margin: 18px 0 12px; } .land-lede { font-size: 15px; line-height: 1.72; color: var(--text-muted); max-width: 62ch; } .land-head { margin-bottom: 44px; } /* ========================================================================== HERO: reserved, theme-configurable slots .hero-site-title <- 站点标题 (theme config: site_title) .hero-site-subtitle <- 站点副标题 (theme config: site_subtitle) ========================================================================== */ .hero-site-title { font-size: clamp(30px, 4.4vw, 58px); font-weight: 800; letter-spacing: -0.035em; line-height: 1.08; color: var(--text-main); margin: 22px 0 10px; } .hero-site-subtitle { font-size: clamp(13px, 1.5vw, 16px); font-weight: 600; letter-spacing: 0.02em; color: var(--accent-primary); margin-bottom: 18px; } .hero-tagline { max-width: 52ch; font-size: 15px; line-height: 1.72; color: var(--text-muted); } /* Deck brand slots also read from theme config */ .deck-brand-title { display: block; font-size: 15px; font-weight: 800; letter-spacing: -0.02em; line-height: 1.15; color: var(--text-main); max-width: 260px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .deck-brand-sub { display: block; font-size: 10px; font-family: var(--font-mono); letter-spacing: 0.14em; color: var(--text-dim); max-width: 260px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } /* Metric strip */ .metric-strip { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 1px; overflow: hidden; border-radius: 18px; background: var(--bg-card); backdrop-filter: blur(24px); -webkit-backdrop-filter: blur(24px); border: 1px solid var(--border-subtle); box-shadow: var(--shadow-card); } .metric-cell { padding: 26px 24px; background: transparent; text-align: left; } .metric-cell + .metric-cell { box-shadow: inset 1px 0 0 var(--border-subtle); } .metric-value { font-family: var(--font-mono); font-size: 27px; font-weight: 700; letter-spacing: -0.03em; color: var(--text-main); } .metric-label { margin-top: 5px; font-size: 12.5px; color: var(--text-dim); } /* Bento grid — 5 content cells, asymmetric rhythm */ .bento { display: grid; grid-template-columns: repeat(6, minmax(0, 1fr)); gap: 18px; } .bento-cell { padding: 28px; display: flex; flex-direction: column; } .bento-cell--wide { grid-column: span 4; } .bento-cell--tall { grid-column: span 2; grid-row: span 2; } .bento-cell--half { grid-column: span 3; } .bento-cell--third { grid-column: span 2; } .bento-cell--full { grid-column: span 6; } /* Client compatibility chips */ .client-chip { display: inline-flex; align-items: center; gap: 8px; padding: 9px 15px; border-radius: 11px; font-size: 12.5px; font-weight: 500; color: var(--text-muted); background: var(--badge-bg); border: 1px solid var(--border-subtle); transition: transform 0.2s cubic-bezier(0.16, 1, 0.3, 1), color 0.2s ease, border-color 0.2s ease; } .client-chip:hover { transform: translateY(-2px); color: var(--text-main); border-color: var(--border-medium); } /* Mini stat inside the tall bento cell */ .topo-row { display: flex; align-items: center; justify-content: space-between; padding: 11px 0; font-size: 12.5px; color: var(--text-muted); } .topo-row + .topo-row { box-shadow: inset 0 1px 0 var(--border-subtle); } .topo-row strong { color: var(--text-main); font-family: var(--font-mono); font-weight: 650; } .bento-icon { width: 42px; height: 42px; border-radius: 12px; display: inline-flex; align-items: center; justify-content: center; color: var(--accent-primary); background: rgba(var(--accent-rgb), 0.1); border: 1px solid rgba(var(--accent-rgb), 0.22); margin-bottom: 16px; } .bento-title { font-size: 16.5px; font-weight: 700; letter-spacing: -0.02em; color: var(--text-main); margin-bottom: 8px; } .bento-copy { font-size: 13.5px; line-height: 1.72; color: var(--text-muted); } /* Mini terminal inside bento */ .bento-term { margin-top: 18px; padding: 14px 16px; border-radius: 16px; font-family: var(--font-mono); font-size: 11.5px; line-height: 1.9; color: var(--text-muted); background: rgba(6, 9, 16, 0.55); border: 1px solid var(--border-subtle); } html.light .bento-term { background: rgba(15, 23, 42, 0.05); } /* Node network */ .node-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(210px, 1fr)); gap: 14px; } .node-chip { display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: 15px 18px; border-radius: 16px; background: var(--bg-card); border: 1px solid var(--border-subtle); transition: transform 0.2s cubic-bezier(0.16, 1, 0.3, 1), border-color 0.2s ease; } .node-chip:hover { transform: translateY(-2px); border-color: var(--border-medium); } .node-name { font-size: 13.5px; font-weight: 650; color: var(--text-main); } .node-sub { font-size: 11px; color: var(--text-dim); font-family: var(--font-mono); } .node-status { font-family: var(--font-mono); font-size: 12px; font-weight: 700; white-space: nowrap; color: var(--text-muted); } .node-status--online { color: var(--accent-emerald); } .node-status--offline { color: var(--accent-rose); } .node-status--unknown { color: var(--text-dim); } /* Pricing preview */ .price-grid { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 20px; } .price-cut { font-family: var(--font-mono); font-size: 30px; font-weight: 750; letter-spacing: -0.03em; color: var(--text-main); } .price-feat { display: flex; align-items: flex-start; gap: 9px; font-size: 13px; color: var(--text-muted); line-height: 1.6; } .price-feat svg { flex-shrink: 0; margin-top: 2px; color: var(--accent-emerald); } /* Steps */ .step-row { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 20px; } .step-num { font-family: var(--font-mono); font-size: 12px; font-weight: 700; letter-spacing: 0.1em; color: var(--accent-primary); } /* FAQ */ .faq-item { border-radius: 16px; overflow: hidden; background: var(--bg-card); border: 1px solid var(--border-subtle); transition: border-color 0.2s ease; } .faq-item:hover { border-color: var(--border-medium); } .faq-q { width: 100%; display: flex; align-items: center; justify-content: space-between; gap: 16px; padding: 17px 22px; font-size: 14px; font-weight: 600; color: var(--text-main); text-align: left; } .faq-caret { flex-shrink: 0; color: var(--text-dim); transition: transform 0.28s cubic-bezier(0.16, 1, 0.3, 1); } .faq-item.is-open .faq-caret { transform: rotate(180deg); color: var(--accent-primary); } .faq-a { padding: 0 22px 19px; font-size: 13.5px; line-height: 1.78; color: var(--text-muted); animation: riseIn 0.3s cubic-bezier(0.16, 1, 0.3, 1) both; } /* Final CTA */ .cta-band { position: relative; overflow: hidden; border-radius: 22px; padding: 60px 44px; text-align: center; background: radial-gradient(120% 160% at 15% 0%, rgba(var(--accent-rgb), 0.16), transparent 58%), radial-gradient(120% 160% at 85% 100%, rgba(99, 102, 241, 0.14), transparent 58%), var(--bg-card); border: 1px solid var(--border-subtle); box-shadow: var(--shadow-card); } /* Landing footer */ .land-footer { position: relative; z-index: 10; border-top: 1px solid var(--border-subtle); background: var(--badge-bg); } .land-footer-inner { max-width: 1440px; margin: 0 auto; padding: 44px 24px 34px; display: grid; grid-template-columns: 1.6fr repeat(3, minmax(0, 1fr)); gap: 30px; } .land-footer h4 { font-size: 12px; font-weight: 700; letter-spacing: 0.06em; color: var(--text-dim); margin-bottom: 12px; } .land-footer a { display: block; font-size: 13px; color: var(--text-muted); padding: 4px 0; } .land-footer a:hover { color: var(--accent-primary); } @media (max-width: 1023px) { .land-section { padding: 68px 18px; } .metric-strip { grid-template-columns: repeat(2, minmax(0, 1fr)); } .bento { grid-template-columns: repeat(2, minmax(0, 1fr)); } /* Every base span must be reset here, including --full: leaving span 6 in a 2-column grid creates implicit tracks and stretches the grid. */ .bento-cell--wide, .bento-cell--tall, .bento-cell--half, .bento-cell--third, .bento-cell--full { grid-column: span 2; grid-row: auto; } .price-grid, .step-row { grid-template-columns: 1fr; } .land-footer-inner { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 24px; } } @media (max-width: 640px) { .metric-strip { grid-template-columns: 1fr; } .bento { grid-template-columns: 1fr; gap: 14px; } .bento-cell--wide, .bento-cell--tall, .bento-cell--half, .bento-cell--third, .bento-cell--full { grid-column: span 1; } .bento-cell { padding: 20px; } .bento-title { font-size: 15.5px; } .bento-copy { font-size: 13px; } .client-chip { padding: 7px 12px; font-size: 12px; } .land-footer-inner { grid-template-columns: 1fr; } .cta-band { padding: 40px 22px; } } /* --- 13. Responsive --- */ @media (max-width: 1023px) { .deck-inner { height: 60px; padding: 0 16px; gap: 12px; } .deck-inner > .segmented-nav { display: none; } .deck-inner > .deck-brand { min-width: 0; flex-shrink: 1; } .deck-brand > span:last-child { min-width: 0; } .deck-brand-title, .deck-brand-sub { max-width: 100%; } .deck-main { padding: 20px 16px 36px; } .deck-brand-sub { display: none; } } @media (max-width: 640px) { .segmented-item { padding: 7px 10px; font-size: 12.5px; } .segmented-item span.seg-label { display: none; } .deck-balance { display: none; } .landing-deck-inner { display: grid; grid-template-columns: minmax(0, 1fr); height: auto; min-height: 60px; gap: 10px; padding: 10px 16px; } .landing-deck-inner .deck-brand { min-width: 0; max-width: 100%; } .landing-deck-inner .deck-actions { width: 100%; min-width: 0; margin-left: 0; justify-content: flex-start; gap: 8px; } .landing-deck-inner .theme-toggle-btn, .landing-deck-inner .deck-actions > button, .landing-deck-inner .deck-actions > a { min-height: 44px; } .landing-deck-inner .theme-toggle-btn, .landing-deck-inner .deck-actions > button:not(.btn-geek-primary):not(.btn-geek-secondary) { min-width: 44px; } .landing-deck-inner .deck-actions > .btn-geek-primary, .landing-deck-inner .deck-actions > .btn-geek-secondary { padding: 9px 12px; white-space: nowrap; } .land-h2--capabilities { overflow-wrap: anywhere; } .capabilities-break { display: none; } } /* ========================================================================== Nexus Markdown Typography Styling (Light / Dark Adaptive) ========================================================================== */ .markdown-body { color: var(--text-main); font-family: inherit; font-size: 14.5px; line-height: 1.75; word-wrap: break-word; } .markdown-body h1, .markdown-body h2, .markdown-body h3, .markdown-body h4, .markdown-body h5, .markdown-body h6 { color: var(--text-main); font-weight: 700; margin-top: 24px; margin-bottom: 12px; line-height: 1.35; letter-spacing: -0.01em; } .markdown-body h1 { font-size: 22px; padding-bottom: 8px; border-bottom: 1px solid var(--border-subtle); } .markdown-body h2 { font-size: 18px; padding-bottom: 6px; border-bottom: 1px solid var(--border-subtle); } .markdown-body h3 { font-size: 16px; } .markdown-body p { margin-top: 0; margin-bottom: 14px; } .markdown-body a { color: var(--accent-primary) !important; text-decoration: none !important; font-weight: 500; border-bottom: 1px dashed var(--accent-primary); transition: all 0.2s ease; } .markdown-body a:hover { opacity: 0.85; border-bottom-style: solid; } .markdown-body strong { color: var(--text-main); font-weight: 600; } .markdown-body ul, .markdown-body ol { margin-top: 0; margin-bottom: 14px; padding-left: 22px; } .markdown-body li { margin-bottom: 6px; } .markdown-body blockquote { margin: 16px 0; padding: 12px 18px; background: var(--badge-bg); border-left: 3px solid var(--accent-primary); border-radius: 0 10px 10px 0; color: var(--text-muted); font-size: 14px; } .markdown-body blockquote p:last-child { margin-bottom: 0; } .markdown-body code { font-family: 'JetBrains Mono', monospace; font-size: 12.5px; background: var(--badge-bg); color: var(--accent-primary); padding: 2px 6px; border-radius: 5px; border: 1px solid var(--border-subtle); } .markdown-body pre { margin: 16px 0; background: #090c13 !important; border: 1px solid rgba(255, 255, 255, 0.1); border-radius: 12px; padding: 16px; overflow-x: auto; position: relative; box-shadow: inset 0 2px 6px rgba(0, 0, 0, 0.4); } .markdown-body pre code { background: transparent !important; border: 0 !important; padding: 0 !important; color: #e2e8f0 !important; font-size: 13px; line-height: 1.6; } .markdown-body table { width: 100%; margin: 16px 0; border-collapse: separate; border-spacing: 0; border: 1px solid var(--border-subtle); border-radius: 10px; overflow: hidden; } .markdown-body th { background: var(--badge-bg); color: var(--text-main); font-weight: 600; padding: 10px 14px; text-align: left; border-bottom: 1px solid var(--border-subtle); font-size: 13px; } .markdown-body td { padding: 10px 14px; border-bottom: 1px solid var(--border-subtle); color: var(--text-muted); font-size: 13px; } .markdown-body tr:last-child td { border-bottom: none; } v2rayNG 2.3.11 安装后配置检查与常见问题排查
← 返回 Sisc Link 使用指南与常见问题整理 首页

v2rayNG APK 下载、架构选择与安装校验指南

更新于 2026-10-31 · sisc.website

简答:v2rayNG APK 建议只从 2dust/v2rayNG 的官方 GitHub Releases 页面获取,不要把搜索结果中的第三方镜像当作官方入口。截至 2026 年 10 月 31 日,页面顶部显示 2.3.11,但页面标记为 Pre-release,因此不能直接把它称为最新稳定版。下载后先确认文件名和架构,再按需核对 SHA-256 或 GPG 签名;安装完成后还需要合法、兼容的配置或订阅,v2rayNG 本身不提供节点。

定义:v2rayNG 是一款运行在 Android 上的客户端,官方项目说明其支持 Xray core 和 v2fly core,用于导入配置或订阅并建立连接。

先看结论:从哪里下载、哪个 APK 更合适

本文是 Sisc Link 使用指南与常见问题整理提供的第三方使用说明,不是 v2rayNG 官方页面。最短路径是:打开官方 GitHub Releases 页面,进入顶部发布项的 Assets,根据设备 ABI 选择 APK,下载后再安装。官方仓库 README 也将该 Releases 页面列为最新发布入口,并明确 v2rayNG 是 Android 客户端;电脑版项目另行使用 v2rayN。

截至 2026 年 10 月 31 日,本次核验到的 Releases 页面顶部是 2.3.11,发布日期显示为 2026 年 10 月 11 日,但页面同时标记为 Pre-release。因此,本文不把它表述为“最新稳定版”;如果你只接受正式稳定版,应在同一页面查看发布标签和说明后再决定。

你的情况优先查看的文件名结尾怎么判断
已确认是 64 位 ARM 手机或平板arm64-v8a.apk对应 Android 的 64 位 ARM ABI,通常体积比通用包小。
已确认是 32 位 ARM 设备armeabi-v7a.apk用于 32 位 ARM,不要因为设备较旧就直接猜选它。
Android 模拟器或 x86 设备x86.apk 或 x86_64.apk根据模拟器或设备报告的 ABI 选择。
无法确认架构universal.apk官方 Wiki 将 Universal 说明为包含多种架构库的通用包,但体积通常更大。

官方项目的Android 发布文件说明列出了标准 APK、F-Droid 构建包以及签名文件。选择原则是“先确认架构,再选专用包”;确认不了时选择 Universal,不要把“近几年手机”当成架构判断依据。

五步完成 v2rayNG APK 下载与安装

  1. 打开可信入口。手动进入 github.com/2dust/v2rayNG/releases,核对仓库路径为 2dust/v2rayNG。不要只看搜索结果中的版本号、文件名或所谓“高速下载”按钮。
  2. 展开正确的发布项。在页面顶部发布项中展开 Assets。优先选择以 .apk 结尾的安装包;.sig、.asc 是校验相关文件,不是可以直接安装的 APK。当前页面的 Assets 可能因 GitHub 加载状态而延迟显示,刷新后仍看不到时不要随意改用镜像。
  3. 确认文件名。检查版本号、是否带 -fdroid、架构结尾以及文件扩展名。标准包和 F-Droid 构建包不要混为同一个文件;如果你没有明确需要某种构建来源,先按官方发布说明选择与设备匹配的标准 APK。
  4. 允许本次来源安装。Android 8.0 及以上通常需要进入“设置 → 应用 → 特殊应用权限 → 安装未知应用”,选择实际下载 APK 的浏览器或文件管理器,然后打开“允许安装未知应用”。不同厂商的菜单名称可能不同,可在系统设置搜索“安装未知应用”。Android 官方文档说明,该权限是按具体来源授予的,不是打开一次后所有来源都自动允许;安装完成后可以关闭该权限。
  5. 安装并确认结果。在下载目录点击 APK,若系统提示“应用未安装”,先记录提示文字,不要连续下载多个随机版本。成功标准是安装器完成、桌面出现 v2rayNG、应用可以打开;这不等于已经连接成功,后续仍需导入合法有效的配置或订阅。

Android 对非应用商店来源的安装会要求用户主动授权;具体机制可参考Android Developers 关于未知来源安装的说明。Android 7.1.1 及更低版本的入口通常是“设置 → 安全 → 未知来源”,但旧系统和厂商界面差异较大。

不知道 arm64-v8a、armeabi-v7a、x86 怎么选?按这个顺序确认

架构名叫 ABI,表示 APK 中原生库面向的处理器指令集。Android 官方将 armeabi-v7a 对应为 32 位 ARM、arm64-v8a 对应为 64 位 ARM、x86 对应为 32 位 x86、x86_64 对应为 64 位 x86,具体定义可查看Android NDK ABI 文档。

  1. 优先用设备信息页面确认。在系统“关于手机”中记录型号和 Android 版本;如果页面直接显示 CPU ABI 或支持的 ABI,按完整字符串匹配。只看到处理器品牌、核心数量或“64 位处理器”时,不要把它直接等同于 Android 当前运行环境。
  2. 使用设备信息工具查看 ABI。选择能够显示“Supported ABIs”“CPU ABI”或“应用架构”的设备信息工具,重点看是否出现 arm64-v8a、armeabi-v7a、x86 或 x86_64。工具名称和显示字段可能变化,结果应以 ABI 字符串为准。
  3. 有电脑时使用 ADB。开启 USB 调试并连接设备,在终端运行:
adb shell getprop ro.product.cpu.abi
adb shell getprop ro.product.cpu.abilist

第一条通常返回首选 ABI,第二条返回设备支持的 ABI 列表。Android 官方资料也使用 adb shell getprop ro.product.cpu.abi 检查设备架构,并说明 ro.product.cpu.abilist 可列出支持的架构。输出为 arm64-v8a 就选对应包;输出为 armeabi-v7a 就选 32 位 ARM 包;输出为 x86_64 或 x86 就选择相应 x86 包。

如果 ADB 未连接、设备信息互相矛盾,最稳妥的回退方式是选择同一 Release 中的 universal.apk。它解决的是“架构不确定”,不能解决下载文件被篡改、版本不兼容或配置本身无效。

普通 APK、F-Droid APK、SHA-256 与 GPG 怎么区分

普通 APK是 Release 中按架构发布的常规安装包;F-Droid APK通常会在文件名中带 -fdroid,属于不同构建来源。官方 Wiki 将两者分开列出,并说明 F-Droid 构建也会按架构拆分。对于普通用户,关键不是追求某个文件名,而是确认来源、版本、架构和签名是否一致。

SHA-256 校验:只有当同一个 Release 的资产列表或发布说明提供了对应哈希时,才进行比对。不要把网上其他页面写出的哈希值当成当前 APK 的哈希。下载 APK 后,在电脑终端运行:

sha256sum v2rayNG_版本_架构.apk

将终端输出的 64 位十六进制字符串与同一 Release 为同一文件提供的 SHA-256 逐字符比较;文件名、版本或架构任一不同,都不能共用校验值。若 Release 没有提供对应 checksum,不要声称“已完成 SHA-256 验证”,只能保留来源核验或使用 GPG 签名。

GPG 校验:官方仓库 README 公布了用于核对的公钥指纹:7694 5E9F 3E9A 168F 8070 F195 805D 661C 134D FAF6 8903 C199 463C 31E5 AE90 3AE0。只有在同一 Release 提供公钥文件和对应 APK 的 .sig 或 .asc 文件时,才执行以下流程:

gpg --import v2rayN-public-key.asc
gpg --fingerprint
gpg --verify v2rayNG_版本_架构.apk.sig v2rayNG_版本_架构.apk

先在 gpg --fingerprint 输出中核对完整指纹,再看 gpg --verify 的结果。文件名只是结构示例,必须替换成 Assets 中实际存在的文件名;如果缺少公钥、签名文件或指纹无法对应,就把 GPG 验证降级为“未完成”,不要继续宣称安装包已验证。

官方仓库的README说明 Release 文件使用 GPG 签名,并公布了上述指纹;官方 Wiki 则说明了 .asc、.sig 与 APK 之间的关系。两类来源都缺失时,最基本的安全动作仍是回到官方仓库核对路径和 Release 资产。

安装失败、闪退或打开后不能连接:按现象排查

现象先检查处理与回滚
提示“应用未安装”或解析失败APK 是否完整、架构是否匹配、设备是否已有冲突版本删除不完整下载,重新从同一 Release 获取;确认 ABI,无法确认时改用 Universal。不要同时更换版本、来源和架构。
安装按钮不可用下载浏览器或文件管理器是否获得“安装未知应用”权限回到“设置 → 应用 → 特殊应用权限 → 安装未知应用”,只给实际启动安装的来源授权,安装后关闭。
安装后立即闪退系统版本、包来源、是否混装标准版与 F-Droid 构建卸载当前包并保留配置备份,再从同一 Release 选择另一种匹配架构;若只有特定版本复现,记录版本号和设备型号。
应用能打开但没有节点是否已有配置或订阅v2rayNG 是客户端,不会因为安装 APK 自动生成节点。向你使用的服务获取合法配置或订阅,再按其要求导入。
导入后无法连接订阅是否过期、链接是否完整、协议和核心是否兼容、系统 VPN 权限是否允许先重新复制原始订阅并更新,再只测试一个配置;不要把“VPN 权限已开启”当作目标连接成功,仍需查看应用日志或实际访问结果。

排障时建议一次只改一个变量:先确认 APK 来源和架构,再确认安装权限,最后才处理配置和连接。若问题来自具体服务的订阅失效,应先在该服务的公开入口或账户后台核对状态;无法核实的价格、状态、兼容性和故障,不要用其他页面的说法替代。

安装后如何导入配置,以及它与其他客户端的区别

安装成功后,常见入口通常包括扫描二维码、从剪贴板导入单条分享链接、导入本地配置文件或添加订阅地址。由于客户端界面会随版本变化,建议以当前应用显示的菜单名称为准:先准备合法有效的配置或订阅,导入后检查配置名称、服务器地址、端口、协议和传输参数是否完整,再选择单个配置测试。不要把订阅地址公开粘贴到论坛、截图或聊天群中。

v2rayNG、v2rayN 和 v2flyNG 不能只按名称判断是否互换:

名称主要平台本文中的判断
v2rayNGAndroid手机或平板下载 APK 时选择它;官方 README 说明其支持 Xray core 和 v2fly core。
v2rayN桌面系统官方 README 将其作为桌面版本,与 Android 客户端不是同一个安装包。
v2flyNG其他 Android 客户端名称不要因名称相似就把其 APK 当作 v2rayNG 官方发布文件,需单独核验项目来源和兼容性。

如果你使用的是网络加速服务,客户端只是入口,服务方提供的订阅格式、协议和有效期仍需单独确认。遇到失联时,先保存原订阅和本地配置,再核对服务入口;不要为了“修复连接”安装来源不明的所谓专用 APK。

常见问题

v2rayNG APK 从哪里下载最安全?

优先从 2dust/v2rayNG 的官方 GitHub Releases 页面下载,并核对仓库路径、发布标签、Assets 文件名和架构。本文不把第三方镜像或搜索结果中的下载按钮视为官方入口。

截至 2026 年 10 月 31 日,v2rayNG 最新稳定版是多少?

本次核验到的 Releases 页面顶部是 2.3.11,页面标记为 Pre-release,因此只能说它是页面顶部发布项,不能据此称为最新稳定版。需要正式稳定版时,应在同一页面查看是否有未标记为 Pre-release 的发布项。

普通 Android 手机应该下载 arm64-v8a 吗?

不要直接猜。先用设备信息工具或 ADB 查看 ABI;输出 arm64-v8a 才选择该包。无法确认时可选择同一 Release 的 universal.apk,虽然包体通常更大。

下载页面没有 SHA-256,应该怎么办?

不要自行套用其他网页的哈希值。只有同一 Release 对同一文件提供 SHA-256 时才能比对;如果没有,就改做来源核验,或在同一 Release 同时提供公钥和签名文件时进行 GPG 校验。

v2rayNG 安装好了,为什么仍然不能使用?

v2rayNG 是客户端,不会自动提供节点或订阅。你还需要准备合法、有效且与客户端兼容的配置或订阅,导入后再检查 VPN 权限、订阅状态和单个配置的连接日志。

安装 APK 时提示“应用未安装”怎么办?

先检查文件是否下载完整、架构是否匹配、是否开启了实际下载来源的安装权限,以及设备中是否已有冲突构建。一次只修改一个变量;无法确认架构时可回到同一 Release 选择 Universal。

相关阅读

参考资料

  1. 2dust/v2rayNG 官方 GitHub Releases
  2. 2dust/v2rayNG 官方 GitHub 仓库与 README
  3. v2rayNG 官方 Wiki:Android 发布文件说明
  4. Android Developers:通过网站分发 APK 与安装未知应用
  5. Android Developers:Android ABIs
  6. Android Developers:使用 adb 检查设备 CPU 架构