开发Android应用程序的提示:我的经验教训

本文概述

嗨!我是Ivan, 现在已经从事Android应用程序开发工作已经有一段时间了。大概是这样。过去(我们谈论的是2009年), Android只是个婴儿, 从那时起, 我就看着”小绿人”成长。恐怕前一段时间, Android设法使我成长。

如今, Android不仅适用于成千上万种不同的手机和平板电脑。它位于你的手腕, 客厅, 汽车中, 一旦我们开始为无生命的物体分配IP地址, 它将在我们周围几乎所有地方。即使是经验丰富的Android开发人员也有很多基础!

另外, 仅在Google Play上就有超过一百万个应用程序, 这还不包括亚马逊应用商店或我们通常不感兴趣的市场(例如中国)。我们不要忘记无数的移动应用开发公司, 这些公司每年产生数十亿美元的收入。

那么, 独立开发商如何在这个拥有大型参与者的巨大市场中创建成功的应用程序?我不知道, 我还没有开发出成功的应用!但是, 我做的很可爱, 我想和你分享我的故事。

第1课:连接点

成功(通常)不会在一夜之间发生, 这也不是我的第一个应用程序。我遇到的问题有很多, 从像马其顿东正教日历这样的意想不到的周末开发热潮中, 有超过30, 000名用户使用了不超过400万人可以理解的语言, 到更成功的失败, 例如TweetsPie, 这是一个拥有大量媒体报道和仅有600多位活跃用户的可​​怕用户群。那里有很多教训!

这些应用程序帮助我更好地理解了”难以捉摸的动物, 称为用户”的思维, 但启发我的却是一个两个小时的项目。 The Dollar App最初是为了让我成为百万富翁而开发的, 一旦有1, 428, 571名用户购买了该应用程序, 因为Google从每美元中提取了30美分, The Dollar App就是用来测试我的商家帐户的。

我几乎不知道几年后, 我会收到一封来自快乐妈妈的电子邮件, 说这是自从男孩每次微笑我的应用程序给他一个拥抱以来, 她所花的最好的钱。

有效扩展规模后,面向初学者的Android应用程序开发既简单又有趣。

这就是一个想法的产生!为什么不使用人类最基本的拥抱来使它变得漂亮呢?面向特定受众群体, 使其互动性, 挑战性, 使用乐趣以及共享乐趣更大。

第2课:了解Android市场

我上面提到的所有内容都添加到了动态壁纸应用程序中。基本知识并不难猜测。 Android的市场份额大于iOS, 但iOS用户购买的份额更多。短信应用程序非常受欢迎, 但免费游戏收入最高。中国, 印度, 巴西和俄罗斯是新兴市场, 但缺乏消费习惯。你可以阅读App Annie索引以获取更多见解。

那么动态壁纸应用程序如何适应呢?首先, 由于动态壁纸是Android设备, 因此它消除了大多数平台。其次, 此功能是在Android 2.1中添加的, 因此它具有庞大的社区和许多漂亮的示例。最著名的是Paperland和Roman Nurik的开源Muzei, 这可能是Android开发的最佳参考点。

尽管有很多动态壁纸, 但其中大多数都属于”风景/天气”类别, 而很少属于”可爱超载”类别。这是我们想要更改的内容, 即使每次解锁时, 你都有完全不同的理由, 但每次解锁时, 它们都会带给你微笑。我们给你一个可爱的欢乐组合, 在你晚上睡觉或早晨关闭闹钟时拥抱你。甚至更好的是, 使其个性化和可定制。

事不宜迟, 在介绍技术细节之前, 我自豪地向你介绍:Ooshies-动态壁纸

Ooshies是我的Android应用程序的名称。它可能没有成功,但是它帮助我学习了为初学者Android开发人员编写本指南所需的课程。

它具有以下特点:

  • 免费动态壁纸应用程序, 让你拥抱
  • 12种独特的ooshies可供选择
  • 免费, 解锁和可购买的内容
  • 当前天气更新
  • 社交登录和数据同步
  • 季节性问候
  • 许多惊喜
  • 忍者猫
  • 我们有没有提到拥抱?
成功的Android应用有时会让你微笑。

第3课:尝试实现

Ooshies似乎是一个非常简单的Android应用程序创意。画一个背景, 覆盖一些云朵和星星, 在上面放一个气球的熊, 一切都好。但是不, 这是Android!看起来容易的事情通常很困难, 我们倾向于一遍又一遍地重复同样的常见错误。以下是我所面临挑战的简要概述:

  1. 硬件加速-当GPU如此出色时, 为什么要使用CPU绘图呢?好吧, 事实证明, 无法在硬件上加速在画布上绘制位图。至少暂时还没有。

  2. OpenGL-如果我们想要硬件加速, 我们需要使用OpenGL ES甚至更好的框架来为我们完成大部分工作。

  3. 位图加载-一个众所周知的内存消耗问题。我们需要为#ARGB中的每个通道分配1字节[0-255]的内存, 以显示单个像素。另外, 我们使用的图像通常比设备的显示分辨率更高。全部加载它们将很快导致OutOfMemroyException。

  4. 家用启动器-动态壁纸将托管在家用启动器过程中, 并且不同的启动器往往会给动态壁纸服务提供不同的回调(最主要是Nova和TouchWiz)。

  5. 电池寿命-如果操作不当, 动态壁纸和小部件可能会消耗大量电池。关于棒棒糖(Android 5.0)糟糕的电池寿命的所有热议, 第一个应用程序将是动态壁纸。

因此, 叠加一个位图, 在画布上绘画它, 然后在触摸时切换帧以拥抱, 这似乎没什么大不了的, 即使是在CPU上完成的, 对吗?没错, 这不是问题。但是, 谁想要静态动态壁纸?它超越了目的。墙纸应响应你的触摸, 应在滚动主屏幕时移动, 应随机进行善意操作, 使你感到快乐。

为此, 有一个Android开发技巧。有一个术语称为视差效应, 用于在二维空间中增加深度。想象一下自己开车。离你最近的房子比远处的山移动得快。通过在画布上以不同速度移动对象, 可以达到相同的效果。尽管它们都在同一平面上, 但是你的大脑会感知到运动更快的物体离你更近。就像添加阴影一样, 视差效果会添加z轴。

这就是所有地狱都破灭的地方!在大多数设备上, 以不同的速度移动Ooshie, 天气覆盖和背景会导致帧速率显着下降。绘制单帧的方法如下:

    canvas.drawBitmap(background, 0 - offsetX / 4, 0, null);
    canvas.drawBitmap(weatherOverlay, 0 - offsetX / 2, 0, null);
    if (!validDoubleTap) {
      canvas.drawBitmap(ooshieNormal, positionX - offsetX, positionY, null);
    }
    else {
      canvas.drawBitmap(ooshieTapped, positionX - offsetX, positionY, null);
    }

偏移量是用户滚动距离的百分比。这是墙纸引擎提供的回调:

    @Override
    public void onOffsetsChanged(float xOffset, float yOffset, float xOffsetStep, float yOffsetStep, int xPixelOffset, int yPixelOffset){
      super.onOffsetsChanged(xOffset, yOffset, xOffsetStep, yOffsetStep, xPixelOffset, yPixelOffset);
      // athe current offset should be a fraction of the screen offset to achieve parallax
      if (!isPreview()) {
        float newXOffset = xOffset * 0.15f;
        wallpaperDrawHelper.setOffsetX(newXOffset);
        if (isVisible() && hasActiveSurface) {
          wallpaperDrawHelper.drawFrame(false);
        }
      }
    }

我必须注意, 如果我知道如何使用OpenGL, 所有这些都是不必要的!它在我的TODO列表中, 因为比我们现在复杂的事情都需要硬件加速。但是, 暂时我必须更加努力而不是更加聪明(我愿意接受评论中的建议)。所以这就是我们所做的:

第4课:利用已有的知识

作为minSdk = 15计划的大力支持者, 我们从一开始就淘汰了所有2.x设备。保持向后兼容性的努力大于无法\不愿意升级其手机的用户可能获得的收入。因此, 在大多数情况下, 如果需要, 我们可以通过添加禁用视差的选项来获得流畅的体验。

根据此Android开发指南,我想提供禁用视差的选项。

另一个重大优化是我们如何处理位图。通过绘制两个位图而不是三个位图可以实现非常相似的视差效果:

  1. Ooshie叠加层-修剪并仔细缩放的Ooshie位图(可以进行配饰)

  2. 组合叠加层-背景和天气组合位图, 仅以Ooshie速度的一小部分移动

这个Android开发技巧可节省内存并加快绘制时间, 从而使视差效果略有下降。

滚动主屏幕时, 会经常绘制帧(理想情况下每秒绘制30次以上)。重要的是, 当主屏幕不可见时(某些锁定屏幕, 某些应用程序抽屉, 打开/切换应用程序等), 不要绘制它们, 以最大程度地减少CPU使用率。

这与天气更新密切相关。最初有一个重复的任务, 每隔一两个小时执行一次, 以同步天气, 但这确实是一个过大的杀伤力。如果用户看不到墙纸, 则天气信息无关紧要。因此, 现在, 仅当墙纸可见时才进行天气更新。

    long lastUpdate = prefStore.getLong(SharedPrefStore.Pref.WEATHER_TIMESTAMP);
    if (System.currentTimeMillis() - lastUpdate > Consts.WEATHER_UPDATE_INTERVAL){
        // update the weather if obsolete
        Intent intent = new Intent(getApplicationContext(), WeatherUpdateService.class);
        startService(intent);
    }

因此, 基本上, 这是内存优化的平滑软件位图绘制的清单:

  1. 一次合并位图
  2. 少绘制位图
  3. 仅按需重画
  4. 避免后台任务
  5. 为用户提供对过程的控制

第5课:测试。测试。测试

我不能强调这有多重要!永远不会, 我永远不会重复, 请在测试之前发布你的应用!而且, 我并不是说你应该进行测试。你编写了代码, 知道了它的工作原理, 并且知道了期望值, 从而影响了结果。我不是在谈论JUnit测试(尽管推荐), 而是在分阶段推出, 即Alpha和Beta测试。

如果你从事Android软件开发, 那么这些术语很简单, 但是这里有一个简短的总结:

  1. Alpha测试人员-由你的队友和业内人士组成的一小部分人, 最好是Android开发人员。他们很有可能会拥有高端设备, 并且会与开发人员一起玩耍。他们会向你发送堆栈跟踪, 错误报告, 甚至为你提供一些代码/ UI优化技巧和窍门。具有部分/缺失功能的早期版本的完美选择。

  2. Beta测试人员-受众广泛, 具有各种受众特征。稳定版本应在此处发布。即使你的忍者等级太高, 你也无法预测所有可能的Android发行版和人们使用手机的方式, 更不用说了。

一旦我们通过了Alpha, 我认为我们已经完成了。但是, 男孩, 我错了吗?事实证明, 并非所有Android用户都拥有具有最新软件的Nexus设备!谁知道:)

根据此启示, 以下是一些Android开发问题:

  1. 不同的启动器有不同的默认主屏幕-通常是第一个或中间一个, 据我所知, 无法知道它的位置。

  2. 在不知道默认主屏幕位置的情况下很难将Ooshie居中-因此, 用于调整视差偏移的设置滑块。

  3. 普通用户不知道视差偏移的含义-在设置页面上应使用更简单的术语。

  4. 随机用户会建议你的下一个功能。

因此, 我要感谢我们所有的Beta测试人员所做的辛勤工作。我希望将所有最新功能都抢先一步是对他们奉献精神的丰厚回报。如果你愿意, 你也可以加入我们的Google+ Beta社区。

Beta测试是Android初学者开始编程成功的Android应用时要牢记的关键步骤。

第6课:让数据说话

在2009年还没有的情况下, 要使当今的Android应用程序脱颖而出, 要比制作计算器应用程序困难得多。要创建完美的应用程序很难。主要是因为情人眼中的完美。对我有好处, 并不一定意味着对你有好处。这就是为什么让应用不断增长很重要的原因。我们的新功能路线图清单显示, 我们在2015年全年的工作量足够。除其他外, 我们很快将提供:

  1. 声音
  2. 季节性背景
  3. 自定义(背景颜色, 气象数据包, ooshie皮肤等)
  4. 地区特定的ooshies(例如babushkas)
  5. 很多新的Ooshies以及解锁方法

现在, 在完成所有操作之前, 我们可能会将应用程序保持在测试阶段, 但是那样一来, 我们就浪费了宝贵的数据。并非所有Beta版测试人员都会在一天中的特定时间向你发送反馈。在那儿你可以受益于使用获取反馈的工具。你可以使用Google Analytics(分析), Flurry, Mixpanel, Crashalytics, ACRA等收集使用数据。

例如, 通过分析数据, 我们注意到用户没有太多单击设置按钮, 因此我们变得更加明显, 并添加了一个快速教程来调整设置。

尽管这是一个后台过程, 但可以用来进一步改善用户体验。为什么不向用户显示多少次:

  1. 他/她得到了一个拥抱
  2. 一个微笑使多少雨天变得灿烂
  3. 用迷你游戏解锁多少个Ooshie需要多少个水龙头
  4. 有多少朋友因为你而安装了该应用程序
每个Android开发指南都应宣传Google Analytics(分析)在优化应用程序中的重要性!

这很重要, 因为这会给他们的行为带来后果。不要犯我们的教育系统同样的错误, 使用户成为被动的内容消费者。让他们负责。让他们选择控制自己的设备并创建自己的个人体验。如果你设法将所有这些打包成一个可爱的捆绑包, 并且在第一次启动时就偷偷笑了, 那么向用户询问垃圾内容的垃圾内容解锁并不是一件容易的事。

最后, 你需要根据这些数据来发展你的Android应用开发。尽管此应用程序主要面向妈妈/孩子, 但在其他受众特征中可能会变得很流行。它可能不符合我们最初的设想, 但必须满足用户的需求。否则, 他们会找到可以的人。

总结

让我们回到我最成功的失败TweetsPie。尽管屡获殊荣并获得了广泛的媒体报道, 该应用仍未能保留其用户(原因不在本文讨论范围之内)。

成功并不总是显而易见的。由于整个经验, 我学到了很多东西。我至少在关于各种事件和黑客马拉松的初创企业如何失败方面做了十二次演讲, 并设法在srcmini吸引了几个客户。

更重要的是, 按照本指南中的提示和技巧, 我尝试不重复与Ooshies相同的Android开发错误。

为了总结这份长篇指南, 我们定义为成功的是在后期阶段, 将其与我们最初设定的目标紧密结合。当然, 最常见的成功方法是赚很多钱。无论你的应用是否成功, 都必须设法实现它, 并相信我最终你将成为一个更好的人(希望是一个能够学习OpenGL的人)。你会结交新朋友, 减少敌人, 如果你足够幸运/聪明, 就会使很多用户感到高兴。

你可以检查我们的网站或下载Ooshies进行尝试。

微信公众号
手机浏览(小程序)
0
分享到:
没有账号? 忘记密码?