開發 Android 應用程序的技巧:我的經驗教訓

已發表: 2022-03-11

你好! 我是 Ivan,我從事 Android 應用程序開發已經有一段時間了。 或者看起來是這樣。 回到過去(我們談論的是 2009 年),Android 還只是個嬰兒,我看著小綠人從那時起成長。 恐怕前段時間,Android 已經超越了我。

如今,Android 不僅在數以萬計的不同手機和平板電腦上運行。 它就在你的手腕上,在你的客廳裡,在你的車裡,一旦我們開始為無生命的物體分配 IP 地址,它就會無處不在。 即使是經驗豐富的 Android 開發人員也有很多基礎!

此外,僅在 Google Play 上就有超過 100 萬個應用程序,不包括 Amazon AppStore 或我們通常不感興趣的市場,例如中國。 讓我們不要忘記每年創造數十億收入的無數移動應用程序開發公司。

那麼,獨立開發者如何才能在這個擁有大玩家的巨大市場中創造出成功的應用程序呢? 我不知道,我還沒有製作成功的應用程序! 但是,我做了一個可愛的,我想和你分享我的故事。

第 1 課:連接點

成功(通常)不會在一夜之間發生,這不是我的第一個應用程序。 我有過一些意想不到的周末開發熱潮,比如Macedonian Orthodox Calendar ,擁有超過 30,000 名用戶,使用的語言不超過 400 萬人可以理解,還有更成功的失敗,比如TweetsPie ,一個擁有大量媒體報導的應用程序和一個糟糕的用戶群只有 600 多個活躍用戶。 那裡有很多課!

雖然這些應用程序幫助我更好地理解了“被稱為用戶的難以捉摸的生物”的想法,但激發我靈感的是一個兩個小時的項目。 最初是為了讓我成為百萬富翁而開發的,一旦有 1,428,571 名用戶購買了該應用程序,因為谷歌從每一美元中抽取 30 美分, 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 應用程序創意。 畫一個背景,覆蓋一些雲彩和星星,在上面放一隻帶氣球的熊,你就可以開始了。 但不,這是安卓! 看似簡單的事情往往非常困難,我們傾向於一遍又一遍地重複同樣的常見錯誤。 以下是我面臨的挑戰的簡要介紹:

  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); }

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 設備。 保持向後兼容性的努力大於用戶無法/不願意升級手機的可能收入。 因此,在大多數情況下,如果需要,我們可以通過添加禁用視差的選項來獲得流暢的體驗。

根據這個 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 課:讓數據說話

製作一個今天出類拔萃的 Android 應用程序比製作一個計算器應用程序要困難一些,當時在 2009 年還沒有。製作完美的應用程序很難。 主要是因為完美是在旁觀者的眼中。 對我有好處的,並不一定對你有​​好處。 這就是為什麼讓應用程序增長很重要的原因。 我們的新功能路線圖清單表明,我們在整個 2015 年都有足夠的工作量。除其他事項外,我們很快將包括:

  1. 聲音
  2. 季節性背景
  3. 自定義(背景顏色、天氣包、ooshie 皮膚等)
  4. 地區特定的ooshies(例如頭巾)
  5. 許多新的ooshies和解鎖它們的方法

現在,我們可能會一直將應用程序保持在測試階段,直到一切都完成,但這樣我們就丟棄了有價值的數據。 並非所有 Beta 版測試人員都會抽出一部分時間向您發送反饋。 這就是您可以受益於使用工具獲取反饋的地方。 您可以使用 Google Analytics、Flurry、Mixpanel、Crashalytics、ACRA 等來收集使用數據。

例如,通過分析數據,我們注意到用戶不會經常點擊設置按鈕,因此我們使其更加明顯,並添加了調整設置的快速教程。

雖然這是一個後台進程,但它可以用來進一步改善用戶體驗。 為什麼不向用戶顯示多少次:

  1. 他/她得到了一個擁抱
  2. 多少個雨天被一個微笑照亮
  3. 使用迷你游戲解鎖 Ooshie 需要多少次點擊
  4. 有多少朋友因為你安裝了這個應用

每個 Android 開髮指南都應該宣傳 Google Analytics 在優化您的應用方面的重要性!

這很重要,因為它為他們的行為提供了後果。 不要犯我們的教育系統所犯的同樣錯誤,使用戶成為被動的內容消費者。 讓他們負責。 讓他們可以選擇控制自己的設備並創建自己的個人體驗。 如果您設法將所有這些打包成一個可愛的捆綁包,在第一次飛濺時偷走微笑,那麼要求用戶提供垃圾郵件以解鎖內容並不是太牽強。

最後,您需要以這些數據為指導來改進您的 Android 應用程序開發。 雖然主要是為媽媽/孩子設計的,但這個應用程序可能會在其他人群中流行起來。 它可能不符合我們最初的願景,但必須滿足用戶的需求。 否則他們會找到可以的人。

結論

讓我們回到我最成功的失敗 TweetsPie。 儘管獲得了一些獎項和大量的媒體報導,但該應用程序未能留住它的用戶(原因超出了本文的範圍)。

成功並不總是顯而易見的。 由於整個經歷,我學到了很多東西。 我至少在各種活動和黑客馬拉鬆上就如何(不)作為一家初創公司失敗進行了十幾次講座,並設法在 Toptal 獲得了幾個客戶。

更重要的是,通過遵循本指南中的提示和技巧,我盡量不要在 Ooshies 上重複同樣的 Android 開發錯誤。

總結這個長篇指南,我們定義為成功的是,在後期階段,與我們一開始設定的目標緊密結合。 當然,最常見的成功衡量標準是賺很多錢。 無論您的應用程序是否成功,您都必須努力實現它,並相信我最終您會成為一個更好的人(希望能夠設法學習 OpenGL)。 你會結交新朋友,很少有敵人,如果你足夠幸運/足夠聰明,你會讓很多用戶開心。

您可以查看我們的網站或下載 Ooshies 試一試。