package Ġcom . mal in sk iy . mar athon . android Ċ Ċ import Ġcom . sh az am . ax ml parser . AX ML Parser Ċ import Ġjava . io . File Ċ import Ġjava . io . IOException Ċ import Ġjava . io . InputStream Ċ import Ġjava . util . zip . Zip File Ċ Ċ class ĠA pk Parser Ġ{ ĊĠĠĠ Ġ@ Suppress ( ĊĠĠĠĠĠĠĠ Ġ" Complex Method ", ĊĠĠĠĠĠĠĠ Ġ" Throws Count ", ĊĠĠĠĠĠĠĠ Ġ" Too Generic Exception Thrown ", ĊĠĠĠĠĠĠĠ Ġ" Nested Block Depth " ĊĠĠĠ Ġ) ĊĠĠĠ Ġfun Ġparse Instrumentation Info ( apk : ĠFile ): ĠInstrument ation Info Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġapk InputStream : ĠInputStream ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġzip Ġ= ĠZip File ( apk ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġentry Ġ= Ġzip . getEntry (" Android Manifest . xml ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapk InputStream Ġ= Ġzip . getInputStream ( entry ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparser Ġ= ĠA XML Parser ( apk InputStream ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar ĠeventType Ġ= Ġparser . type ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġapp Package : ĠString ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġtest Package : ĠString ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġtest Runner Class : ĠString ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( eventType Ġ!= ĠA XML Parser . END _ DOCUMENT ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( eventType Ġ== ĠA XML Parser . START _ TAG ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparser Name Ġ= Ġparser . name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis Manifest Ġ= Ġ" manifest " Ġ== Ġparser Name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis Instrumentation Ġ= Ġ" instrumentation " Ġ== Ġparser Name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Manifest Ġ|| Ġis Instrumentation ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġparser . attribute Count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparser AttributeName Ġ= Ġparser . getAttribute Name ( i ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Manifest Ġ&& Ġ" package " Ġ== Ġparser AttributeName ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtest Package Ġ= Ġparser . getAttribute Value String ( i ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( is Instrumentation Ġ&& Ġ" target Package " Ġ== Ġparser AttributeName ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapp Package Ġ= Ġparser . getAttribute Value String ( i ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( is Instrumentation Ġ&& Ġ" name " Ġ== Ġparser AttributeName ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtest Runner Class Ġ= Ġparser . getAttribute Value String ( i ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠeventType Ġ= Ġparser . next () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠcheckNotNull ( test Runner Class ) Ġ{ Ġ" Could Ġnot Ġfind Ġtest Ġrunner Ġclass ." Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠcheckNotNull ( test Package ) Ġ{ Ġ" Could Ġnot Ġfind Ġtest Ġapplication Ġpackage ." Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠcheckNotNull ( app Package ) Ġ{ Ġ" Could Ġnot Ġfind Ġapplication Ġpackage ." Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSupport Ġrelative Ġdeclaration Ġof Ġinstrument ation Ġtest Ġrunner . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( test Runner Class . startsWith (". ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtest Runner Class Ġ= Ġtest Package Ġ+ Ġtest Runner Class ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ(! test Runner Class . contains (". ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtest Runner Class Ġ= Ġ"$ test Package .$ test Runner Class " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠInstrument ation Info ( app Package , Ġtest Package , Ġtest Runner Class ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException (" Unable Ġto Ġparse Ġtest Ġapp ĠAndroid Manifest . xml .", Ġe ) ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapk InputStream ?. close () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ