HarmonyOS NEXT应用开发,两天上架一百个鸿蒙元服务(暴富梦破裂,失败的经 ...

金歌  论坛元老 | 2025-4-18 09:23:22 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 1693|帖子 1693|积分 5079

2024年的最后一个季度,华为鸿蒙系统推出了一个令人高兴的开发者激励筹划,上架一个元服务就能得到1200元的嘉奖。对于许多开发者来说,这无疑是一个将“创意”转化为“财产”的绝佳机遇。当我看到这个筹划的时间,心中也涌现出一股“捡钱”的冲动。我心想,制作一个元服务只需要不到十分钟,那么一百个元服务岂不是能大赚一笔?于是,我开始了我的“鸿蒙元服务”之旅。
  去年年底的一阵子,周末两天上架了一百个鸿蒙元服务,最后竟全部被拒了。且被“杀一儆百”,凡是鸿蒙应用市场上的诗词类元服务全部被毙,其他人的也受到连累。这里反思总结下,做对了什么错了什么。谋利取巧并不可取,做事还是要脚踏实地。虽然失败了,但经验教训值得反思,特此总结。
这里还是保举下鸿蒙系统开发,比起android简朴太多。之前开发过Android智能终端,总是烦人的XML布局和databinding,及稠浊的Kotlin与Java代码。而鸿蒙系统的出现是新的曙光。鸿蒙系统以其简朴易用的开发环境和强大的创新体验,极大地简化了开发流程,大大提升了开发效率。
尽管云云,开源鸿蒙系统OpenHarmony,却仍处于发展初期,资源相对匮乏。市面上成熟的开发板不多,这也给想要基于OpenHarmony举行硬件国产化的开发者带来了不小困扰。身边的硬件工程师朋友,虽有心实行,却被资源稀缺和开发环境不成熟所困扰,陷入到想用而不敢用的尴尬田地。一套开发板卖一千多块,乖乖嘞,让不少玩家望而止步。
既然目标已定,我便迅速找到了一个可以批量生成元服务的素材——唐宋元明清各个朝代的诗词。我的想法很简朴,只需更换不同的logo图标和诗词内容,就能生成一个个新的元服务。为了提高效率,我编写了一个Python脚本,紧张用于分发logo图片和打包工程,还实现了主动化打包和主动根据1024位图生成元服务logo图标,摆设了个golang后台服务接口,用来根据传递的名称获取隐私政策声明。
我的路子是数据导向,根据sql语句查询出从商到清代的上万条数据,每200条产生一个data.json1,data.json2,data.json3…等数据文件。然后再使用脚本主动创建生成工程目录prj_1,prj_2,依次类推。并把对应的json文件拷贝到工程对应目录,分发logo图片到各个工程目录。如许工程模板和数据齐全啦。
如许,我只需在每一步操作中运行脚本,就能大大镌汰手动重复工作的时间。为了更快地完成任务,我还雇佣了几位郑州轻工业大学的美女学生,让他们帮助我通过网页操作来完成上架流程。

  1. import sqlite3
  2. import json
  3. # 连接到 SQLite 数据库
  4. connection = sqlite3.connect('poemsdb')
  5. cursor = connection.cursor()
  6. # 查询表中所需的字段,先搞个10条数据吧
  7. query = """
  8. SELECT Author, Title, Content, Intro, Comment, Translation, Annotation
  9. FROM poem
  10. WHERE Dynasty IN ('商', '周', '晋', '南北朝', '五代十国', '唐', '宋', '元', '明', '清')
  11. AND kind IN ('诗','词')
  12. AND Intro != 'None'
  13. AND Intro != ''
  14. """
  15. cursor.execute(query)
  16. # 获取结果
  17. rows = cursor.fetchall()
  18. # 构建一个字典列表以便转换为 JSON
  19. poets_data = []
  20. file_counter = 1
  21. for row in rows:
  22.     if len(row[2]) <= 0:
  23.         continue
  24.     poet_data = {
  25.         "poet": row[0],
  26.         "title": row[1],
  27.         "content": row[2],
  28.         "intro": row[3],
  29.         "comment": row[4],
  30.         "trans": row[5],
  31.         "annot": row[6]
  32.     }
  33.     poets_data.append(poet_data)
  34.     # 每隔200条数据写入一个 JSON 文件
  35.     if len(poets_data) == 200:
  36.         json_filename = f'data.json{file_counter}'
  37.         with open(json_filename, 'w', encoding='utf-8') as json_file:
  38.             json.dump(poets_data, json_file, ensure_ascii=False, indent=4)
  39.         print(f"已写入文件: {json_filename}")
  40.         
  41.         # 清空列表以存储下一批数据
  42.         poets_data.clear()
  43.         file_counter += 1
  44. # 处理剩余的数据,如果有的话
  45. if poets_data:
  46.     json_filename = f'data.json{file_counter}'
  47.     with open(json_filename, 'w', encoding='utf-8') as json_file:
  48.         json.dump(poets_data, json_file, ensure_ascii=False, indent=4)
  49.     print(f"已写入文件: {json_filename}")
  50. # 关闭数据库连接
  51. cursor.close()
  52. connection.close()
  53. print("所有数据已成功提取并写入 JSON 文件。")
复制代码
刚开始的几天,齐备似乎都在按筹划举行,我的元服务接连通过审核,上架到鸿蒙应用市场。然而好景不长,随着越来越多的诗词类元服务被提交,最终的结果却出乎料想。刚开始时,几个元服务还可以或许顺利通过,但很快,华为方面似乎对这种批量提交的诗词类元服务产生了反感,审核速度显着放慢,而且有越来越多的服务被直接否决。提示“您的元服务短缺创意性和独特代价,未能为用户提供差异化的体验,不符合华为应用市场《元服务审核指南》第3.4项。”
乃至包罗那些别人已经上架超过七天并且已经邮件通知得到激励的元服务,也被误伤被迫下架了。显着,负责审核上架的人,被这波上百个诗词文化打击,产生了严重的审美疲劳,被惹怒了。这突然的转变,无疑让我的“捡钱梦”破灭了,如果,如果可以或许上架十几个的时间见好就收…,如果当初不太贪。可惜没有如果,两天的周末时间也都白费了。

主动生成logo脚本:
  1. # 使用说明
  2. # 1. 安装PIL库,使用pip install pillow安装
  3. # 2. 将icon.py文件放到 [ 项目目录,注意根目录下 ] 目录下,如 TangShi 项目目录,该目录下为 各个 开发项目
  4. # 3. 打开项目,手动替换 "AppScope\\resources\\base\\element\\string.json" 对应app 名称,以及 元服务图片生成
  5. # 4. 在目录下运行 icon.py 文件,会在对应目录下生成 icon.png、startIcon.png  以及 EntryCard 图片
  6. # 5. 正常打包项目
  7. import os
  8. import shutil
  9. import json
  10. from PIL import Image,ImageDraw,ImageFont
  11. def merge_images(app_icon, temp_icon, output_ec_icon,app_name):
  12.     # 打开图片
  13.     image_icon = Image.open(app_icon)
  14.     image_temp_icon = Image.open(temp_icon)
  15.     #Image.open(temp_icon)
  16.    
  17.     resized_image = image_icon.resize((80,80))
  18.     #resized_image.save("rtemp.png")
  19.     smaller_image = image_temp_icon.crop((30,2,110,82));
  20.     #smaller_image.save("stemp.png")
  21.     image_process = Image.new('RGBA', (80,80))
  22.     print(resized_image.size)
  23.     print(smaller_image.size)
  24.     image_process = Image.alpha_composite(image_process,smaller_image.convert('RGBA'))
  25.     image_process = Image.alpha_composite(image_process,resized_image.convert('RGBA'))
  26.     #new_image.save('temp.png')
  27.     image_result = Image.new('RGBA', (140,140))
  28.     image_result.paste(image_temp_icon, (0, 0))
  29.     image_result.paste(image_process, (30, 2))
  30.     draw = ImageDraw.Draw(image_result)
  31.     font = ImageFont.truetype('simhei.ttf', 14)
  32.     draw.text(((140-len(app_name)*14)/2,88),app_name,font=font,fill=(36,54,71))
  33.     image_result.save(output_ec_icon)
  34. # 名称处理
  35. def write_string(app_name,tag):
  36.     entry_string_url = "entry\\src\\main\\resources\"+ tag +"\\element\\string.json"
  37.     esurl =  os.path.join(current_dir,entry_string_url)
  38.     print('string 目录: ', esurl)
  39.     with open(esurl, 'r',encoding='utf-8') as f:
  40.         sdata = json.load(f)
  41.     for d in sdata['string']:
  42.         if d['name'] == 'EntryAbility_label':
  43.             d['value'] = app_name
  44.         elif d['name'] == 'entrance_desc':
  45.             d['value'] = app_name
  46.         elif d['name'] == 'entrance_display_name':
  47.             d['value'] = app_name
  48. # 将修改后的数据写回 JSON 文件
  49.     with open(esurl, 'w',encoding='utf-8')  as file:
  50.         json.dump(sdata, file, indent=4,ensure_ascii=False)
  51.     print( tag +' string  修改成功')
  52. # 原始 PNG 图片路径
  53. current_dir = os.getcwd()
  54. print('当前目录: ', current_dir)
  55. source_png_path = "AppScope\\resources\\base\\media\\app_icon.png"
  56. # 目标目录
  57. target_dir = "entry\\src\\main\\resources\\base\\media\"
  58. target_icon= "icon.png"
  59. target_startIcon= "startIcon.png"
  60. # app名称
  61. app_name_url = "AppScope\\resources\\base\\element\\string.json"
  62. with open(os.path.join(current_dir, app_name_url), 'r',encoding='utf-8') as f:
  63.     sdata = json.load(f)
  64. app_name = sdata['string'][0]["value"]
  65. print('应用程序名称:', app_name)
  66. sp=  os.path.join(current_dir,source_png_path)# 复制文件
  67. print('原始目录: ', sp)
  68. #复制文件
  69. shutil.copy(sp, target_dir + target_icon)
  70. shutil.copy(sp, target_dir + target_startIcon)
  71. print('复制成功')
  72. #处理 EntryCard
  73. ec_url = "EntryCard\\entry\\base\\snapshot\\entrance-2x2.png"
  74. tmp_url = os.path.join(current_dir,"..","template.png")
  75. merge_images(sp, tmp_url,ec_url,app_name)
  76. #修改 string.json 文件
  77. write_string(app_name,"base")
  78. write_string(app_name,"en_US")
  79. write_string(app_name,"zh_CN")
  80. # 打包
  81. clearn ="hvigorw -p product=default clean --analyze=normal --parallel --incremental --daemon"
  82. os.system(clearn)
  83. print('清理成功')
  84. cmd="hvigorw --mode project -p product=default assembleApp --analyze=normal --parallel --incremental --daemon"
  85. os.system(cmd)
  86. print('打包成功')
  87. b_path =os.path.join(current_dir,"build\\outputs\\default")
  88. b_name = os.path.basename(current_dir) + "-default-signed.app"
  89. #把app_icon文件也复制过去
  90. sp=  os.path.join(current_dir,"app_icon.png")# 复制文件
  91. shutil.copy(sp, os.path.join( b_path,"app_icon.png"))
  92. print('复制成功')
  93. os.system(f'explorer /select , { os.path.join( b_path,b_name)}')
  94. print('打开输出目录:' + b_path)
  95. print('输出文件名:' + b_name)
复制代码
经过这次失败,我深刻体会到了急功近利的弊端。虽然最终没有得到预期的嘉奖,但这次经历也并非毫无代价。至少我在短时间内摸熟了鸿蒙系统的应用签名、编译打包和上架流程,这对于我今后开发鸿蒙应用来说,无疑是一笔财产。
人生的意义不在于等候,而在于举措。
太多人整天想着做某事,却迟迟没有付诸举措。为什么一定要等到万事俱备再出发呢?实际上,你永远不可能做到100%的准备。因此,只有先大胆地迈出第一步,不停地实践和改进,才能真正地收获成功。
对于鸿蒙的开发,我总结出以下几个点:

  • 高目标牵引:设定一个远大的目标,这将促使你不停努力,追求卓越。
  • 目标拆解为可实现的小目标:将大目标拆解成一系列小目标,一步一步地去实现。
  • 热爱是做好事情的条件:只有对某件事充满热爱,才能投入更多的情感和精力,从而做得更好。
  • 复盘总结:无论成败,都要举行复盘总结,找出问题所在,思索改进的方法。
如果,不对天下做出些什么,就会很无趣!
这世间的许多人都是如许,总是困于想,而懒于行。
想出去旅游的时间,总是对自己说,等天气好了再去;
想学习一项新的技能,又总是推迟,总想等有充足的时间了再去学。
可是你有没有问过自己:
为什么一定要准备好再出发呢?
你永远不可能做好100%的准备啊。
任何一件事情,你只有先投入进去,然后再不停改进,才能有所收获。
人生的主动权永远在于选择踏上某条路,而不是等候某条路主动变得平展。
人生就像一场漫长的旅行,我们不能只停顿在想象和规划阶段,而是要大胆地迈出第一步。
种一棵树最好的时间是十年前,其次是现在。
不举措,我们的生存将变得索然无味。因此,别再等候了。从现在开始,给自己定一个小目标,举措起来吧,做一个举措派!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

金歌

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表