Androidアプリを開発するためのヒント:私の教訓
公開: 2022-03-11やあ! 私はIvanで、Androidアプリの開発者としてかなり長い間働いています。 またはそう思われます。 当時(2009年について話している)、Androidはまだ幼児であり、それ以来、リトルグリーンマンが成長するのを見てきました。 少し前に、Androidがなんとか私を超えてしまったのではないかと心配しています。
今日、Androidは何万もの異なる携帯電話やタブレットに搭載されているだけではありません。 それはあなたの手首、居間、車の中にあり、無生物にIPアドレスを割り当て始めるとすぐに、それは私たちの周りのほとんどどこにでもあるでしょう。 経験豊富なAndroid開発者でさえカバーするための多くの根拠!
また、Google Playには100万を超えるアプリがありますが、Amazon AppStoreや、中国のように一般的に関心のない市場は含まれていません。 毎年数十億の収益を上げている無数のモバイルアプリ開発会社を忘れないでください。
では、独立した開発者は、この巨大な市場で大きなプレーヤーがいる成功したアプリをどのように作成できるでしょうか。 わからない、成功したアプリを作っていない! でも、かわいいものを作ったので、私の話を皆さんと共有したいと思います。
レッスン1:ドットを接続する
成功は(通常)一夜にしては起こらず、これは私の最初のアプリではありません。 私には、マケドニア正教会暦のような予期せぬ週末の開発ヒットから、400万人以下が理解できる言語での30,000人以上のユーザーから、メディア報道が多く、 600人を超えるアクティブユーザーのひどいユーザーベース。 そこにはたくさんのレッスンがあります!
これらのアプリは、「ユーザーと呼ばれるとらえどころのない生き物」の心を少しよく理解するのに役立ちましたが、私にインスピレーションを与えたのは2時間のプロジェクトでした。 もともと私を百万長者にするために開発されましたが、Googleが1ドルあたり30セントを受け取るため、1,428,571人のユーザーがアプリを購入すると、ドルアプリは私の商人のアカウントをテストするために作られました。
数年後、幸せなお母さんから、私のアプリが抱きしめるたびに男の子が笑っていたので、これまでで最高のお金だったというメールが届くとは、ほとんど知りませんでした。
そして、それがアイデアが生まれた方法です! 抱擁のための基本的な人間の必要性を使用して、それをきれいにしてみませんか? 特定の視聴者向けに、インタラクティブでやりがいがあり、使用するのが楽しく、共有するのがさらに楽しくなります。
レッスン2:Androidマーケットを理解する
私が上で述べたすべてのものは、ライブ壁紙アプリに追加されました。 基本はそれほど推測するのは難しいことではありません。 AndroidはiOSよりも大きな市場シェアを持っていますが、iOSユーザーはより多くを購入します。 メッセージングアプリは非常に人気がありますが、フリーミアムゲームが収益の上位を占めています。 中国、インド、ブラジル、ロシアは新興市場ですが、消費習慣がありません。 詳細については、AppAnnieIndexをご覧ください。
では、ライブ壁紙アプリはこれにどのように適合しますか? まず第一に、ライブ壁紙はAndroidのものであるため、ほとんどのプラットフォームが排除されます。 次に、この機能はAndroid 2.1で追加されたため、大規模なコミュニティとかなりの数の美しい例があります。 最も注目すべきは、PaperlandとRoman NurikのオープンソースMuzeiであり、おそらくAndroid開発の最良の参照ポイントです。
そこにはたくさんのライブ壁紙がありますが、それらのほとんどは風光明媚な/天気のカテゴリに分類され、かわいらしさの過負荷のカテゴリに分類されるものはほとんどありません。 これは私たちが変更したかったものであり、まったく別の理由でロックを解除した場合でも、電話のロックを解除するたびに笑顔になるものを提供します。 夜寝る前や朝の目覚ましを消すときに抱きしめる、かわいい小さな喜びをお届けします。 そしてさらに良いことに、それを個人的でカスタマイズ可能にします。
さらに面倒なことはせず、技術的な詳細に入る前に、私は誇らしげにあなたに提示します:Ooshies-ライブ壁紙
それは特徴です:
- あなたに抱擁を与える無料のライブ壁紙アプリ
- から選択する12のユニークなooshies
- 無料、ロック解除可能、購入可能なコンテンツ
- 現在の天気の更新
- ソーシャルログインとデータ同期
- 季節のご挨拶
- 多くの驚き
- 忍者猫
- ハグについて言及しましたか?
レッスン3:それを実現しよう
Ooshiesは非常に単純なAndroidアプリのアイデアのように見えました。 背景をペイントし、雲や星を重ね、風船を持ったクマを上に乗せれば、準備完了です。 しかし、いいえ、それはAndroidです! 簡単に思えることはしばしば非常に困難であり、私たちは同じよくある間違いを何度も繰り返す傾向があります。 これが私が直面した課題の簡単な要約です:
ハードウェアアクセラレーション-GPUが非常に優れているのに、なぜCPUを使用して描画するのですか? キャンバスにビットマップを描画することは、ハードウェアアクセラレーションでは不可能であることがわかりました。 少なくとも当面はそうではありません。
OpenGL-ハードウェアアクセラレーションが必要な場合は、OpenGL ESを使用するか、ほとんどの作業を実行するフレームワークを使用する必要があります。
ビットマップの読み込み-よく知られているメモリ消費の問題。 1つのピクセルを表示するには、#ARGBのチャネルごとに1バイト[0-255]のメモリを割り当てる必要があります。 また、私たちが使用する画像は、多くの場合、デバイスのディスプレイよりも高い解像度を持っています。 それらをすべてロードすると、すぐにOutOfMemroyExceptionが発生します。
ホームランチャー-ライブ壁紙はホームランチャープロセスでホストされ、ランチャーが異なれば、ライブ壁紙サービス(特にNovaとTouchWiz)に異なるコールバックを与える傾向があります。
バッテリーの寿命-正しく行われなかった場合、ライブ壁紙とウィジェットは多くのバッテリーを消耗する可能性があります。 Lollipop(Android 5.0)のひどいバッテリー寿命についてのすべての話題で、最初に行くアプリはライブ壁紙になります。
つまり、ビットマップをオーバーレイし、それをキャンバスにペイントしてから、タッチでフレームを切り替えてハグを与えることは、CPUで行われたとしても、大したことではないようですよね? そうです、それは問題ではありません。 しかし、誰が静的なライブ壁紙を望んでいますか? それは目的を打ち負かします。 壁紙はあなたのタッチに反応する必要があり、ホーム画面をスクロールすると動く必要があり、ランダムな親切な行動を実行し、あなたを幸せにさせる必要があります。
そして、そのためのAndroid開発のトリックがあります。 2次元空間に奥行きを加えるための視差効果と呼ばれる用語があります。 車を運転している自分を想像してみてください。 あなたに近い家は遠くの山よりも速く移動します。 キャンバス上でオブジェクトを異なる速度で移動しても、同じ効果が得られます。 それらはすべて同じ平面にありますが、あなたの脳はより速く動く物体をあなたに近いものとして知覚します。 ドロップシャドウを追加するのと同じように、視差効果は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); }
offset
は、ユーザーがスクロールした距離のパーセンテージです。 これは、壁紙エンジンが提供するコールバックです。
@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デバイスを排除しました。 下位互換性を維持するための努力は、電話をアップグレードできない/アップグレードしたくないユーザーからの可能な収益よりも大きくなります。 したがって、ほとんどの場合、必要に応じて視差を無効にするオプションを追加することで、スムーズなエクスペリエンスを実現できます。
もう1つの大きな最適化は、ビットマップの処理方法です。 非常によく似た視差効果は、3つではなく2つのビットマップを描画することで実現できます。
Ooshieオーバーレイ-トリミングおよび慎重にスケーリングされたOoshieビットマップ(アクセサリ化可能)
結合されたオーバーレイ-Ooshieの速度の何分の1かで移動する結合された背景と天気のビットマップ
このAndroid開発のトリックは、わずかな視差効果を低下させるため、メモリを節約し、描画時間を短縮します。
ホーム画面をスクロールすると、フレームがかなり頻繁に描画されます(理想的には1秒間に30回以上)。 CPU使用率を最小限に抑えるために、ホーム画面が表示されていないときにそれらを描画しないことが重要です(一部のロック画面、一部のアプリドロワー、アプリを開く/切り替えるなど)。
これはすべて、天気の更新と密接に関連しています。 最初は、天気を同期するために1、2時間ごとに実行する繰り返しのタスクがありましたが、それは本当にやり過ぎでした。 ユーザーが壁紙を見ることができない場合、天気情報は関係ありません。 そのため、現在、天気の更新は壁紙が表示されている場合にのみ発生します。
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回結合する
- 描画するビットマップを減らす
- オンデマンドでのみ再描画
- バックグラウンドタスクを避ける
- プロセスをある程度制御できるようにする
レッスン5:テスト。 テスト。 テスト
これがどれほど重要かは強調できません。 決して繰り返さないでください。テストする前にアプリをリリースしてください。 そして、私はあなたがテストをするべきだという意味ではありません。 あなたはコードを書き、それがどのように機能するかを知っており、期待を知ることによって結果に影響を与えます。 私はJUnitテスト(推奨されていますが)について話しているのではなく、段階的なロールアウト、つまりアルファテストとベータテストについて話しているのです。
Androidソフトウェア開発に興味がある場合、用語は簡単ですが、簡単に説明します。
アルファテスター-チームメイトと業界の人々、できればAndroid開発者で構成される少数の人々。 彼らはハイエンドのデバイスを持ち、開発者のオプションを試してみる可能性があります。 スタックトレースやバグレポートが送信され、コード/UI最適化のヒントやコツも提供されます。 部分的/欠落した機能を備えた初期リリースに最適です。
ベータテスター-さまざまな人口統計を持つはるかに幅広い対象者。 安定したリリースはここで公開する必要があります。 忍者のレベルが高すぎる場合でも、考えられるすべてのAndroidディストリビューションと、人々が携帯電話を使用する方法を予測することはできません。
アルファを通過したら、完了したと思いました。 しかし、男の子私は間違っていましたか?! すべてのAndroidユーザーが最新のソフトウェアを搭載したNexusデバイスを持っているわけではないことが判明しました。 誰が知っているだろうか? :)
この啓示に基づくAndroid開発の問題は次のとおりです。
ランチャーが異なれば、デフォルトのホーム画面も異なります。通常は最初または中央の画面であり、私が知る限り、その位置を知る方法はありません。
デフォルトのホーム画面の位置を知らずにOoshieを中央に配置するのは困難です。したがって、視差オフセットを調整するための設定スライダーです。
平均的なユーザーは、視差オフセットの意味を知りません。設定ページでは、はるかに簡単な用語を使用する必要があります。
ランダムなユーザーが次の機能を提案します。
ですから、ベータテスターの皆さんの努力に感謝したいと思います。 誰よりも早くすべての最新機能を入手することが、彼らの献身に対するまともな報酬になることを願っています。 必要に応じて、Google+ベータコミュニティに参加することもできます。
レッスン6:データを語らせる
今日目立つAndroidアプリを作ることは、2009年に誰もいなくなった電卓アプリを作ることよりも少し難しいです。完璧なアプリを作ることは難しいです。 主な理由は、完璧が見る人の目にあるからです。 私にとって良いことは、必ずしもあなたにとって良いことを意味するわけではありません。 そのため、アプリを成長させることが重要です。 新機能のロードマップチェックリストは、2015年全体で十分な作業があることを示しています。
- 音
- 季節の背景
- カスタマイズ(背景色、ウェザーパック、ooshieスキンなど)
- 地域固有のooshies(例:babushkas)
- たくさんの新しいooshiesとそれらのロックを解除する方法
これで、すべてが完了するまでアプリをベータ版のままにしていた可能性がありますが、そうすることで貴重なデータを破棄しています。 すべてのベータテスターが1日の一部をフィードバックの送信に費やすわけではありません。 ここで、フィードバックを取得するためのツールを使用することでメリットを得ることができます。 Google Analytics、Flurry、Mixpanel、Crashalytics、ACRAなどを使用して使用状況データを収集できます。
たとえば、データを分析すると、ユーザーが設定ボタンをあまりクリックしないことがわかったので、それをより明確にし、設定を微調整するための簡単なチュートリアルを追加しました。
これはバックグラウンドプロセスですが、ユーザーエクスペリエンスをさらに向上させるために使用できます。 ユーザーに何回表示しないのですか?
- 彼/彼女は抱擁を受けました
- 何日雨が笑顔で明るくなったのか
- ミニゲームで大石江のロックを解除するのに必要なタップ数
- あなたのおかげで何人の友達がアプリをインストールしましたか
それは彼らの行動に結果をもたらすので、これは重要です。 私たちの教育システムと同じ過ちを犯さないでください。ユーザーは受動的なコンテンツの消費者になります。 それらを担当させてください。 自分のデバイスを制御し、自分の個人的な体験を作成するオプションを提供します。 これらすべてを最初のスプラッシュで笑顔を盗むかわいいバンドルにパッケージ化することができれば、コンテンツのロックを解除するためのスパムのような好意をユーザーに求めるのにそれほど遠くはありません。
最終的には、ガイドとしてこのデータに基づいてAndroidアプリの開発を進化させる必要があります。 主にママ/子供を対象としていますが、このアプリは他の人口統計でも人気が出る可能性があります。 当初のビジョンには合わないかもしれませんが、ユーザーのニーズを満たす必要があります。 そうでなければ、彼らはできる人を見つけるでしょう。
結論
私の最も成功した失敗TweetsPieに戻りましょう。 いくつかの賞と膨大なメディア報道にもかかわらず、アプリはユーザーを維持できませんでした(理由はこの記事の範囲を超えています)。
成功は必ずしも明白ではありません。 全体の経験のおかげで、私はたくさんのことを学びました。 私は少なくとも、さまざまなイベントやハッカソンのスタートアップとして失敗する(失敗しない)方法について12の講義を行い、Toptalで数人のクライアントを獲得することができました。
さらに重要なのは、このガイドのヒントとコツに従って、Ooshiesで同じAndroid開発の間違いを繰り返さないようにすることです。
この長いガイドを締めくくるために、私たちが成功と定義するのは、後の段階で、最初に目標として設定したものと緊密に結びついています。 最も一般的な成功の尺度は、もちろん、たくさんのお金を稼ぐことです。 あなたのアプリがそれを成し遂げるかどうかに関係なく、あなたはそれを成し遂げようとしなければなりません、そして最後にあなたがより良い人(うまくいけばOpenGLを学ぶことができる人)になると私を信じてください。 あなたは新しい友達を作り、敵はほとんどいません。そしてあなたが幸運で賢いなら、多くのユーザーを幸せにするでしょう。
当社のウェブサイトを確認するか、Ooshiesをダウンロードしてお試しください。