package Ġcom . ang cy o . u iv iew . dynamic load Ċ Ċ import Ġandroid . text . TextUtils Ċ import Ġcom . ang cy o . library . utils . L Ċ import Ġcom . ang cy o . u iv iew . R Application Ċ import Ġcom . ang cy o . u iv iew . base . UI Base View Ċ import Ġcom . ang cy o . u iv iew . dynamic load . internal . DL PluginManager Ċ import Ġcom . ang cy o . u iv iew . dynamic load . internal . DL Plugin Package Ċ import Ġcom . ang cy o . u iv iew . net . Func Ċ import Ġcom . ang cy o . u iv iew . net . Rx Ċ import Ġcom . ang cy o . u iv iew . view . I View Ċ import Ġrx . Observable Ċ Ċ /** Ċ Ġ* ĠCreated Ġby Ġang cy o Ġon Ġ 2 0 1 8 / 0 4 / 0 1 Ġ 1 5 : 3 7 Ċ Ġ*/ Ċ object ĠR Plugin Ġ{ ĊĊĠĠĠ Ġ/** ä»İ AP K ä¸Ń , Ġ åĬłè½½ æĮĩå®ļçļĦ I View ç±» å¯¹è±¡ */ ĊĠĠĠ Ġfun Ġload I View ( dex Path : ĠString , ĠclassName : ĠString , ĠpackageName : ĠString Ġ= Ġ"") : ĠObservable < I View ?> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠRx . create ( Func Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdl Plugin Package Ġ= ĠDL PluginManager . getInstance ( R Application . getApp ()). load A pk ( dex Path ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( dl Plugin Package Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠL . e (" R Plugin : Ġ æĹł æķĪ çļĦ dex Path Ġ-> Ġ$ dex Path ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ(! packageName . isNull OrEmpty () Ġ&& Ġ! TextUtils . equals ( packageName , Ġdl Plugin Package . packageName )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠL . e (" R Plugin : Ġä¸į åĮ¹éħį çļĦ åĮħ åĲį Ġ$ packageName Ġ-> Ġ${ dl Plugin Package . packageName }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġplugin Class Ġ= Ġload Plugin Class ( dl Plugin Package . class Loader , ĠclassName ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( plugin Class Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠL . e (" R Plugin : Ġ è£ħ è½½ æıĴä»¶ ç±» å¤±è´¥ ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( UI Base View :: class . java . isAssignableFrom ( plugin Class ) Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠI View :: class . java . isAssignableFrom ( plugin Class )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠL . e (" R Plugin : Ġ åĬłè½½ æıĴä»¶ ç±» :${ plugin Class . name }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġi View : ĠI View Ġ= Ġplugin Class . newInstance () Ġas ĠI View ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi View . set Plugin Package ( dl Plugin Package ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi View ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠL . e (" R Plugin : Ġ è£ħ è½½ åŁº ç±» ä¸į åĮ¹éħį :${ plugin Class . name }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** è¿ĶåĽŀ åĮ¹éħį éĢļè¿ĩ çļĦ æıĴä»¶ ä¿¡æģ¯ */ ĊĠĠĠ Ġfun Ġload Plugin ( dex Path : ĠString , ĠclassName : ĠString , ĠpackageName : ĠString Ġ= Ġ"") : ĠObservable < DL Plugin Package ?> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠRx . create ( Func Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdl Plugin Package Ġ= ĠDL PluginManager . getInstance ( R Application . getApp ()). load A pk ( dex Path ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( dl Plugin Package Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠL . e (" R Plugin : Ġ æĹł æķĪ çļĦ dex Path Ġ-> Ġ$ dex Path ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ(! packageName . isNull OrEmpty () Ġ&& Ġ! TextUtils . equals ( packageName , Ġdl Plugin Package . packageName )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠL . e (" R Plugin : Ġä¸į åĮ¹éħį çļĦ åĮħ åĲį Ġ$ packageName Ġ-> Ġ${ dl Plugin Package . packageName }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġplugin Class Ġ= Ġload Plugin Class ( dl Plugin Package . class Loader , ĠclassName ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( plugin Class Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠL . e (" R Plugin : Ġ è£ħ è½½ æıĴä»¶ ç±» å¤±è´¥ ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( UI Base View :: class . java . isAssignableFrom ( plugin Class ) Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠI View :: class . java . isAssignableFrom ( plugin Class )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠL . e (" R Plugin : Ġæı Ĵ ä»¶ åĬłè½½ :${ plugin Class . name }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdl Plugin Package ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠL . e (" R Plugin : Ġ è£ħ è½½ åŁº ç±» ä¸į åĮ¹éħį :${ plugin Class . name }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** éĢļè¿ĩ åĮħ åĲį , Ġèİ·åıĸ å·²ç»ı load è¿ĩ çļĦä¿¡æģ¯ */ ĊĠĠĠ Ġfun Ġget Plugin Package ( packageName : ĠString ): ĠDL Plugin Package ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠDL PluginManager . getInstance ( R Application . getApp ()). get Package ( packageName ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ä½¿çĶ¨ æĮĩå®ļçļĦ ClassLoader åĬłè½½ ç±» */ ĊĠĠĠ Ġfun Ġload Plugin Class ( class Loader : ĠClassLoader , ĠclassName : ĠString ): ĠClass < *> ? Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġclazz : ĠClass < *> ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclazz Ġ= ĠClass . forName ( className , Ġtrue , Ġclass Loader ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠClass NotFoundException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġclazz ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** è¿ĶåĽŀ ä¸Ģä¸ª I View */ ĊĠĠĠ Ġfun Ġget I View ( plugin Package : ĠDL Plugin Package , ĠclassName : ĠString ): ĠI View ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġplugin Class Ġ= Ġload Plugin Class ( plugin Package . class Loader , ĠclassName ) ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( plugin Class Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġi View : ĠI View Ġ= Ġplugin Class . newInstance () Ġas ĠI View ĊĠĠĠĠĠĠĠĠĠĠĠ Ġi View . set Plugin Package ( plugin Package ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġi View ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }