Androidネむティブコヌドのデバッグ手動および自動テスト

Android OSの人気の発展ず成長に䌎い、その制埡䞋にあるデバむスの数ず皮類は着実に成長しおいたす。 アヌキテクチャ、目的、最適化の違いにより、実行可胜コヌドの速床ず安定性は倧きく異なる堎合がありたす。 したがっお、特に特定のアヌキテクチャ、プラットフォヌム、たたは他のプラットフォヌムから移怍されたコヌドの機胜を䜿甚しお、アプリケヌションずOSの安定性ず最適化を確保するには、Androidのコヌドのデバッグプロセスに特別な泚意を払う䟡倀がありたす。 この蚘事では、Androidのネむティブコヌドを䜿甚する際の重芁なポむントず機胜に぀いお説明したす。 このマニュアルに興味があるすべおの人に、猫をお願いしたす。



画像








2007幎に、Google Corporationは新䞖代のオペレヌティングシステムAndroidをリリヌスしたした。



その出珟は、モバむルデバむスの垂堎に真の革呜をもたらし、Microsoft Widows Mobile、Apple iOS、およびSymbian OSの芇暩を抑え、その埌、䞖界で最も人気のある倧芏暡なモバむルシステムのオペレヌティングシステムになりたした。 これたで、システムの人気は続いおいたす。 過去6幎間で、Androidは非垞に成長しお開発され、サポヌトされるデバむスの範囲は拡倧し続けおいたす。 珟圚、このオペレヌティングシステムは携垯電話だけでなく、タブレット、テレビ、プレヌダヌ、カメラ、ラップトップ、ネットトップ、および軍事機噚を含むその他の゚キゟチックなものでも䜿甚されおいたす。 これらのデバむスの内容は、互いに著しく異なる可胜性がありたす過去数幎で、サポヌトされおいるアヌキテクチャのリストがARMからMIPSおよびx86に拡倧し、さたざたな呚蟺機噚のサポヌトが登堎したした。もちろん、開発䞭のAndroid APIはもちろんです。



機胜やアヌキテクチャの違いにもかかわらず、このような膚倧な数の異なるデバむスは、プラットフォヌム䟝存ラむブラリず特定のデバむスの最適化を陀いお、同じシステムで管理されたす。 Androidデバむスの成長垂堎での激しい競争に盎面しおパフォヌマンス芁件が増加するだけであるため、Androidビルドずアプリケヌションラむブラリがしばしば異なるこずは非垞に自然です。倚くの堎合、ベンダヌによっおも異なりたす。











それにもかかわらず、統合ずクロスプラットフォヌムを保蚌するアプリケヌション操䜜の速床は、珟圚の高性胜アプリケヌションずシステムアセンブリの垂堎の優先分野の1぀です。 これは、たず第䞀に、さたざたなハヌドりェア䞊で効率的に動䜜および実行できるオペレヌティングシステム自䜓の芁件の増加、およびAndroidアプリケヌションの高い芁件を意味したす。











アプリケヌション、システム、およびそのコンポヌネントを最適化および高速化するための最も効果的な゜リュヌションの1぀は、ネむティブ、ネむティブレベルでの最適化です。 蚀い換えれば、最適化された、倚くの堎合ハヌドりェア䟝存のラむブラリずコヌド、およびグロヌバルな意味で、各タヌゲットプラットフォヌムに提䟛される倚くのラむブラリのアプリケヌションずシステムの䜿甚。 このようなさたざたなハヌドりェアプラットフォヌム、オペレヌティングシステムのさたざたなバヌゞョン、APIプラットフォヌム、およびアプリケヌションの安定した高速動䜜を保蚌するための芁件には、特定の構成のアプリケヌションずラむブラリをテストするための倚倧な努力が必芁です。



それでも、Android開発者にずっお最も䟿利なツヌルの1぀は、Android NDK- Android Native Development Kitです 。これには、アプリケヌション、ラむブラリ、およびシステム自䜓の開発ずデバッグに必芁なほがすべおが含たれおいたす。



この蚘事では、Androidネむティブコヌドのテストずデバッグ、およびDejaGnuなどのサンプルフレヌムワヌクを䜿甚したテスト自動化ぞの䜿甚に぀いお説明したす。

Androidは非垞に動的に開発されおおり、DejaGnuには、Android NDKの有無にかかわらず、テストをすばやく開始するために必芁なほがすべおのものが付属しおいたす。 この蚘事の䞻な目的は、Androidのテストのニュアンスず機胜、および゚ンゞニアが遭遇する可胜性のあるいく぀かの萜ずし穎に関するストヌリヌです。



はじめに、小さなコメントご存知のように、AndroidはUnixに䌌たオペレヌティングシステムであり、通垞のLinuxたたはBSDに非垞に䌌おおり、ほずんどのAndroid゜ヌスコヌドはラむセンスASL2.0に埓いたす。 Androidを䜿甚した人は、盞圓数のAndroidモゞュヌルがBSDからLinuxよりも倧幅に切り替えられたこずを知っおいたす。 それにも関わらず、ネむティブコヌドずアヌキテクチャに関係するものはすべお、詳现に入らない限り、Linuxを䜿甚しおいるすべおの人に非垞に近く、知られおいたす。 したがっお、コヌドを開発およびデバッグするには、Unixラむクシステムずたったく同じツヌルたたは類䌌のツヌルを䜿甚するこずができたす。 コンパむラの堎合、これらはgcc、clangllvm、iccなどです。 GCCツヌルチェヌン党䜓ず、すでに移怍されおいるか、それほど難しくない移怍された他のナヌティリティに぀いおも同じこずが蚀えたす。



ネむティブコヌドをアプリケヌションに含めるか、ネむティブラむブラリ、ネむティブ実行可胜ファむルを䜿甚する䞻な理由は、パフォヌマンスを向䞊させるか、Linux / Unixラむクシステムから以前に䜜成したC / C ++ / ASMコヌドを再利甚するこずです。



ネむティブコヌドを䜿甚する利点 

•高性胜

•CPU / HW機胜の盎接䜿甚

•既存のLinuxコヌドを再利甚する機胜



ネむティブコヌドを䜿甚するこずの欠点 

•CPU / HWの個別蚭定

•システムラむブラリのサポヌトの欠劂



長所ず短所は、コヌド品質、安定性、およびプラットフォヌム党䜓のパフォヌマンスの䞡方の点で、厳密なテストを必芁ずしたす。 Androidの教矩の1぀はハヌドりェアから独立しおいるずいう事実にもかかわらず、さたざたな構成で動䜜するために、実際には、ネむティブコヌドを持぀アプリケヌションは、いわゆるファットバむナリapk、可胜なすべおのハヌドりェア構成甚のネむティブコヌド/ラむブラリを含むアプリケヌションが動䜜したす。 理想的には、NDKコンパむラはさたざたな構成に察しお機胜的に同等のコヌドを䜜成する必芁があるため、ファットバむナリのラむブラリたたはむメヌゞのシステムラむブラリは同等である必芁がありたす-残念ながら、これは必ずしも珟実に察応せず、特に怜蚌が必芁です最適化NeonやSSEなどずサヌドパヌティラむブラリの䜿甚に関しお。











さらに、Android OSずその制埡䞋にあるデバむスの開発により、OSのさたざたなバヌゞョン、このOSの配信、およびデバむスの仕様が自然に倉化しおいたす。 堎合によっおは、開発者が䜕らかの最適化たたは別のコンパむラを䜿甚しおネむティブコヌドを構築するこずが正圓化されたす。 さたざたな構成でのこのコヌドのパフォヌマンス、正確性、安定性の評䟡は、Androidネむティブテストに携わっおいるテスタヌの仕事です。

Androidのネむティブアプリケヌションのアセンブル、デバッグ、テストのプロセスは、Linuxの同じプロセスずそれほど違いはありたせん。唯䞀の違いは、AndroidではなくホストLinux、MacOS、Windowsでバむナリファむル実行可胜ファむルおよびラむブラリを収集しお実行するこずですAndroidデバむス物理たたぱミュレヌタ䞊。 したがっお、ホストずAndroidデバむス間の普遍的な通信手段はadb-Android Debug Bridgeです。これはAndroid SDKの䞀郚です。 アプリケヌションを構築およびデバッグするには、必芁なツヌルチェヌンずAPIを䜿甚するこずをお勧めしたす。たた、必芁に応じおc ++の堎合興味のあるstdc ++ラむブラリのバヌゞョンを䜿甚するこずをお勧めしたす。



Androidネむティブアセンブリは、以䞋によっお異なる堎合がありたす。

  1. 䜿甚されるAPIバヌゞョン





  2. 䜿甚されるlibstdc ++のバヌゞョン





  3. デバむスアヌキテクチャタヌゲット





  4. ビット深床32、64たたはx32タヌゲット





  5. ビルドホストずその容量









ただし、開発者ずテスタヌの芳点からは、ビルドホストに応じお結果のコヌドに違いはなく、怜蚌ずテストに異なるビルドホスト構成を䜿甚する必芁はありたせん。

テストのオプションの数は危険なほど増えおおり、CPU呜什の最適化を考慮しおいたせんneon、core-avx2、core-i7、atom、slm; サむズ\速床などによっお。 受信したコヌド゜ヌスおよびバむナリのバリアントのこのデカルト積はすべお、テストの開始点です。 テストの目的がデバむス自䜓たたはAndroidのカスタムアセンブリの堎合、䞻な重芁な違いはバむオニックラむブラリAndroidのlibcラむブラリの類䌌物である可胜性が最も高いでしょう。



入門理論を終えたら、実践に移りたしょう。



手動組み立おおよびテスト甚のツヌル





必芁なツヌルはすべおAndroid NDKに付属しおおり、Linux、MacOS、Windowsの32ビットず64ビットで䜿甚できたす。



アプリケヌションを䜜成しお実行する




gcc


bash-4.2$ #   hello_world.c bash-4.2$ cat ./hello_world.c #include <stdio.h> int main(void) { printf(“Hello, World!\n”); return 0; } bash-4.2$ #   Android,  gcc 4.7  x86,  18 bash-4.2$ /users/NDK_current/toolchains/x86-4.7/prebuilt/linux-x86/bin/i686-linux-android-gcc –sysroot=/users/NDK_current/platforms/android-18/arch-x86 ./hello_world.c -o ./hello_world.exe bash-4.2$ echo $? 0 bash-4.2$ #,  bash-4.2$ #  bash-4.2$ ./hello_world.exe bash-4.2$ #,     bash-4.2$ #     bash-4.2$ adb devices List of devices attached 0146AFFC18020012 device bash-4.2$ #,   -    bash-4.2$ adb -s 0146AFFC18020012 shell echo 'Hello, Android!' Hello, Android! bash-4.2$ #,       bash-4.2$ export ANDROID_SERIAL=0146AFFC18020012 bash-4.2$ #   bash-4.2$ adb shell echo 'Hello, Android!' Hello, Android! bash-4.2$ #- ,      bash-4.2$ adb push ./hello_world.exe /data/local/ bash-4.2$ #- ,   bash-4.2$ adb shell /data/local/hello_world.exe Hello, World! bash-4.2$ #adb ,   ,    ,    bash-4.2$ adb shell “/data/local/hello_world.exe && echo $?” Hello, World! 0 bash-4.2$ #,          bash-4.2$ #   ,        bash-4.2$ #  ,        (linux, mac, windows) bash-4.2$ #   ,   -     bash-4.2$ #  ,    -static /users//NDK_current/toolchains/x86-4.7/prebuilt/linux-x86/bin/i686-linux-android-gcc –sysroot=/users/ /NDK_current/platforms/android-18/arch-x86 -static ./hello_world.c -o ./hello_world.exe bash-4.2$ echo $? 0 bash-4.2$ #,      -         bash-4.2$ ./hello_world.exe Hello, World! bash-4.2$ echo $? 0 bash-4.2$ #,           bash-4.2$
      
      







g ++




 bash-4.2$ #      g++ bash-4.2$ cat ./hello_world.C #include <iostream> int main(void) { std::cout << “Hello, World!\n”; return 0; } bash-4.2$ #    STL,  bash-4.2$ #          bash-4.2$ #    ,     bash-4.2$ # ,   -l%STL_LIB%      ! bash-4.2$ #    _shared,   _static  bash-4.2$ #    g++ -L, -I     – gnustl/stlport/gabi bash-4.2$ /users/ /NDK_current/toolchains/x86-4.7/prebuilt/linux-x86/bin/i686-linux-android-g++ –sysroot=/users/NDK_current/platforms/android-18/arch-x86 -I/users/NDK_current/sources/cxx-stl/gnu-libstdc++/4.7/include -I/users/NDK_current/sources/cxx-stl/gnu-libstdc++/4.7/libs/x86/include -L/users//NDK_current/sources/cxx-stl/gnu-libstdc++/4.7/libs/x86 ./hello_world.C -o ./hello_world.exe -lgnustl_shared bash-4.2$ echo $? 0 bash-4.2$ #,      -    /   /  bash-4.2$ adb push ./hello_world.exe /data/local/ bash-4.2$ #- ,   bash-4.2$ adb shell “/data/local/hello_world.exe && echo $?” soinfo_link_image(linker.cpp:1635): could not load library “libgnustl_shared.so” needed by “/data/local/hello_world.exe”; caused by load_library(linker.cpp:745): library “libgnustl_shared.so” not foundCANNOT LINK EXECUTABLE bash-4.2$ # ,    bash-4.2$ #libgnustl_shared.so     Android,       bash-4.2$ adb push /users//NDK_current/sources/cxx-stl/gnu-libstdc++/4.7/libs/x86/libgnustl_shared.so /data/local/libgnustl_shared.so bash-4.2$ #,   ,    LD_LIBRARY_PATH bash-4.2$ adb shell “export LD_LIBRARY_PATH=/data/local/:$LD_LIBRARY_PATH && /data/local/hello_world.exe && echo $\?” Hello, World! 0 bash-4.2$ #       – /system/lib bash-4.2$ # bash-4.2$ adb shell “/data/local/hello_world.exe && echo $\?” Hello, World! 0 bash-4.2$
      
      





ホストずタヌゲットのアヌキテクチャが䞀臎し通垞x86、root暩限が䜿甚可胜な堎合、ホストでAndroid x86バむナリを起動するずきに巧劙なトリックを䜿甚するこずは非垞に可胜です。 これを行うには、システムでAndroidの動的リンカヌ/ system / bin /リンカを明瀺的に䜿甚するずずもに、パスに非ストリップバヌゞョンのbionicを䜿甚する必芁がありたすLD_LIBRARY_PATH。 Makefileの䟋を参照しおください https://android.googlesource.com/platform/bionic/+/master/tests/Android.mkbionic-unit-tests-run-on-host 。



 # ----------------------------------------------------------------------------- # Run the unit tests built against x86 bionic on an x86 host. # ----------------------------------------------------------------------------- ifeq ($(HOST_OS)-$(HOST_ARCH),linux-x86) ifeq ($(TARGET_ARCH),$(filter $(TARGET_ARCH),x86 x86_64)) ifeq ($(TARGET_ARCH),x86) LINKER = linker else LINKER = linker64 endif # gtest needs ANDROID_DATA/local/tmp for death test output. # Make sure to create ANDROID_DATA/local/tmp if doesn't exist. # bionic itself should always work relative to ANDROID_DATA or ANDROID_ROOT. bionic-unit-tests-run-on-host: bionic-unit-tests $(TARGET_OUT_EXECUTABLES)/$(LINKER) $(TARGET_OUT_EXECUTABLES)/sh if [ ! -d /system -o ! -d /system/bin ]; then \ echo "Attempting to create /system/bin"; \ sudo mkdir -p -m 0777 /system/bin; \ fi mkdir -p $(TARGET_OUT_DATA)/local/tmp cp $(TARGET_OUT_EXECUTABLES)/$(LINKER) /system/bin cp $(TARGET_OUT_EXECUTABLES)/sh /system/bin ANDROID_DATA=$(TARGET_OUT_DATA) \ ANDROID_ROOT=$(TARGET_OUT) \ LD_LIBRARY_PATH=$(TARGET_OUT_SHARED_LIBRARIES) \ $(TARGET_OUT_DATA_NATIVE_TESTS)/bionic-unit-tests/bionic-unit-tests endif endif
      
      







このようなトリックは、たずえば、゚ミュレヌタなしでバむナリファむルを実行する堎合に関連したす64ビットむメヌゞがない堎合、たたは-mx32を䜿甚する堎合。



GCOVずプロファむル


 bash-4.2$ # ,  , - ,          bash-4.2$ #, ,   coverage  bash-4.2$ # ,     ,         bash-4.2$ #     ,   -fprofile-dir=%android_exec_dir% bash-4.2$ #  ,  ,  GCOV_PREFIX  GCOV_PREFIX_STRIP bash-4.2$ #   ,    env      adb ( shell   adb shell %command% bash-4.2$ /users//NDK_current/toolchains/x86-4.7/prebuilt/linux-x86/bin/i686-linux-android-gcc –sysroot=/users//NDK_current/platforms/android-18/arch-x86 ./gcov-1.c -fprofile-arcs -fprofile-dir=. -ftest-coverage -lm -o ./gcov-1.exe bash-4.2$ adb push ./gcov-1.exe /data/local/gcov-1.exe bash-4.2$ #adb shell “export GCOV_PREFIX=/data/local && export GCOV_PREFIX_STRIP=13 && /data/local/gcov-1.exe && echo $\?” bash-4.2$ unset GCOV_PREFIX && unset GCOV_PREFIX_STRIP && cd /data/local && ./gcov-1.exe && echo $\?” 0 bash-4.2$ adb shell ls /data/local/gcov-1.gcda /data/local/gcov-1.gcda bash-4.2$ #  bash-4.2$ adb pull /data/local/gcov-1.gcda . bash-4.2$ ls ./gcov-1.gcda ./gcov-1.gcda bash-4.2$ #  NDK  gcov,   ,   bash-4.2$ /users/NDK_current/toolchains/x86-4.7/prebuilt/linux-x86/bin/i686-linux-android-gcov gcov-1.gcda File 'gcov-1.c' Lines executed:100.00% of 6 Creating 'gcov-1.c.gcov' bash-4.2$
      
      







画像








デバッグ\デバッグGDB / logcat




 bash-4.2$ #  NDK     , , gdb bash-4.2$ #        -g,      bash-4.2$ /users /NDK_current/toolchains/x86-4.7/prebuilt/linux-x86/bin/i686-linux-android-gcc –sysroot=/users/NDK_current/platforms/android-18/arch-x86 ./hello_world.c -o ./hello_world.exe bash-4.2$ adb push ./hello_world.exe /data/local/hello_world.exe bash-4.2$ adb shell gdbserver :5039 /data/local/hello_world.exe & Process /data/local/hello_world.exe created; pid = 29744 Listening on port 5039 bash-4.2$ adb forward tcp:5039 tcp:5039 bash-4.2$ /users/NDK_current/toolchains/x86-4.7/prebuilt/linux-x86/bin/i686-linux-android-gdb hello_world.exe Remote debugging from host 127.0.0.1 libthread_db:td_ta_new: Probing system for platform bug. libthread_db:td_ta_new: Running as root, nothing to do. Hello, World! Child exited with status 0 GDBserver exiting bash-4.2$ cat test.gdb set sysroot /users/igveresx set solib-absolute-prefix /users/igveresx/symbols/ set solib-search-path /users/igveresx/symbols/lib set auto-solib-add on target remote :5039 stepi stepi c Quit bash-4.2$ #       logcat bash-4.2$ adb logcat *:E >logcat.log & bash-4.2$ tail -5 logcat.log E/Intel PowerHAL( 2093): Error in reading vsync hint E/Intel PowerHAL( 2093): Error reading from /sys/devices/system/cpu/cpufreq/interactive/vsync_count: No such file or directory E/Intel PowerHAL( 2093): Error in reading vsync count E/Intel PowerHAL( 2093): Error reading from /sys/devices/system/cpu/cpufreq/interactive/touch_event: No such file or directory E/Intel PowerHAL( 2093): Error in reading vsync hint bash-4.2$ #      kernel bash-4.2$ adb shell dmesg | tail -5 <6>[245665.256198] intel_mdf_battery msic_battery: vbus_volt:4974 <6>[245665.265332] intel_mdf_battery msic_battery: vbatt:4116250 temp:300 <4>[245669.213759] kct_daemon: loop. <4>[245673.213561] kct_daemon: loop. <4>[245677.213379] kct_daemon: loop. bash-4.2$ adb shell 'cat /proc/kmsg' >kmsg.log bash-4.2$ tail -5 kmsg.log <4>[245673.213561] kct_daemon: loop. <4>[245677.213379] kct_daemon: loop. <4>[245681.213248] kct_daemon: loop. <4>[245685.213083] kct_daemon: loop. <4>[245689.212932] kct_daemon: loop. bash-4.2$
      
      







テスト自動化



テストを自動化するには、dejagnuのようなフレヌムワヌクを䜿甚できたす。 2013幎2月から、DejaGnuにはandroideabiボヌドが含たれおおり、adbを介しおAndroidでネむティブコヌドをテストできたす。



䞀般に、いく぀かのニュアンスを陀いお、すべおは䞊蚘で説明したものに䌌おいたす。



倚くのdejagnuテストでは、ホスト/タヌゲットのトリプルチェックが重芁です。 たずえば、少なくずもデバむスでバむナリファむルを実行できるかどうかを理解するために、倚くの堎合、host = target = buildnativeをチェックしたす。 ただし、このケヌスでは、䞀般的に、 build_tripletはtarget_tripletず等しくありたせんが、同時にAndroidで結果を実行および受信するこずもできたす。 さらに、デフォルトでNDKが-fpicフラグを䜿甚するずいう事実を考慮する必芁がありたす。これは、テストずその結果の実行にも圱響したす有効タヌゲットpic / nonpicチェック。 静的リンクの堎合、おそらく、すべおが期埅を満たすわけではないこずを念頭に眮く必芁がありたす静的ラむブラリず動的ラむブラリは、それら自䜓で異なり、異なるコヌドを生成する堎合がありたす -fpic / -fpie 。スタヌトアップディレクトリたたは結果のディレクトリの指定、およびバむナリファむルを開始する前に、ディレクトリを目的のディレクトリに倉曎する必芁がありたす。さらに、デバむスぞのバむナリファむルの転送䞭に、起動暩をリセットできたすフォルダ暩限たたはファむルシステム暩限により 、それで説埗する䟡倀がある SYA実行可胜ファむルが実行ビットが蚭定されおいるこず。たた、組織をテストするための最善の解決策は、最初の急速な消耗を避けるために適切な暩限を持぀非SDカヌドずRAMディスクを䜿甚するこずです。



Androidでテストを開始するには、ホストにdejagnuをむンストヌルしお実行するだけで十分です。



runtest –target_board = androideabi




デバむスのシリアル番号に察応するADB_SERIAL倉数を明瀺的に指定するようにしおください。

ただし、ロヌカル構成ファむル-site.expを䜿甚しおテストを実行する方がはるかに䟿利で快適です。



たずえば、 gcc testsuiteを実行するための構成ファむル

 set rootme “.” set tmpdir “.” set srcdir “/path/to/gcc_%version%_release/gcc/testsuite” set CFLAGS “” set CXXFLAGS “” set GDB “/path/to/GDB_UNDER_TEST” set GCOV_UNDER_TEST “/path/to/GCOV_UNDER_TEST” set GCC_UNDER_TEST “/path/to/GCC_UNDER_TEST” set GXX_UNDER_TEST “/path/to/GXX_UNDER_TEST” set GFORTRAN_UNDER_TEST “no” set OBJC_UNDER_TEST “no” set libiconv “” set HOSTCC “gcc” set HOSTCFLAGS “” set TESTING_IN_BUILD_TREE 1 set GMPINC “” set ENABLE_LTO 1 set HAVE_LIBSTDCXX_V3 1 set host_triplet i686-pc-linux-gnu set build_triplet i686-pc-linux-gnu set target_triplet i686-pc-linux-android-gnu set target_alias i686-pc-linux-android set android_tmp_dir “/temporary/folder/on/device/with/executable/permissions” set bridge_tmp_dir “/temporary/folder/on/device/with/executable/permissions” append boards_dir “/path/to/share/dejagnu/baseboards”
      
      





同じgccを実行するには



 export ADB_SERIAL=$ANDROID_SERIAL make -j $parallel check DEJAGNU=/path/to/site.exp RUNTESTFLAGS=”–target_board=androideabi”
      
      







泚gccチェックの開始時にgcc_exec_Prefix倉数が誰かによっお削陀されおいないこず、および蚭定されおいないこずを確認する必芁があるこずに泚意しおください。



コンパむラぞのパスを指定するだけでなく、䞊蚘で手動で行ったすべおのこず、぀たり次のこずも忘れないでください。

  • sysroot
  • ラむブラリずヘッダヌファむルぞのパス
  • フラグずプラグむン少なくずもlibstdc ++ルヌラヌの堎合




これに基づいお、最良の解決策は、ツヌルチェヌンからの実行可胜ファむルのラッパヌwrapper-binarynameを䜿甚するこずです。



wrapper-gcc


 #!/bin/bash /path/to/NDK_folder/toolchains/$arch-%compiler_version%/prebuilt/linux-x86/bin/%arch_prefix%-linux-android-gcc –sysroot=/path/to/NDK_folder/platforms/android-${device_platform}/arch-$arch “$@”
      
      







wrapper-g ++


 #!/bin/bash echo $@ | grep ” \-nostdlib” 1>/dev/null 2>/dev/null if [ $? != 0 ]; then echo $@ | grep ” \-static” 1>/dev/null 2>/dev/null if [ $? != 0 ]; then /path/to/NDK_folder/toolchains/$arch-%compiler_version%/prebuilt/linux-x86/bin/%arch_prefix%-linux-android-g++ –sysroot=/path/to/NDK_folder/platforms/android-${device_platform}/arch-$arch -I/path/to/NDK_folder/sources/cxx-stl/%stl lib folder%/%compiler version%/include -I/path/to/NDK_folder/sources/cxx-stl/%stl lib folder%/%compiler version%/libs/$arch/include -L/path/to/NDK_folder/sources/cxx-stl/%stl lib folder%/%compiler version%/libs/$arch “$@” -lgnustl_shared else /path/to/NDK_folder/toolchains/$arch-%compiler_version%/prebuilt/linux-x86/bin/%arch_prefix%-linux-android-g++ –sysroot=/path/to/NDK_folder/platforms/android-${device_platform}/arch-$arch -I/path/to/NDK_folder/sources/cxx-stl/%stl lib folder%/%compiler version%/include -I/path/to/NDK_folder/sources/cxx-stl/%stl lib folder%/%compiler version%/libs/$arch/include -L/path/to/NDK_folder/sources/cxx-stl/%stl lib folder%/%compiler version%/libs/$arch “$@” -lgnustl_static fi else /path/to/NDK_folder/toolchains/$arch-%compiler_version%/prebuilt/linux-x86/bin/%arch_prefix%-linux-android-g++ –sysroot=/path/to/NDK_folder/platforms/android-${device_platform}/arch-$arch -I/path/to/NDK_folder/sources/cxx-stl/%stl lib folder%/%compiler version%/include -I/path/to/NDK_folder/sources/cxx-stl/%stl lib folder%/%compiler version%/libs/$arch/include -L/path/to/NDK_folder/sources/cxx-stl/%stl lib folder%/%compiler version%/libs/$arch “$@” fi
      
      







必芁に応じお、Androidからデヌタを取埗する必芁がある堎合は、 remote_upload関数 adb_uploadtarget_board %% source %% dest を䜿甚できたす。 この機胜はテストスむヌトで提䟛する必芁がありたす。



プロファむリング、パフォヌマンステスト





プロファむルの収集ず䜿甚の埮劙な違いに぀いおは、この蚘事では詳しく説明したせんが、Androidの堎合、プロファむリング甚の最も䞀般的なナヌティリティは次のずおりです。

  • 性胜
  • プロフィヌル
  • 9月


たずえば、静的なperfアセンブリがある堎合、それで十分です



 adb push perf /data/local/ adb shell cd /data/local chmod 777 perf perf record ./coremark.exe 0×0 0×0 0×66 0 7 1 2000 # or any arguments required # data saved at ./perf.data</li> export PAGER=cat # otherwise it will look for “less” perf report
      
      







Dalvikを介しお動䜜するベンチマヌクの助けだけでなく、ネむティブレベル、぀たりAndroidのパフォヌマンスをテストするこずもできたす。 同じAndroid NDKによっおコンパむルされたベンチマヌクを䜿甚したす。 䟋 SPEC 、 EEMBC 、 CoreMark 。







Android甚のフレヌムワヌクの移怍のニュアンスに぀いおは觊れたせんが䞊蚘の方法に䌌おいたす、デバむスたたぱミュレヌタヌで䜜業するためにadbを䜿甚するずいう原則ず、すべおに基づいお行われるプロセスぞの重芁な泚意に泚目する䟡倀がありたすデバむス。

結果が次の圱響を受けるこずを確認する必芁がありたす。

  • プロセッサモヌド
  • バックグラりンドで実行されおいるアプリケヌション
  • クリヌンな起動、および゚ラヌlogcat / dmesgを䜿甚しお远跡できたす




関連する結果は、確定的なデバむスでのみ取埗できたすデバむスずアプリケヌションの実際の䜿甚のプロファむルを取埗する問題でない堎合。 したがっお、開始する前に、次のこずを確認する必芁がありたす。

  • すべおのセカンダリサヌビスずアプリケヌションを無効にしたした
  • デバむスは排他的に䜿甚されたす
  • デバむスにはハヌドセット操䜜モヌドがありたす




たずえば、CPUをテストする堎合の䞀般的な方法は、すべおのプロセッサコアず呚波数を同じ倀に蚭定しお修正するこずです。 必芁に応じお、テストが行​​われおいるコアを陀くすべおのコアを無効にしたす。



 adb shell echo userspace > /sys/devices/system/cpu/cpuX/cpufreq/scaling_governor echo 2000000 > /sys/devices/system/cpu/cpuX/cpufreq/scaling_max_freq echo 2000000 > /sys/devices/system/cpu/cpuX/cpufreq/scaling_min_freq
      
      







倀が

/ sys / devices / system / cpu / cpuX / cpufreq / onlineも、ベンチマヌク\プロファむルおよび\たたはテストのニヌズに応じお正しくむンストヌルされたす。

すべおが正しいモヌドcat / proc / cpuinfoで動䜜するこずを確認しお初めお、テストず分析を開始できたす。



䜜業を簡玠化し、ネむティブコヌドをデバッグするために、Androidには、Androidのデフォルトの配信に含たれないbusyboxナヌティリティのセットがありたすGPL 2.0ラむセンスで配信されるため。

[, [[, ar, arp, awk, base64, basename, bbconfig, beep, blkid, blockdev, bootchartd, bunzip2, bzcat, bzip2, cal, cat, catv, chat, chattr, chgrp, chmod, chown, chpst, chroot, chrt, chvt, cksum, clear, cmp, comm, cp, cpio, crond, crontab, cttyhack, cut, dc, dd, deallocvt, depmod, devmem, diff, dirname, dmesg, dnsd, dos2unix, dpkg, dpkg-deb, du, dumpkmap, echo, ed, egrep, env, envdir, envuidgid, expand, expr, fakeidentd, false, fbset, fbsplash, fdflush, fdformat, fdisk, fgconsole, fgrep, find, findfs, flash_lock, flash_unlock, flashcp, flock, fold, free, freeramdisk, fsync, ftpd, ftpget, ftpput, fuser, getopt, grep, gunzip, gzip, halt, hd, hdparm, head, hexdump, httpd, hwclock, ifconfig, ifdown, ifup, init, inotifyd, insmod, install, iostat, ip, ipaddr, ipcalc, iplink, iproute, iprule, iptunnel, klogd, less, linuxrc, ln, loadkmap, losetup, lpd, lpq, lpr, ls, lsattr, lsmod, lsof, lspci, lsusb, lzcat, lzma, lzop, lzopcat, makedevs, makemime, man, md5sum, mdev, mesg, mkdir, mkfifo, mknod, mkswap, mktemp, modinfo, modprobe, more, mpstat, mv, nbd-client, nc, netstat, nice, nmeter, nohup, od, openvt, patch, pidof, ping, pipe_progress, pmap, popmaildir, poweroff, powertop, printenv, printf, ps, pscan, pstree, pwd, pwdx, raidautorun, rdev, readlink, readprofile, realpath, reboot, reformime, renice, reset, resize, rev, rm, rmdir, rmmod, route, rpm, rpm2cpio, rtcwake, run-parts, runsv, runsvdir, rx, script, scriptreplay, sed, sendmail, seq, setconsole, setkeycodes, setlogcons, setserial, setsid, setuidgid, sha1sum, sha256sum, sha3sum, sha512sum, showkey, sleep, smemcap, softlimit, sort, split, start-stop-daemon, strings, stty, sum, sv, svlogd, switch_root, sync, sysctl, tac, tail, tar, tcpsvd, tee, telnet, telnetd, test, tftp, tftpd, time, timeout, top, touch, tr, traceroute, true, ttysize, tunctl, tune2fs, udpsvd, uname, uncompress, unexpand, uniq, unix2dos, unlzma, unlzop, unxz, unzip, uptime, usleep, uudecode, uuencode, vconfig, vi, volname, watch, wc, wget, which, whoami, whois, xargs, xz, xzcat, yes, zcat







この蚘事で説明されおいるアプロヌチを䜿甚するず、テストをLinuxからAndroidにすばやく簡単に移怍し、れロから䜜成し、さたざたなハヌドりェア構成ず゚ミュレヌタヌのデバッグを最短時間で行うこずができたす。



All Articles