鸿蒙多功能工具箱开发实战(三十五)-项目发布与运营

前言

项目发布和运营是应用生命周期的最后环节。本文将讲解应用发布流程、运营策略和持续优化。

一、发布前准备

1.1 发布检查清单

检查项 说明 状态
应用签名 配置正式签名证书
版本号 更新versionCode和versionName
权限声明 检查module.json5权限
隐私政策 准备隐私协议文档
应用图标 准备各尺寸图标
应用截图 准备应用截图
功能测试 完成功能测试
兼容测试 多设备兼容测试

1.2 签名配置

// build-profile.json5
{
  "app": {
    "signingConfigs": [
      {
        "name": "release",
        "type": "HarmonyOS",
        "material": {
          "certpath": "signature/release.cer",
          "storePassword": "xxxxxx",
          "keyAlias": "release",
          "keyPassword": "xxxxxx",
          "profile": "signature/release.p7b",
          "signAlg": "SHA256withECDSA",
          "storeFile": "signature/release.p12"
        }
      }
    ],
    "products": [
      {
        "name": "release",
        "signingConfig": "release",
        "buildMode": "release"
      }
    ]
  }
}

1.3 构建发布包

# 构建发布版本
hvigorw assembleHap --mode module -p module=entry@release -p buildMode=release

# 构建APP包(用于应用市场)
hvigorw assembleApp --mode project -p buildMode=release

1.4 发布准备流程图

开始发布准备

代码审查

功能测试

测试通过?

修复问题

配置签名

更新版本号

构建发布包

构建成功?

检查构建错误

准备发布

二、应用市场发布

2.1 发布流程

应用市场 审核团队 AGC控制台 开发者 应用市场 审核团队 AGC控制台 开发者 alt [审核通过] [审核拒绝] 登录控制台 创建应用项目 填写应用信息 上传HAP包 提交审核 分配审核任务 审核应用 上架应用 发布成功通知 反馈审核意见 修改后重新提交

2.2 应用信息配置

// app.json5
{
  "app": {
    "bundleName": "com.example.harmonytoolbox",
    "vendor": {
      "name": "开发者名称",
      "id": "developer_id"
    },
    "versionCode": 1000000,
    "versionName": "1.0.0",
    "icon": "$media:app_icon",
    "label": "$string:app_name",
    "description": "$string:app_description",
    "minAPIVersion": 10,
    "targetAPIVersion": 10,
    "apiReleaseType": "Release",
    "debug": false,
    "distributedNotificationEnabled": true
  }
}

2.3 多渠道发布

// 渠道配置
export const ChannelConfig = {
  // 华为应用市场
  huawei: {
    appId: 'xxxxxx',
    channel: 'huawei'
  },
  // 荣耀应用市场
  honor: {
    appId: 'xxxxxx',
    channel: 'honor'
  }
}

// 根据渠道构建
function buildForChannel(channel: string): void {
  const config = ChannelConfig[channel]
  // 注入渠道信息
  // 执行构建
}

三、运营策略

3.1 数据监控

export class AppMonitor {
  /**
   * 启动监控
   */
  static start(): void {
    // 监控启动时间
    this.monitorStartupTime()

    // 监控崩溃
    this.monitorCrash()

    // 监控ANR
    this.monitorANR()
  }

  private static monitorStartupTime(): void {
    const startTime = Date.now()

    // 应用启动完成后上报
    setTimeout(() => {
      const duration = Date.now() - startTime
      AnalyticsService.getInstance().track('app_startup', 'duration', {
        duration
      })
    }, 0)
  }

  private static monitorCrash(): void {
    errorManager.on('error', (error) => {
      AnalyticsService.getInstance().track('crash', 'error', {
        message: error.message,
        stack: error.stack
      })
    })
  }

  private static monitorANR(): void {
    // ANR监控实现
  }
}

3.2 用户反馈

@Component
struct FeedbackPage {
  @State feedback: string = ''
  @State contact: string = ''
  @State rating: number = 5

  build() {
    Column() {
      NavBar({ title: '意见反馈' })

      // 评分
      Row() {
        ForEach([1, 2, 3, 4, 5], (star: number) => {
          Text(star <= this.rating ? '★' : '☆')
            .fontSize(32)
            .fontColor(star <= this.rating ? '#FFD700' : '#CCCCCC')
            .onClick(() => {
              this.rating = star
            })
        })
      }

      // 反馈内容
      TextArea({ placeholder: '请输入您的反馈意见' })
        .width('90%')
        .height(150)
        .onChange((value) => {
          this.feedback = value
        })

      // 联系方式
      TextInput({ placeholder: '联系方式(可选)' })
        .width('90%')
        .onChange((value) => {
          this.contact = value
        })

      // 提交按钮
      Button('提交')
        .width('90%')
        .onClick(() => this.submitFeedback())
    }
  }

  private async submitFeedback() {
    const http = HttpService.getInstance()
    await http.post('https://api.example.com/feedback', {
      rating: this.rating,
      content: this.feedback,
      contact: this.contact,
      device: DeviceUtil.getDeviceType(),
      version: await VersionManager.getCurrentVersion()
    })

    prompt.showToast({ message: '感谢您的反馈' })
  }
}

3.3 版本迭代

export class ReleasePlan {
  // 版本规划
  static readonly VERSIONS = [
    {
      version: '1.0.0',
      features: ['基础功能', '核心工具'],
      date: '2024-01'
    },
    {
      version: '1.1.0',
      features: ['新增工具', '性能优化'],
      date: '2024-02'
    },
    {
      version: '1.2.0',
      features: ['小组件', '多语言'],
      date: '2024-03'
    }
  ]

  /**
   * 获取更新日志
   */
  static getChangeLog(version: string): string {
    const release = this.VERSIONS.find(v => v.version === version)
    if (!release) return ''

    return release.features.map(f => `${f}`).join('\n')
  }
}

四、持续优化

4.1 性能监控

export class PerformanceTracker {
  private static metrics: Map<string, number[]> = new Map()

  /**
   * 记录性能指标
   */
  static track(name: string, value: number): void {
    if (!this.metrics.has(name)) {
      this.metrics.set(name, [])
    }
    this.metrics.get(name)!.push(value)

    // 定期上报
    if (this.metrics.get(name)!.length >= 100) {
      this.report(name)
    }
  }

  /**
   * 上报性能数据
   */
  private static report(name: string): void {
    const values = this.metrics.get(name) || []
    const stats = {
      count: values.length,
      avg: values.reduce((a, b) => a + b, 0) / values.length,
      max: Math.max(...values),
      min: Math.min(...values)
    }

    AnalyticsService.getInstance().track('performance', name, stats)
    this.metrics.set(name, [])
  }
}

4.2 A/B测试

export class ABTest {
  private static experiments: Map<string, string> = new Map()

  /**
   * 获取实验分组
   */
  static getVariant(experimentName: string): string {
    if (this.experiments.has(experimentName)) {
      return this.experiments.get(experimentName)!
    }

    // 根据用户ID分配分组
    const variant = this.assignVariant(experimentName)
    this.experiments.set(experimentName, variant)

    return variant
  }

  /**
   * 分配分组
   */
  private static assignVariant(name: string): string {
    // 简单随机分配
    return Math.random() > 0.5 ? 'A' : 'B'
  }

  /**
   * 上报实验结果
   */
  static reportResult(experimentName: string, metric: string, value: number): void {
    const variant = this.experiments.get(experimentName)

    AnalyticsService.getInstance().track('ab_test', experimentName, {
      variant,
      metric,
      value
    })
  }
}

// 使用示例
const variant = ABTest.getVariant('new_ui')
if (variant === 'A') {
  // 显示旧UI
} else {
  // 显示新UI
}

五、运营数据看板

5.1 关键指标

指标 说明 目标
DAU 日活跃用户 > 10,000
留存率 次日留存 > 40%
崩溃率 崩溃用户占比 < 0.1%
启动时间 冷启动耗时 < 2s
使用时长 日均使用时长 > 5min

5.2 数据报表

@Entry
@Component
struct DashboardPage {
  @State dau: number = 0
  @State retention: number = 0
  @State crashRate: number = 0

  async aboutToAppear() {
    await this.loadDashboard()
  }

  build() {
    Column() {
      NavBar({ title: '运营数据' })

      // 关键指标卡片
      Row() {
        this.MetricCard('DAU', this.dau.toString(), '↑ 12%')
        this.MetricCard('留存率', `${this.retention}%`, '↑ 5%')
        this.MetricCard('崩溃率', `${this.crashRate}%`, '↓ 0.02%')
      }
      .width('100%')
      .justifyContent(FlexAlign.SpaceAround)

      // 趋势图表
      this.TrendChart()
    }
  }

  @Builder
  MetricCard(title: string, value: string, change: string) {
    Column() {
      Text(title)
        .fontSize(12)
        .fontColor('#999999')

      Text(value)
        .fontSize(24)
        .fontWeight(FontWeight.Bold)
        .margin({ top: 8 })

      Text(change)
        .fontSize(12)
        .fontColor(change.startsWith('↑') ? '#27AE60' : '#E74C3C')
        .margin({ top: 4 })
    }
    .padding(16)
    .backgroundColor('#FFFFFF')
    .borderRadius(8)
  }

  @Builder
  TrendChart() {
    // 趋势图表实现
    Column() {
      Text('趋势图')
    }
    .width('100%')
    .height(200)
    .backgroundColor('#FFFFFF')
    .borderRadius(8)
    .margin({ top: 16 })
  }

  private async loadDashboard() {
    // 加载数据
  }
}

六、高级运营功能

6.1 发布运营流程图

开发完成

内部测试

灰度发布

全量发布

运营监控

发现问题?

快速修复

持续运营

6.2 灰度发布

class GrayRelease {
  static async shouldShowNewFeature(): Promise<boolean> {
    // 获取用户ID
    const userId = await UserService.getUserId()
    
    // 计算灰度比例
    const hash = this.hashUserId(userId)
    const grayRatio = await this.getGrayRatio()
    
    return (hash % 100) < grayRatio
  }
  
  private static hashUserId(userId: string): number {
    let hash = 0
    for (let i = 0; i < userId.length; i++) {
      hash = ((hash << 5) - hash) + userId.charCodeAt(i)
    }
    return Math.abs(hash)
  }
}

6.3 A/B测试

class ABTest {
  static async getVariant(experimentId: string): Promise<string> {
    const userId = await UserService.getUserId()
    const variants = await this.getExperimentConfig(experimentId)
    
    // 根据用户ID分配实验组
    const index = this.hashUserId(userId) % variants.length
    return variants[index]
  }
}

6.4 运营指标监控

class OperationMetrics {
  // DAU统计
  static async getDAU(): Promise<number> {
    return await AnalyticsService.getCount('daily_active_users')
  }
  
  // 留存率
  static async getRetention(day: number): Promise<number> {
    const newUsers = await this.getNewUsers(day)
    const retained = await this.getRetainedUsers(day)
    return retained / newUsers * 100
  }
}

七、小结

本文详细讲解了项目发布与运营:

  1. ✅ 发布前检查
  2. ✅ 应用市场发布
  3. ✅ 运营策略
  4. ✅ 持续优化
  5. ✅ 数据监控
  6. ✅ 灰度发布
  7. ✅ A/B测试
  8. ✅ 运营指标监控

系列文章导航

  • [下一篇] 系列完结

系列完结

🎉 恭喜!《鸿蒙多功能工具箱开发实战》系列文章已全部完成!

本系列共 35篇 文章,涵盖了HarmonyOS应用开发的完整流程:

基础篇 (1-5):环境搭建、架构设计、路由导航、主题样式

功能篇 (6-17):组件封装、计算器、历法、换算、财务、行情、生活工具

进阶篇 (18-28):数据存储、设置、性能优化、错误处理、日志、测试、国际化、无障碍、安全、更新

高级篇 (29-35):统计分析、推送通知、小组件、多设备适配、折叠屏、分布式、发布运营

感谢您的阅读,祝您开发顺利!

Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐