mcpField
A
android-playstore-scan

android-playstore-scan

github.com/hitoshura25开发353 次安装41 周前更新
代码仓库

关于 android-playstore-scan

Android Play Store Scanner 是面向 Android 项目开发者的只读分析技能,可根据项目代码生成 Play Console 设置清单。它检查清单文件、依赖、常见 SDK 和隐私政策状态,但不会修改项目文件。

主要功能

  1. 01扫描 AndroidManifest.xml 权限和功能
  2. 02分析 Gradle 配置与依赖
  3. 03检测 Health Connect、广告和分析 SDK
  4. 04检查隐私政策并提供建议网址
  5. 05生成 Play Console 设置清单

适用场景

  1. 01准备应用的 Play Console 设置
  2. 02确认项目声明的权限和集成
  3. 03找出隐私政策等缺失配置

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/hitoshura25/claude-devtools --skill android-playstore-scan

安装后在 Claude Code 中输入/android-playstore-scan确认已加载。

详细介绍

Android Play Store 扫描器

仅分析 - 扫描你的 Android 项目,并生成完整的 Play Console 设置清单。不会修改任何文件。

概述

用途:

  • 分析项目,检测应用功能和要求
  • 根据代码分析预填 Play Console 设置答案
  • 确定缺失的配置(隐私政策等)
  • 生成可执行的 Play Console 设置清单

此技能的功能:

  1. 扫描 AndroidManifest.xml,查找权限和功能
  2. 分析 build.gradle,检查 SDK 和依赖项
  3. 检测 Health Connect、广告和分析功能
  4. 检查隐私政策 URL
  5. 生成已预填答案的 PLAY_CONSOLE_SETUP.md
  6. 针对缺失项目提供建议

此技能不会执行以下操作:

  • ❌ 不会创建或修改任何项目文件
  • ❌ 不会设置 GitHub Actions 或工作流
  • ❌ 不会生成隐私政策(请使用 /devtools:privacy-policy-generate)
  • ❌ 不会配置签名或发布构建

先决条件

  • 包含 AndroidManifest.xml 的 Android 项目
  • 构建配置文件(build.gradle.kts)

输入

输入必填默认值描述
project_path是.Android 项目根目录

流程

第 1 步:扫描 AndroidManifest.xml
echo "📱 Scanning AndroidManifest.xml..."

# Get package name
PACKAGE_NAME=$(grep "package=" app/src/main/AndroidManifest.xml | head -1 | sed 's/.*package="\([^"]*\)".*/\1/')
echo "  Package: $PACKAGE_NAME"

# Get app name
APP_NAME=$(grep 'name="app_name"' app/src/main/res/values/strings.xml 2>/dev/null | sed 's/.*>\([^<]*\)<.*/\1/' || echo "Unknown")
echo "  App name: $APP_NAME"

# Check permissions
echo "  Scanning permissions..."
PERMISSIONS=$(grep "<uses-permission" app/src/main/AndroidManifest.xml | sed 's/.*android:name="\([^"]*\)".*/\1/')

# Detect features
INTERNET=$(echo "$PERMISSIONS" | grep -q "INTERNET" && echo "Yes" || echo "No")
LOCATION=$(echo "$PERMISSIONS" | grep -q "LOCATION" && echo "Yes" || echo "No")
CAMERA=$(echo "$PERMISSIONS" | grep -q "CAMERA" && echo "Yes" || echo "No")
HEALTH=$(echo "$PERMISSIONS" | grep -q "health.permission" && echo "Yes" || echo "No")

echo "    Internet: $INTERNET"
echo "    Location: $LOCATION"
echo "    Camera: $CAMERA"
echo "    Health Connect: $HEALTH"
第 2 步:分析依赖项
echo "📦 Scanning build.gradle.kts..."

# Check for ads
ADS_DETECTED="No"
if grep -q "admob" app/build.gradle.kts 2>/dev/null; then
    ADS_DETECTED="Yes (AdMob)"
elif grep -q "facebook-ads" app/build.gradle.kts 2>/dev/null; then
    ADS_DETECTED="Yes (Facebook Audience Network)"
fi
echo "  Ads: $ADS_DETECTED"

# Check for analytics
ANALYTICS_DETECTED=""
grep -q "firebase-analytics" app/build.gradle.kts 2>/dev/null && ANALYTICS_DETECTED="Firebase Analytics"
grep -q "google-analytics" app/build.gradle.kts 2>/dev/null && ANALYTICS_DETECTED="${ANALYTICS_DETECTED} Google Analytics"
echo "  Analytics: ${ANALYTICS_DETECTED:-None}"

# Check for payments
PAYMENTS="No"
grep -q "billing" app/build.gradle.kts 2>/dev/null && PAYMENTS="Yes (Google Play Billing)"
echo "  In-app purchases: $PAYMENTS"

# Check for auth
AUTH_DETECTED=""
grep -q "firebase-auth" app/build.gradle.kts 2>/dev/null && AUTH_DETECTED="Firebase Auth"
grep -q "play-services-auth" app/build.gradle.kts 2>/dev/null && AUTH_DETECTED="${AUTH_DETECTED} Google Sign-In"
echo "  Authentication: ${AUTH_DETECTED:-None detected}"
第 3 步:检查隐私政策
echo "🔒 Checking for privacy policy..."

PRIVACY_POLICY_URL=""
# Check common locations
if [ -f docs/privacy-policy.md ]; then
    PRIVACY_POLICY_URL="https://$(git config remote.origin.url | sed 's/.*github.com[:/]\(.*\)\.git/\1/')/privacy-policy"
    echo "  ✓ Found: docs/privacy-policy.md"
    echo "  Suggested URL: $PRIVACY_POLICY_URL"
elif grep -q "privacy" README.md 2>/dev/null; then
    echo "  ⚠️  Privacy policy mentioned in README but not found in docs/"
else
    echo "  ❌ Privacy policy not found"
    PRIVACY_POLICY_URL="⚠️ ACTION REQUIRED"
fi
第 4 步:检测 Health Connect 数据类型

如果检测到 Health Connect:

if [ "$HEALTH" = "Yes" ]; then
    echo "💚 Analyzing Health Connect integration..."

    HEALTH_DATA_TYPES=""
    grep -q "STEPS" app/src/main/AndroidManifest.xml && HEALTH_DATA_TYPES="${HEALTH_DATA_TYPES}- Steps (read/write)\n"
    grep -q "HEART_RATE" app/src/main/AndroidManifest.xml && HEALTH_DATA_TYPES="${HEALTH_DATA_TYPES}- Heart rate (read)\n"
    grep -q "SLEEP" app/src/main/AndroidManifest.xml && HEALTH_DATA_TYPES="${HEALTH_DATA_TYPES}- Sleep sessions (read)\n"
    grep -q "EXERCISE" app/src/main/AndroidManifest.xml && HEALTH_DATA_TYPES="${HEALTH_DATA_TYPES}- Exercise sessions (read/write)\n"

    echo -e "  Health data types:\n$HEALTH_DATA_TYPES"
fi
第 5 步:估算内容分级
echo "🎯 Estimating content rating..."

# Simple heuristic - actual rating requires IARC questionnaire
ESTIMATED_RATING="Everyone (E)"

if grep -qi "violence\|weapon\|blood" app/src/main/res/values/strings.xml 2>/dev/null; then
    ESTIMATED_RATING="Teen (T) - Violence detected"
elif grep -qi "gambling\|casino\|lottery" app/src/main/res/values/strings.xml 2>/dev/null; then
    ESTIMATED_RATING="Mature (M) - Gambling detected"
fi

echo "  Estimated: $ESTIMATED_RATING"
echo "  Note: Complete official IARC questionnaire in Play Console"
第 6 步:生成 PLAY_CONSOLE_SETUP.md

创建完整的设置指南:

# Play Console Setup Guide for: {APP_NAME}

Generated: {CURRENT_DATE}

---

## Summary

| Property | Value |
|----------|-------|
| **Package Name** | {PACKAGE_NAME} |
| **App Name** | {APP_NAME} |
| **Privacy Policy** | {PRIVACY_POLICY_STATUS} |
| **Uses Health Connect** | {HEALTH_DETECTED} |
| **Contains Ads** | {ADS_DETECTED} |
| **In-App Purchases** | {IAP_DETECTED} |

---

## 1. Privacy Policy

**Status:** {PRIVACY_STATUS}

{IF_NOT_FOUND}
**⚠️ ACTION REQUIRED:** No privacy policy found

**Recommended action:**

/devtools:privacy-policy-generate


This will create a privacy policy at `docs/privacy-policy.md` ready for GitHub Pages.
{ELSE}
**✓ Privacy policy found:** `docs/privacy-policy.md`

**Suggested URL:** `{PRIVACY_URL}`

**Next steps:**
1. Enable GitHub Pages (Settings → Pages → Source: docs/)
2. Wait 1-2 minutes for deployment
3. Verify URL is accessible
4. Add URL to Play Console
{END_IF}

---

## 2. App Access

**Detected:** {ACCESS_ANALYSIS}

{IF_AUTH_DETECTED}
**Answer:** "Yes, some functionality requires special access"

**Instructions to provide:**
- Test account credentials (if applicable)
- How to access restricted features
{ELSE}
**Answer:** "All functionality available without special access"
{END_IF}

---

## 3. Ads Declaration

**Detected SDKs:** {ADS_DETECTED}

{IF_ADS}
**Answer:** "Yes, my app contains ads"

**Ad networks:** {AD_NETWORKS_LIST}
{ELSE}
**Answer:** "No, my app does not contain ads"
{END_IF}

---

## 4. Content Rating

**Estimated Rating:** {ESTIMATED_RATING}

**Action Required:**
1. Go to Play Console → **App content** → **Content rating**
2. Complete IARC questionnaire
3. Answer questions about:
   - Violence
   - Sexual content
   - Profanity
   - Controlled substances
   - Gambling
   - User-generated content

---

## 5. Data Safety Form

**Data Collection Detected:**

| Data Type | Collected | Purpose |
|-----------|-----------|---------|
{IF_HEALTH}
| Health & Fitness | Yes | Health Connect integration |
{END_IF}
{IF_LOCATION}
| Location | Yes | {LOCATION_PURPOSE} |
{END_IF}
{IF_ANALYTICS}
| App activity | Yes | Analytics ({ANALYTICS_SERVICES}) |
{END_IF}
| Device ID | {DEVICE_ID_COLLECTED} | {DEVICE_ID_PURPOSE} |

**Security Practices:**

| Practice | Status | Notes |
|----------|--------|-------|
| Data encrypted in transit | {HTTPS_DETECTED} | HTTPS detected in network config |
| Data encrypted at rest | ⚠️ User to confirm | Depends on implementation |
| Users can request deletion | ⚠️ User to confirm | Add if applicable |

**Recommended answers:**
- Data is collected: {DATA_COLLECTED}
- Data is shared: {DATA_SHARED}
- Data collection is optional: {DATA_OPTIONAL}

---

{IF_HEALTH}
## 6. Health App Declaration

**⚠️ REQUIRED:** Your app uses Health Connect

**Health Data Types Detected:**
{HEALTH_DATA_TYPES_LIST}

**Action Required:**
1. Go to Play Console → **App content** → **Health**
2. Select "Yes, my app accesses health data"
3. List all health data types your app accesses
4. Explain how each data type is used
5. Confirm privacy policy includes health data disclosure

**Privacy Policy Requirements:**
- ✅ Must explain what health data is accessed
- ✅ Must explain why it's accessed
- ✅ Must explain how it's stored
- ✅ Must explain if it's shared with third parties

**Verify privacy policy includes Health Data section**
{END_IF}

---

## 7. Store Listing (Draft)

**Title:** {APP_NAME}

**Short Description (80 chars):**
{GENERATED_SHORT_DESC}

**Full Description:**
{GENERATED_FULL_DESC}

⚠️ Review and customize these descriptions before submitting

---

## 8. First Upload Checklist

Before you can use automated deployments, you must manually upload your first release:

### Preparation

- [ ] Run `/devtools:android-keystore-generation` (if not done)
- [ ] Run `/devtools:android-signing-config`
- [ ] Build release AAB: `./gradlew bundleRelease`
- [ ] Verify AAB is signed: `jarsigner -verify -verbose app/build/outputs/bundle/release/app-release.aab`

### Play Console First Upload

- [ ] Go to Play Console → **Release** → **Internal testing**
- [ ] Click **Create new release**
- [ ] Upload `app-release.aab`
- [ ] Complete store listing (title, description, screenshots)
- [ ] Complete all required declarations above
- [ ] Review and publish to internal testing

### Important Notes

⚠️ **First Upload Keystore = CI Keystore**

The keystore you use for the first upload becomes your **upload key**. You must use the same keystore in CI/CD.

**After first upload:**
- Note the SHA-1 fingerprint from Play Console
- Use the same production keystore for GitHub Actions
- Do NOT generate a different keystore for CI

### Play App Signing

**How it works:**
1. First upload: Google creates the **app signing key** (permanent)
2. Your keystore becomes the **upload key** (can be reset if lost)
3. Google re-signs your AAB with the app signing key before distribution

**No action needed** - Play App Signing is automatic for new apps.

---

## 9. Next Steps

After completing the checklist above:

```bash
# Setup automated Play Store publishing
/devtools:android-playstore-setup

这将:

  • 配置 Gradle Play Publisher 插件
  • 创建 GitHub Actions 工作流
  • 设置发布自动化

10. 了解不同轨道

了解 Play Store 发布轨道的区别:

轨道受众用途审核时间
内部测试最多 100 名测试人员快速测试即时
封闭测试(Alpha)受邀测试人员Beta 测试< 24h
公开测试(Beta)任何人都可加入公开 Beta 测试< 24h
正式版所有用户完整发布1-7 天

推荐流程:

  1. 内部测试 → 验证应用能否正常运行
  2. Beta 测试 → 扩大测试范围(可选)
  3. 正式版 → 完整发布

验证

运行验证检查:

# Validate Play Store API connection
python3 scripts/validate-playstore.py SERVICE_ACCOUNT.json {PACKAGE_NAME}

预期结果:✅ 所有验证均已通过


资源


由 android-playstore-scan v1.0.0 生成


## Verification

**MANDATORY:** Run these commands:

```bash
# Verify setup guide created
test -f PLAY_CONSOLE_SETUP.md && echo "✓ Setup guide created"

# Verify key sections present
grep -q "Privacy Policy" PLAY_CONSOLE_SETUP.md && echo "✓ Privacy policy section"
grep -q "Data Safety" PLAY_CONSOLE_SETUP.md && echo "✓ Data safety section"
grep -q "First Upload" PLAY_CONSOLE_SETUP.md && echo "✓ First upload checklist"

预期输出:

  • ✓ 已创建设置指南
  • ✓ 隐私政策部分
  • ✓ 数据安全部分
  • ✓ 首次上传清单

输出

输出位置描述
设置清单PLAY_CONSOLE_SETUP.md完整的 Play Console 设置指南

接下来会发生什么

查看 PLAY_CONSOLE_SETUP.md 后:

  1. 处理待办事项(隐私政策、缺失的配置)
  2. 运行设置技能:
    /devtools:android-playstore-setup
    
  3. 这将根据清单执行实际设置

检测结果与实际情况

此技能可检测:

  • ✅ 清单中声明的权限
  • ✅ build.gradle 中的依赖项
  • ✅ Health Connect 集成
  • ✅ 常见 SDK(广告、分析)

此技能无法检测:

  • ❌ 运行时权限使用模式
  • ❌ 实际网络调用和端点
  • ❌ 用户生成内容的处理方式
  • ❌ 内容分级的准确性

请务必查看生成的清单,并根据实际实现进行调整。

故障排除

“未找到包名”

原因: AndroidManifest.xml 格式问题 修复方法: 确认 <manifest> 标签中存在 package 属性

“未检测到权限”

原因: 权限在 Gradle 中声明,而非在清单文件中声明 修复方法: 检查 build.gradle.kts 中的权限声明

“隐私政策检测失败”

原因: 隐私政策位于非标准位置 修复方法: 更新扫描,或在生成的检查清单中手动指定 URL

完成标准

  • 已创建 PLAY_CONSOLE_SETUP.md
  • 已正确检测到所有项目功能
  • 已识别隐私政策状态
  • 已检测到 Health Connect 集成(如适用)
  • 已明确标记待办事项
  • 已准备好继续进行实际设置

评论

支持 Markdown