/* Ċ Ġ* ĠCopyright Ġ 2 0 1 9 ĠThe ĠAndroid ĠOpen ĠSource ĠProject Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġandroidx . benchmark Ċ Ċ import Ġandroid . content . pm . Application Info Ċ import Ġandroid . os . Build Ċ import Ġandroid . util . Log Ċ import Ġandroidx . test . platform . app . Instrumentation Registry Ċ import Ġjava . io . File Ċ Ċ internal Ġobject ĠWarning State Ġ{ ĊĠĠĠ Ġprivate Ġconst Ġval ĠTAG Ġ= Ġ" Benchmark " ĊĊĠĠĠ Ġval ĠWARNING _ PREFIX : ĠString ĊĠĠĠ Ġprivate Ġvar Ġwarning String : ĠString ? Ġ= Ġnull ĊĊĠĠĠ Ġfun Ġacquire Warning String For Logging (): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġret Ġ= Ġwarning String ĊĠĠĠĠĠĠĠ Ġwarning String Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġreturn Ġret ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġis Em ulator Ġ= ĠBuild . F ING ER PRINT . startsWith (" generic ") Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBuild . F ING ER PRINT . startsWith (" unknown ") Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBuild . MODEL . contains (" google _ sdk ") Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBuild . MODEL . contains (" Em ulator ") Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBuild . MODEL . contains (" Android ĠSDK Ġbuilt Ġfor Ġx 8 6 ") Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBuild . MAN U FACT UR ER . contains (" Gen ym otion ") Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBuild . B RAND . startsWith (" generic ") Ġ&& ĠBuild . DEVICE . startsWith (" generic ") Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" google _ sdk " Ġ== ĠBuild . PRODUCT ĊĊĠĠĠ Ġprivate Ġval Ġis Device Root ed Ġ= ĊĠĠĠĠĠĠĠ ĠarrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"/ system / app / Super user . apk ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"/ sbin / su ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"/ system / bin / su ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"/ system / x bin / su ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"/ data / local / x bin / su ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"/ data / local / bin / su ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"/ system / sd / x bin / su ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"/ system / bin / fails afe / su ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"/ data / local / su ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"/ su / bin / su " ĊĠĠĠĠĠĠĠ Ġ). any Ġ{ ĠFile ( it ). exists () Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġis Cpu Locked (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠIf Ġany Ġcore Ġis Ġdetected Ġto Ġhave Ġa Ġvariable Ġclock Ġspeed , Ġthis Ġflag Ġis Ġset Ġto Ġfalse . ĊĠĠĠĠĠĠĠ Ġvar Ġcpu Clock s Are Locked Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġval Ġcpu Dir Ġ= ĠFile ("/ sys / devices / system / cpu ") ĊĠĠĠĠĠĠĠ Ġval Ġcore Dirs Ġ= Ġcpu Dir . list Ġ{ Ġcurrent , Ġname Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFile ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). isDirectory Ġ&& Ġname . matches ("^ cpu [ 0 - 9 ]+ ". to Regex ()) ĊĠĠĠĠĠĠĠ Ġ}. map Ġ{ Ġ"${ cpu Dir . path }/ $ it " Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠCheck Ġcpu Ġclock Ġlocking Ġby Ġtesting Ġagainst Ġeach Ġcore 's Ġminimum Ġpossible Ġclock Ġspeed . ĊĠĠĠĠĠĠĠ Ġfor Ġ( core Dir Ġin Ġcore Dirs ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġskip Ġdisabled Ġcores ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( readFile Text OrNull ("$ core Dir / online ") Ġ== Ġ" 0 ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcpu Min Freq Str Ġ= ĠreadFile Text OrNull ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ core Dir / cp uf req / scaling _ min _ freq " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ?: Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcpu Min Freq Ġ= ĠInteger . parseInt ( cpu Min Freq Str ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcpu All Avail Freq Str Ġ= ĠreadFile Text OrNull ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ core Dir / cp uf req / scaling _ available _ frequ encies " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ?: Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcpu Avail Min Freq Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcpu All Avail Freq Str . split ("\\ s +". to Regex ()). map Ġ{ ĠInteger . parseInt ( it ) Ġ}. min () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcore M ight Be Locked Ġ= Ġcpu Avail Min Freq Ġ!= Ġcpu Min Freq ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcpu Clock s Are Locked Ġ= Ġcpu Clock s Are Locked Ġ&& Ġcore M ight Be Locked ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠFailed Ġto Ġread Ġthe Ġcpu Ġclock Ġspeed ! ĠThis Ġcan Ġhappen Ġin Ġa Ġnumber Ġof Ġcases Ġwhere ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthe Ġrequired Ġfiles Ġare Ġeither Ġmissing Ġdue Ġto Ġrunning Ġon Ġan Ġemulator Ġor Ġwhen Ġthe ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġfiles Ġhave Ġbeen Ġt amper ed Ġwith Ġ/ Ġnot Ġgenerated Ġby Ġthe ĠOS Ġfor Ġsome Ġcores . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! is Em ulator ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Error Ġwhile Ġreading Ġcpu Ġclock Ġstate ", Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġcpu Clock s Are Locked ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġapp Info Ġ= ĠInstrument ation Registry . get Instrumentation (). target Context ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. application Info ĊĠĠĠĠĠĠĠ Ġvar Ġwarning Prefix Ġ= Ġ"" ĊĠĠĠĠĠĠĠ Ġvar Ġwarning String Ġ= Ġ"" ĊĠĠĠĠĠĠĠ Ġif Ġ( app Info . flags Ġand ĠApplication Info . FLAG _ DEBUG G ABLE Ġ!= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwarning Prefix Ġ+= Ġ" DEBUG G ABLE _" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwarning String Ġ+= Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| WARNING : ĠDebug gable ĠBenchmark ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠ ĠBenchmark Ġis Ġrunning Ġwith Ġdebug gable = true , Ġwhich Ġdr astic ally Ġreduces ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠ Ġruntime Ġperformance Ġin Ġorder Ġto Ġsupport Ġdebugging Ġfeatures . ĠRun ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠ Ġbenchmarks Ġwith Ġdebug gable = false . ĠDebug gable Ġaffects Ġexecution Ġspeed ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠ Ġin Ġways Ġthat Ġmean Ġbenchmark Ġimprovements Ġmight Ġnot Ġcarry Ġover Ġto Ġa ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠ Ġreal Ġuser 's Ġexperience Ġ( or Ġeven Ġre gress Ġrelease Ġperformance ). ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Margin Wrap New lines () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( is Em ulator ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwarning Prefix Ġ+= Ġ" EM UL ATOR _" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwarning String Ġ+= Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| WARNING : ĠRunning Ġon ĠEm ulator ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠ ĠBenchmark Ġis Ġrunning Ġon Ġan Ġemulator , Ġwhich Ġis Ġnot Ġrepresentative Ġof ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠ Ġreal Ġuser Ġdevices . ĠUse Ġa Ġphysical Ġdevice Ġto Ġbenchmark . ĠEm ulator ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠ Ġbenchmark Ġimprovements Ġmight Ġnot Ġcarry Ġover Ġto Ġa Ġreal Ġuser 's ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠ Ġexperience Ġ( or Ġeven Ġre gress Ġreal Ġdevice Ġperformance ). ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Margin Wrap New lines () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( Build . F ING ER PRINT . contains (": eng / ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwarning Prefix Ġ+= Ġ" EN G - BUILD _" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwarning String Ġ+= Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| WARNING : ĠRunning Ġon ĠEng ĠBuild ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠ ĠBenchmark Ġis Ġrunning Ġon Ġdevice Ġfl ashed Ġwith Ġa Ġ'- eng ' Ġbuild . ĠEng Ġbuilds ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠ Ġof Ġthe Ġplatform Ġdr astic ally Ġreduce Ġperformance Ġto Ġenable Ġtesting ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠ Ġchanges Ġquickly . ĠFor Ġthis Ġreason Ġthey Ġshould Ġnot Ġbe Ġused Ġfor ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠ Ġbenchmark ing . ĠUse Ġa Ġ'- user ' Ġor Ġ'- user debug ' Ġsystem Ġimage . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Margin Wrap New lines () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( is Device Root ed Ġ&& Ġ! is Cpu Locked ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwarning Prefix Ġ+= Ġ" UNLOCK ED _" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwarning String Ġ+= Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| WARNING : ĠUn stable ĠCPU Ġclock s ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠ ĠBenchmark Ġappears Ġto Ġbe Ġrunning Ġon Ġa Ġroot ed Ġdevice Ġwith Ġun locked ĠCPU ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠ Ġclock s . ĠUn locked ĠCPU Ġclock s Ġcan Ġlead Ġto Ġinconsistent Ġresults Ġdue Ġto ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠ Ġdynamic Ġfrequency Ġscaling , Ġand Ġth ermal Ġth rottling . ĠOn Ġa Ġroot ed ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠ Ġdevice , Ġlock Ġyour Ġdevice Ġclock s Ġto Ġa Ġstable Ġfrequency Ġwith Ġlock Clock s . sh ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Margin Wrap New lines () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠWARNING _ PREFIX Ġ= Ġwarning Prefix ĊĠĠĠĠĠĠĠ Ġif Ġ(! warning String . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . warning String Ġ= Ġwarning String ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwarning String . split ("\ n "). map Ġ{ ĠLog . w ( TAG , Ġit ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSame Ġas Ġtrim Margins , Ġbut Ġadd Ġnew lines Ġon Ġeither Ġside . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun ĠString . trim Margin Wrap New lines (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ"\ n " Ġ+ Ġtrim Margin () Ġ+ Ġ" Ġ\ n " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRead Ġthe Ġtext Ġof Ġa Ġfile Ġas Ġa ĠString , Ġnull Ġif Ġfile Ġdoesn 't Ġexist . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun ĠreadFile Text OrNull ( path : ĠString ): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ ĠFile ( path ). run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( exists ()) Ġread Text (). trim () Ġelse Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ