Android NDK的處理方法經驗談

隨著Android NDK 提供許多的新設備和新功能,並且針對了 ARM的設備提供了效能上的改進,在此列出開發的經驗談,希望對您有所幫助。

  • 不要急的轉換為C語言
  • 除非您計劃移植現有的C++應用程序或計畫開發全新的跨平台的APP,否則不要倉促在初期,急的把專案寫成C語言,建議是先在JAVA 把專案完成,並把效能較慢的函數,獨立出來一個測試的APP,再把該功能用C語言來處理,記得!請用數據來代替猜測,請用把執行的時間,用Log 記錄下來,調整再調整,改善執行的效率。

  • 關注目標
  • 一般的設備都是使用ARMv7,這意思是可以使用ARM 的 v7版本和功能。再最新版的NDK 10b增加了ARMv7和NEON程式範例支持,可以實現關鍵程式和多媒體的功能都有對應的組合語言指定集 。並且 NDK也提供跨不同CPU 的處理方法,可以在編輯程式或執行時,可以識別執行的CPU。

  • 調整問題點
  • 請用工具或時間函數來分析程式,一個一個函數處理和優化程式,不要一口氣大改,或者重新開發,只要把有問題的JAVA 程式翻寫為C 語言,就可以讓用戶在沒有感覺的情況下,加強執行效率。

  • 使用Java的異常處理
  • 開發時難免都會有bug, 在開發NDK時,請多多使用Java 的try… catch ,即時在裡面呼叫C語言時,萬一有問題時,頂多退回到Java 層做例外處理,也不會導致APP 被強制退出。

  • 優化架構
  • 事實上Eclipse 的JAVA 除錯環境真的太好了,而NDK 的C語言環境在除錯和測試上,目前還沒有好的工具。所以架構、UI使用者介面等大方向的部分,還請在Java層面優化和處理。

  • 憶體分配要小心
  • Java的記憶體盡用Java來分配,而C語言的盡用C來分配,減少互相分享記憶體、和記憶體指向的分配,以免有leak 記憶體洩漏或指針的位置錯誤的情況發生。

  • 謹慎採用多線程
  • 在開發初期,請謹慎採用多線程,以免因為造成除錯和開發的困難度,當然在開發測試的後期,將程式改成多線程,可以在多核心的CPU上會有更棒的執行效果。但切記,多線程會加重系統負載,Android系統自身會創建幾條線程去運行一個應用程序,如果都在等待事件的觸發事件的執行線程,會削弱它們的運行能力,適得其反地降低整體用戶體驗。

  • Java層的線程
  • 如果將邏輯分為多個線程,應盡可能通過Java執行,而不要採用Pthreads。使用Java VM管理訪問可以降低風險,且有更多的語言層工具。如果您擔心設置成本,採用現有的小型工人池應該不會太困難。切記將長期任務的更新發回到主UI線程,以確保用戶使用反應和用戶體驗。

  • 懂得何時使用彙編程序
  • C或C++可以立即帶來速度提升,但是卻比Java要難以維護,可以通過將程式中的關鍵部分轉換為翻寫彙程式來實現進一步提升,但卻需要耗費時間、精力與最終受益之間做出決定,最好先發布現在的Java 版本,然後以後發布升級版,而不是永無休止的修改,這樣陷入程式正式發佈版的問題。

  • 懂得如何使用NEON
  • NEON是一個非常強大的工具,在理想環境中​​,可給程式8倍的性能提升,但只適合給ARMv7 。

  • 不排次使用ARM 組合語言
  • ARM 組合語言的指令集眾多,上手不容易,但是如果是APP中會有大量的數學計算,如遊戲模型的顯示、影像處理或多媒體等,這類會在一個迴圈中一直計算的程式的話,就很建議把其中的運算公式,寫成ARM 組合語言,效能會出乎想像中的好。

Android NDK 語言
CH01 簡介CH02 NDK 設定與入門