作者都是各自领域经过审查的专家,并撰写他们有经验的主题. 我们所有的内容都经过同行评审,并由同一领域的Toptal专家验证.
伊万·迪莫斯基的头像

伊凡Dimoski

Ivan是一位成功的安卓开发人员和顾问,拥有六年开发用户友好应用程序的经验.

专业知识

以前在

Truecaller
分享

Hi! 我是伊万,我是 安卓应用 做了一段时间的开发人员. 至少看起来是这样. 那时候(我们说的是2009年),安卓还只是个婴儿,我看着它 小绿人 从此成长. 我担心不久之前,安卓已经不再适合我了.

如今,安卓不仅仅是在线的 数以万计 不同的手机和平板电脑. 它在你的 手腕,在你的 客厅,在你的 , 一旦我们开始为无生命的物体分配IP地址, 它将在我们周围无处不在. 很多地方都有 有经验的安卓开发人员 覆盖!

也有结束 100万个应用程序 就在Google Play上, 这还不包括亚马逊AppStore或其他我们并不感兴趣的市场, 像中国这样的. 我们不要忘记无数 移动应用开发公司 每年产生数十亿美元的收入.

所以,我怎么能 独立开发人员 在这个拥有众多玩家的巨大市场中创造一款成功的应用? 我也不知道,我还没有开发出一款成功的应用! 但是,我做了一个可爱的,我想和你分享我的故事.

第一课:把点滴串连起来

成功(通常)不会一蹴而就,这也不是我的第一款应用. 我有很多意想不到的 周末开发热门游戏 就像 马其顿东正教历法, 有30多个,以一种不超过400万人能理解的语言,向1000名用户提供服务, 更成功的失败,比如 TweetsPie,一个应用程序与沉重 媒体 报道 它的用户基础非常糟糕,只有600多名活跃用户. 那里有很多经验教训!

虽然这些应用程序帮助我更好地理解了“被称为用户的难以捉摸的生物”的思想, 启发我的是一个两小时的项目. 最初是为了让我成为百万富翁, 一次1,428,571名用户购买了这款应用,谷歌从每1美元中抽取30美分, 美元应用 是用来测试我商家账户的吗.

没想到多年后,我收到了一位母亲的电子邮件,说这是她花过的最值得的一分钱,因为她的儿子每次都在我的应用给他一个拥抱时微笑.

对于初学者来说,安卓应用程序的开发可以简单而有趣.

一个想法就是这样诞生的! 为什么不利用人类对拥抱的基本需求,让它变得漂亮呢? 让它适合特定的受众,具有互动性、挑战性、使用起来有趣,甚至分享起来更有趣.

经验2:了解安卓 Market

我上面提到的所有东西加起来就是一个动态壁纸应用. 基本原理并不难猜. 安卓的市场份额比iOS大,但iOS用户的消费更多. 即时通讯应用非常流行,但是 免费增值游戏 超过收入. 中国、印度、巴西和俄罗斯都是新兴市场,但缺乏消费习惯. 你可以阅读 应用Annie指数 了解更多信息.

那么,动态壁纸应用程序是如何融入其中的呢? 首先,它消除了自a以来的大多数平台 生活壁纸 是安卓的东西. 第二,这 功能 添加到安卓 2.所以它有一个很大的社区和很多漂亮的例子. 最明显的是 Paperl和罗马Nurik的 开源 Muzei,这可能是安卓开发的最佳参考点.

虽然有很多动态壁纸, 其中大多数属于风景/天气类别, 很少有人属于 可爱过载 类别. 这是我们想改变的,我们想提供一些东西,让你每次解锁手机时都能看到一个微笑, 即使你打开它的原因完全不同. 我们给了你一个可爱的小宝贝,让你在晚上睡觉前抱抱你, 或者当你早上关掉闹钟的时候. 更好的是,让它个性化和可定制.

废话不多说,在我们进入技术细节之前,我自豪地向您介绍: Ooshies -动态壁纸

Ooshies是我的安卓应用的名字. 它可能没有成功,但它帮助我学到了为新手安卓开发人员编写这篇指南所需的经验.

它的特点:

  • 给你拥抱的免费动态壁纸应用程序
  • 12种独特的巧克力可供选择
  • 免费,可解锁和可购买的内容
  • 最新天气
  • 社交登录和数据同步
  • 季节性问候
  • 许多惊喜
  • 忍者猫
  • 我们提到拥抱了吗??

成功的安卓应用有时只会让你微笑.

第三课:努力实现梦想

Ooshies似乎是一个非常简单的安卓应用程序创意. 绘制背景, 覆盖一些云和星星, 在上面放一只熊和一个气球, 你可以走了. 但不是,它是安卓! 看似简单的事情往往是相当困难的,我们倾向于重复相同的 常见的错误 一次又一次. 以下是我所面临挑战的简要概述:

  1. 硬件加速——GPU在这方面做得好得多,为什么还要用CPU呢? 在画布上画位图 不能硬件加速. 至少目前还没有.

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

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

  4. 家庭启动器-实时壁纸将在家庭启动器进程中托管, 不同的启动器倾向于给动态壁纸服务不同的回调(最明显的是Nova和TouchWiz).

  5. 电池寿命——如果操作不当,活跃的壁纸和小部件会消耗大量电池. 所有关于棒棒糖(安卓 5)的嗡嗡声.0) 糟糕的电池寿命 第一个取消的应用程序将是动态壁纸.

So, 覆盖位图, 画在画布上, 然后切换画面给一个拥抱, 看起来没什么大不了的, 即使是在CPU上完成的, 正确的? 是的,这不是问题. 但是,谁想要一个静态的动态壁纸? 它违背了目的. 壁纸应该对你的触摸有反应, 它应该在你滚动主屏幕时移动, 它应该随机做出一些善意的举动,让你感到快乐.

这里有一个安卓开发技巧. 有一个术语叫做 视差效果 用于在二维空间中添加深度. 想象你自己在开车. 离你近的房子比远处的山移动得快. 同样的效果可以通过在画布上以不同的速度移动物体来实现. 虽然, 它们都在同一个平面上, 你的大脑会认为移动更快的物体离你更近. 就像添加 阴影,视差效果增加了一个z轴.

这就是地狱爆发的地方! 在大多数移动设备上, 天气覆盖, 背景, 以不同的速度, 产生显著的帧速率下降. 下面是绘制单个帧的方法:

    canvas.drawBitmap(background, 0 - 抵消X / 4,0, null);
    canvas.drawBitmap(weatherOverlay, 0 - 抵消X / 2,0, null);
    if (!validDoubleTap) {
      canvas.drawBitmap(ooshinormal, positionX - 抵消X, position, null);
    }
    其他{
      canvas.drawBitmap(ooshieTapped, positionX - 抵消X, position, null);
    }

抵消 是用户滚动距离的百分比吗. 这是壁纸引擎提供的一个回调:

    @Override
    public void onOffsetsChanged(浮动xOffset,浮动yOffset,浮动xOffsetStep,浮动yOffsetStep,)
                                 int xPixelOffset, int yPixelOffset){
      超级.onOffsetsChanged(xOffset, yOffset, xOffsetStep, yOffsetStep, xPixelOffset, yPixelOffset);
      //当前偏移量应该是屏幕偏移量的一小部分,以实现视差
      if (!isPreview ()) {
        浮动newXOffset = xOffset * 0.15f;
        wallpaperDrawHelper.setOffsetX (newXOffset);
        如果(isVisible () && hasActiveSurface) {
          wallpaperDrawHelper.拉伸机(假);
        }
      }
    }

我必须注意到,如果我知道如何使用OpenGL,那么所有这些都是不必要的! 它在我的 待办事项 列表,因为任何比我们现在拥有的更复杂的东西都需要硬件加速. 但是,就目前而言,我必须更努力地工作,而不是更聪明(我愿意接受评论中的建议)。. 我们是这样做的:

第四课:利用现有资源

作为一个大的支持者 minSdk = 15 主动出击,从一开始我们就全部淘汰了2名.x设备. 维护向后兼容性所付出的努力,要大于那些无法或不愿升级手机的用户可能带来的收入. So, 在大多数情况下, 如果需要的话,我们可以通过添加禁用视差的选项来实现平滑的体验.

根据这个安卓开发指南,我想提供一个禁用视差的选项.

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

  1. Ooshie叠加-修剪和仔细缩放的Ooshie位图(可以附加)

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

这个安卓开发技巧节省了内存并加快了绘图时间, 对于轻微的视差效果降级.

滚动主屏幕时, 帧将被频繁绘制(理想情况下每秒超过30次)。. 关键是不要在主屏幕不可见时绘制它们(一些锁定屏幕), 某个应用程序抽屉, 打开/切换应用程序等.),以尽量减少CPU使用率.

这一切都与天气变化密切相关. 最初有一个重复的任务, 每一两个小时执行一次, 同步天气, 但这确实是一种过度的杀戮. 如果用户看不到壁纸,天气信息就无关紧要了. 所以现在,天气更新只有在壁纸可见时才会发生.

    lastUpdate = prestore.getLong (分享d参照Store.参照.WEATHER_TIMESTAMP);
    如果(系统.currentTimeMillis() - lastUpdate > Consts.WEATHER_UPDATE_INTERVAL) {
        //更新天气信息
        Intent Intent = new Intent(getApplicationContext()), WeatherUpdateService.类);
        startService(意图);
    }

所以,基本上,这是一个内存优化平滑软件位图绘制的清单:

  1. 一次合并位图
  2. 少画位图
  3. 只在需要时重新绘制
  4. 避免后台任务
  5. 为用户提供对流程的一些控制

第五课:测试. 测试. 测试

我不能强调这有多重要! 我再说一遍 从来没有,在测试前发布应用! 我并不是说你应该做测试. 您编写了代码,您知道它是如何工作的,并且您通过了解期望来影响结果. 我不是在谈论JUnit测试(尽管推荐),而是关于 上演了糊涂事 i.e. Alpha和beta测试.

如果你是安卓软件开发人员,那么条款就很简单, 但这里有一个简短的概述:

  1. Alpha测试员——由你的队友和业内人士组成的一小群人, 最好是安卓开发者. 他们很有可能会拥有高端设备,并且会玩一些 开发人员选项. 他们会给你发送堆栈的踪迹, 错误报告, 甚至给你一些代码/UI优化的技巧和技巧. 非常适合带有部分或缺失功能的早期版本.

  2. Beta测试者——更广泛的受众群体. 稳定版本应该在这里发布. 即使你的忍者水平太高了, 你永远无法预测, 更不用说账户了, 所有可能的安卓发行版和人们使用手机的方式.

一旦我们通过了阿尔法,我以为我们就结束了. 但是,我错了?! 事实证明,并非所有安卓用户都拥有安装最新软件的Nexus设备! 谁会知道? :)

以下是基于这一启示的一些安卓开发问题:

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

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

  3. 普通用户不知道 视差补偿 手段-更简单的术语应该在设置页面上使用.

  4. 随机用户将建议您的下一个功能.

所以我要感谢我们所有的测试者,感谢他们所做的辛勤工作. 我希望在其他人之前获得所有最新功能是对他们的奉献的一个体面的奖励. 如果你愿意,你也可以加入我们的 Google+ Beta社区.

对于安卓新手来说,在开始编写成功的安卓应用程序时,Beta测试是至关重要的一步.

第六课:让数据说话

如今,制作一款脱颖而出的安卓应用比制作一款计算器应用要困难一些, 而在2009年还没有. 制作完美的应用并不容易. 主要是因为完美存在于旁观者的眼中. 对我有好处的,不一定对你也有好处. 这就是为什么让应用成长很重要. 我们的新功能路线图清单显示,我们在整个2015年有足够的工作. 我们很快将包括以下内容:

  1. 听起来
  2. 季节性的背景
  3. 自定义(背景颜色,天气包,ooshie皮肤等.)
  4. 特定区域的ooshies(例如. 巴布什卡斯)
  5. 有很多新道具和解锁方法

现在, 我们本可以让这款应用一直处于测试阶段,直到一切都完成, 但这样我们就丢掉了宝贵的数据. 并不是所有的测试者都会花时间给你反馈. 这就是你可以通过使用工具获得反馈的地方. 你可以使用Google Analytics, Flurry, Mixpanel, Crashalytics, 肢端等. 收集使用数据.

例如, 通过分析数据,我们注意到用户并不经常点击设置按钮, 所以我们让它更明显,并添加了一个快速教程来调整设置.

虽然这是一个后台进程,但它可以用来进一步改善用户体验. 为什么不向用户显示次数:

  1. 他/她得到了一个拥抱
  2. 有多少阴雨天被一个微笑照亮
  3. 需要点击多少次才能解锁一个带有迷你游戏的Ooshie
  4. 有多少朋友因为你而安装了这个应用

每个安卓开发指南都应该宣传Google Analytics在优化应用中的重要性!

这很重要,因为它为他们的行为提供了结果. 不要重蹈我们教育系统的覆辙,让用户成为被动的内容消费者. 让他们负责. 让他们选择控制自己的设备,创造自己的个人体验. 如果你能把所有这些都打包成一个可爱的包裹,在第一次飞溅时就偷了一个微笑, 要求用户为内容解锁提供垃圾信息并不是太牵强.

最后,你需要基于这些数据来完善你的安卓应用开发. 虽然主要是为妈妈/孩子设计的,但这款应用可能会在其他人群中流行. 它可能不符合我们最初的设想,但必须满足用户的需求. 否则他们就会找其他人.

结论

让我们回到我最成功的失败 TweetsPie. 尽管有几个奖项和大量的媒体报道, 这款应用未能留住用户(原因不在本文讨论范围之内)。.

成功并不总是显而易见的. 多亏了这整个经历,我学到了很多. 我至少做了十几次讲座 创业公司如何(不)失败 在各种活动和黑客马拉松上,并设法在Toptal获得了几个客户.

更重要的是, 我遵循本指南中的提示和技巧,尽量避免在Ooshies中重复同样的安卓开发错误.

来结束这篇长篇指南, 我们对成功的定义是, 在后期, 与我们一开始设定的目标紧密相连. 当然,最常见的成功标准是赚很多钱. 不管你的应用是否成功, 你必须努力让它发生, 相信我,最后你会成为一个更好的人(希望你能学会OpenGL)。. 你会交到新朋友, 几个敌人, 如果你足够幸运/聪明,你就能让很多用户满意.

你可以查看我们的 网站 或者下载Ooshies来尝试一下.

就这一主题咨询作者或专家.
预约电话
伊万·迪莫斯基的头像
伊凡Dimoski

位于 斯德哥尔摩,瑞典

成员自 2013年12月11日

作者简介

Ivan是一位成功的安卓开发人员和顾问,拥有六年开发用户友好应用程序的经验.

Toptal作者都是各自领域经过审查的专家,并撰写他们有经验的主题. 我们所有的内容都经过同行评审,并由同一领域的Toptal专家验证.

专业知识

以前在

Truecaller

世界级的文章,每周发一次.

订阅意味着同意我们的 隐私政策

世界级的文章,每周发一次.

订阅意味着同意我们的 隐私政策

Toptal开发者

加入总冠军® 社区.