/* Ċ Ġ* ĠTencent Ġis Ġplease d Ġto Ġsupport Ġthe Ġopen Ġsource Ġcommunity Ġby Ġmaking ĠTencent ĠShadow Ġavailable . Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 1 9 ĠTH L ĠA 2 9 ĠLimited , Ġa ĠTencent Ġcompany . Ġ ĠAll Ġrights Ġreserved . Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠBSD Ġ 3 - Clause ĠLicense Ġ( the Ġ" License "); Ġyou Ġmay Ġnot Ġuse Ċ Ġ* Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ċ Ġ* Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġhttps :// opensource . org / licenses / BSD - 3 - Clause Ċ Ġ* Ċ Ġ* Ġ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 Ġcom . tencent . shadow . dynamic . loader . impl Ċ Ċ import Ġandroid . content . Component Name Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Intent Ċ import Ġandroid . content . Service Connection Ċ import Ġandroid . os . Handler Ċ import Ġandroid . os . IB inder Ċ import Ġandroid . os . Looper Ċ import Ġcom . tencent . shadow . core . loader . Shadow Plugin Loader Ċ import Ġcom . tencent . shadow . core . runtime . container . Content Provider Delegate Provider Holder Ċ import Ġcom . tencent . shadow . core . runtime . container . Delegate Provider Holder Ċ import Ġcom . tencent . shadow . dynamic . host . Uuid Manager Ċ import Ġjava . util . concurrent . Count DownLatch Ċ Ċ internal Ġclass ĠDynamic Plugin Loader ( host Context : ĠContext , Ġuuid : ĠString ) Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠCORE _ LOAD ER _ FACTORY _ IMPL _ NAME Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" com . tencent . shadow . dynamic . loader . impl . Core Loader Factory Impl " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Uuid Manager ( p 0 : ĠU uid Manager ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( p 0 Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Uuid Manager Ġ= Ġp 0 ĊĠĠĠĠĠĠĠ Ġ// todo Ġ# 3 0 Ġ åħ¼ å®¹ m Uuid Manager ä¸º null æĹ¶çļĦ éĢ»è¾ĳ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġm Plugin Loader : ĠShadow Plugin Loader ĊĊĠĠĠ Ġprivate Ġval Ġm Dynamic Loader ClassLoader : ĠClassLoader Ġ= ĊĠĠĠĠĠĠĠ ĠDynamic Plugin Loader :: class . java . class Loader !! ĊĊĠĠĠ Ġprivate Ġvar ĠmContext : ĠContext ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġm Uuid Manager : ĠU uid Manager ĊĊĠĠĠ Ġprivate Ġvar Ġm Uuid : ĠString ĊĊĠĠĠ Ġprivate Ġval Ġm Ui Handler Ġ= ĠHandler ( Looper . get Main Looper ()) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ åĲĮ ä¸Ģä¸ª I Service Connection åıª ä¼ļ å¯¹åºĶ ä¸Ģä¸ª Service Connection å¯¹è±¡ ï¼Į æŃ¤ Map å°±æĺ¯ ä¿ĿåŃĺ è¿Ļç§į å¯¹åºĶ åħ³ç³» ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġm Connection Map Ġ= ĠHashMap < IB inder , ĠService Connection >() ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcore Loader Factory Ġ= Ġm Dynamic Loader ClassLoader . get Interface ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCore Loader Factory :: class . java , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCORE _ LOAD ER _ FACTORY _ IMPL _ NAME ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Plugin Loader Ġ= Ġcore Loader Factory . build ( host Context ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDelegate Provider Holder . set Delegate Provider ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Plugin Loader . delegate Provider Key , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Plugin Loader ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠContent Provider Delegate Provider Holder . setContent Provider Delegate Provider ( m Plugin Loader ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Plugin Loader . onCreate () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException (" å½ĵåīį çļĦ class Loader æī¾ ä¸įåĪ° Plugin Loader çļĦ å®ŀçİ° ", Ġe ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠmContext Ġ= Ġhost Context ĊĠĠĠĠĠĠĠ Ġm Uuid Ġ= Ġuuid ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġload Plugin ( part Key : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinstalled A pk Ġ= Ġm Uuid Manager . get Plugin ( m Uuid , Ġpart Key ) ĊĠĠĠĠĠĠĠ Ġval Ġfuture Ġ= Ġm Plugin Loader . load Plugin ( installed A pk ) ĊĠĠĠĠĠĠĠ Ġfuture . get () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Loaded Plugin (): ĠMutable Map < String , ĠBoolean > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġplugins Ġ= Ġm Plugin Loader . getAll Plugin Part () ĊĠĠĠĠĠĠĠ Ġval Ġload Plugins Ġ= Ġhash Map Of < String , ĠBoolean >() ĊĠĠĠĠĠĠĠ Ġfor Ġ( part Ġin Ġplugins ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġload Plugins [ part . key ] Ġ= Ġpart . value . application . is Call On Create ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġload Plugins ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Synchron ized ĊĠĠĠ Ġfun Ġcall Application On Create ( part Key : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġm Plugin Loader . call Application On Create ( part Key ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġconvert Activity Intent ( plugin Activity Intent : ĠIntent ): ĠIntent ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġm Plugin Loader . m Component Manager . convert Plugin Activity Intent ( plugin Activity Intent ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Synchron ized ĊĠĠĠ Ġfun Ġstart Plugin Service ( plugin Service Intent : ĠIntent ): ĠComponent Name ? Ġ{ ĊĊĠĠĠĠĠĠĠ Ġfun Ġreal Action (): ĠComponent Name ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġm Plugin Loader . get Plugin Service Manager (). start Plugin Service ( plugin Service Intent ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġ// Ġ ç¡® ä¿Ŀ åľ¨ ui çº¿ç¨ĭ è°ĥçĶ¨ ĊĠĠĠĠĠĠĠ Ġvar Ġcomponent Name : ĠComponent Name ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġif Ġ( is Ui Thread ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcomponent Name Ġ= Ġreal Action () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwait Ui Lock Ġ= ĠCount DownLatch ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Ui Handler . post Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcomponent Name Ġ= Ġreal Action () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwait Ui Lock . count Down () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwait Ui Lock . await () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġcomponent Name ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Synchron ized ĊĠĠĠ Ġfun Ġstop Plugin Service ( plugin Service Intent : ĠIntent ): ĠBoolean Ġ{ ĊĊĠĠĠĠĠĠĠ Ġfun Ġreal Action (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġm Plugin Loader . get Plugin Service Manager (). stop Plugin Service ( plugin Service Intent ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġ ç¡® ä¿Ŀ åľ¨ ui çº¿ç¨ĭ è°ĥçĶ¨ ĊĠĠĠĠĠĠĠ Ġvar Ġstopped : ĠBoolean Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġif Ġ( is Ui Thread ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstopped Ġ= Ġreal Action () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwait Ui Lock Ġ= ĠCount DownLatch ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Ui Handler . post Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstopped Ġ= Ġreal Action () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwait Ui Lock . count Down () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwait Ui Lock . await () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġstopped ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Synchron ized ĊĠĠĠ Ġfun Ġbind Plugin Service ( ĊĠĠĠĠĠĠĠ Ġplugin Service Intent : ĠIntent , ĊĠĠĠĠĠĠĠ Ġbinder P sc : ĠB inder Plugin Service Connection , ĊĠĠĠĠĠĠĠ Ġflags : ĠInt ĊĠĠĠ Ġ): ĠBoolean Ġ{ ĊĊĠĠĠĠĠĠĠ Ġfun Ġreal Action (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Connection Map [ binder P sc . m Remote ] Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Connection Map [ binder P sc . m Remote ] Ġ= ĠService Connection Wrapper ( binder P sc ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconn Wrapper Ġ= Ġm Connection Map [ binder P sc . m Remote ] !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġm Plugin Loader . get Plugin Service Manager () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. bind Plugin Service ( plugin Service Intent , Ġconn Wrapper , Ġflags ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// Ġ ç¡® ä¿Ŀ åľ¨ ui çº¿ç¨ĭ è°ĥçĶ¨ ĊĠĠĠĠĠĠĠ Ġvar Ġstop : ĠBoolean Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġif Ġ( is Ui Thread ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstop Ġ= Ġreal Action () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwait Ui Lock Ġ= ĠCount DownLatch ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Ui Handler . post Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstop Ġ= Ġreal Action () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwait Ui Lock . count Down () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwait Ui Lock . await (); ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġstop ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Synchron ized ĊĠĠĠ Ġfun Ġun bind Service ( conn Binder : ĠI Binder ) Ġ{ ĊĠĠĠĠĠĠĠ Ġm Ui Handler . post Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Connection Map [ conn Binder ]?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Connection Map . remove ( conn Binder ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Plugin Loader . get Plugin Service Manager (). unbind Plugin Service ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Synchron ized ĊĠĠĠ Ġfun ĠstartActivity In Plugin Process ( intent : ĠIntent ) Ġ{ ĊĠĠĠĠĠĠĠ Ġm Ui Handler . post Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠmContext . startActivity ( intent ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġclass ĠService Connection Wrapper ( private Ġval Ġm Connection : ĠB inder Plugin Service Connection ) Ġ: ĊĠĠĠĠĠĠĠ ĠService Connection Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Service Disconnected ( name : ĠComponent Name ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Connection . on Service Disconnected ( name ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Service Connected ( name : ĠComponent Name , Ġservice : ĠI Binder ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Connection . on Service Connected ( name , Ġservice ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġis Ui Thread (): ĠBoolean Ġ{ ĊĊĠĠĠĠĠĠĠ Ġreturn ĠThread . currentThread () Ġ=== ĠL ooper . get Main Looper (). thread ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġä»İ apk ä¸Ń è¯»åıĸ æİ¥åı£ çļĦ å®ŀçİ° ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġclazz ĠĠĠĠ Ġ æİ¥åı£ ç±» ĊĠĠĠĠ Ġ* Ġ@ param ĠclassName Ġ å®ŀçİ° ç±»çļĦ ç±» åĲį ĊĠĠĠĠ Ġ* Ġ@ param Ġ< T > ĠĠĠĠĠĠ Ġ æİ¥åı£ ç±»åŀĭ ĊĠĠĠĠ Ġ* Ġ@ return Ġ æīĢ éľĢ æİ¥åı£ ĊĠĠĠĠ Ġ* Ġ@ throws ĠException ĊĠĠĠ Ġ</ T > Ġ*/ ĊĠĠĠ Ġ@ Throws ( Exception :: class ) ĊĠĠĠ Ġfun Ġ< T > ĠClassLoader . get Interface ( clazz : ĠClass < T >, ĠclassName : ĠString ): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinterface Implement Class Ġ= Ġload Class ( className ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinterface Implement Ġ= Ġinterface Implement Class . newInstance () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġclazz . cast ( interface Implement ) Ġas ĠT ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠClass NotFoundException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠException ( e ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠInstanti ation Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠException ( e ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠClass CastException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠException ( e ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIllegal AccessException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠException ( e ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ } Ċ