/* Ċ Ġ* ĠCopyright ĠÂ© Ġ 2 0 1 7 - 2 0 1 9 ĠWire Guard ĠLLC . Ċ Ġ* ĠCopyright ĠÂ© Ġ 2 0 1 8 - 2 0 1 9 ĠHar sh ĠSh and ily a Ġ< ms f jar vis @ gmail . com >. ĠAll ĠRights ĠReserved . Ċ Ġ* ĠSPDX - License - Identifier : ĠApache - 2 . 0 Ċ Ġ*/ Ċ package Ġcom . wire guard . android . util Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . os . Build Ċ import Ġtim ber . log . Tim ber Ċ import Ġjava . io . File Ċ import Ġjava . io . File OutputStream Ċ import Ġjava . io . IOException Ċ import Ġjava . util . zip . Zip File Ċ Ċ object ĠShared Library Loader Ġ{ ĊĊĠĠĠ Ġfun Ġextract Native Library ( ĊĠĠĠĠĠĠĠ Ġcontext : ĠContext , ĊĠĠĠĠĠĠĠ Ġlib Name : ĠString , ĊĠĠĠĠĠĠĠ Ġuse Actual Name : ĠBoolean Ġ= Ġfalse , ĊĠĠĠĠĠĠĠ Ġskip Deletion : ĠBoolean Ġ= Ġfalse ĊĠĠĠ Ġ): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġapk Path Ġ= Ġget A pk Path ( context ) ĊĠĠĠĠĠĠĠ ĠTim ber . d (" apk Path : Ġ$ apk Path ") ĊĠĠĠĠĠĠĠ Ġval Ġzip File : ĠZip File ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġzip File Ġ= ĠZip File ( File ( apk Path ), ĠZip File . OPEN _ READ ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException ( e ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġmapped Lib Name Ġ= Ġif Ġ( lib Name . contains (". so ")) Ġlib Name Ġelse ĠSystem . map Library Name ( lib Name ) ĊĠĠĠĠĠĠĠ Ġfor Ġ( abi Ġin ĠBuild . SUPPORTED _ AB IS ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlib Zip Path Ġ= Ġ" lib " Ġ+ ĠFile . separator Char Ġ+ Ġabi Ġ+ ĠFile . separator Char Ġ+ Ġmapped Lib Name ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġzip Entry Ġ= Ġzip File . getEntry ( lib Zip Path ) Ġ?: Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġf : ĠFile ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġf Ġ= Ġif Ġ( use Actual Name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFile ( context . cacheDir . absolute Path Ġ+ ĠFile . separator Char Ġ+ Ġmapped Lib Name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFile . create TempFile (" lib ", Ġ". so ", Ġcontext . cacheDir ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire NotNull ( f ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" Extract ing Ġapk :/ $ lib Zip Path Ġto Ġ${ f . absolute Path } Ġand Ġloading ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFileOutputStream ( f ). use Ġ{ Ġout Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġzip File . getInputStream ( zip Entry ). use Ġ{ ĠinputStream Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠinputStream . copy To ( out ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġf . absolute Path ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d ( e , Ġ" Failed Ġto Ġload Ġlibrary Ġapk :/ $ lib Zip Path ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġe ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! skip Deletion ) Ġf ?. delete () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress (" Unsafe Dynamic ally Loaded Code ") ĊĠĠĠ Ġfun Ġload Shared Library ( context : ĠContext , Ġlib Name : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġno Ab i Exception : ĠThrowable ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . load Library ( lib Name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠUn satisfied Link Error ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d ( e , Ġ" Failed Ġto Ġload Ġlibrary Ġnormally , Ġso Ġattempting Ġto Ġextract Ġfrom Ġapk ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġno Ab i Exception Ġ= Ġe ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġextract Native Library ( context , Ġlib Name )?. let Ġ{ Ġlib Path Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( lib Path . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . load ( lib Path ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d ( e , Ġ" Failed Ġto Ġload Ġlibrary Ġapk :/ $ lib Path ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġno Ab i Exception Ġ= Ġe ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( no Ab i Exception Ġis ĠRuntimeException ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġno Ab i Exception ĊĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException ( no Ab i Exception ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget A pk Path ( context : ĠContext ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsplit Dirs Ġ= Ġcontext . application Info . split Source Dirs ĊĠĠĠĠĠĠĠ Ġif Ġ(! split Dirs . isNull OrEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( abi Ġin ĠBuild . SUPPORTED _ AB IS ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( split Dir Ġin Ġsplit Dirs ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsplits Ġ= Ġsplit Dir . split ("/") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġapk Name Ġ= Ġsplits [ splits . size Ġ- Ġ 1 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( apk Name . contains ( abi . replace ("- ", Ġ"_ "))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġsplit Dir ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġcontext . application Info . source Dir ĊĠĠĠ Ġ} Ċ } Ċ