代码结构:
一、internal包
1、DLAttachable接口:
public void attach(DLPlugin proxyActivity, DLPluginManager pluginManager)
当代理启动插件的Activity,DL将会调用attach方法将代理Activity与插件管理器连接到插件Activity中,插件Activity将会加载插件的资源,所以代理Activity是插件内部的Activity的一个资源托管。
2、DLIntent:
Intent的子类,内部包含两个变量:1) 需要启动的插件的包名以,2) 需要启动的插件类名
3、DLPluginManager:
主要功能:获取Dex,启动服务,停止服务,绑定服务,解绑服务,启动Activity,加载指定class名的class,拷贝so文件等
START_RESULT_SUCCESS:插件启动成功 START_RESULT_NO_PKG :没找到指定的包名的插件 START_RESULT_NO_CLASS:没找到需要启动的插件类 START_RESULT_TYPE_ERROR:
4、DLPluginPackage:
指定一个插件Apk。在相同的apk中的一系列的Activities共享的AssetManager、Resources以及DexClassLoader。
包含: 1)插件的完整包名 2)默认的Activity的名称 3)Dex类加载器 4)AssetManager对象 5)资源Resources对象 6)包的相关描述对象PackageInfo对象
5、DLProxyImpl:
是一个插件Activity的代理,代理将会利用反射创建插件Activity,并同时调用插件Activity的attach以及onCreate的方法,此时插件Activity就处于运行的状态了。
1)String mClass:当前插件Activity的类名 2)String mPackageName:当前插件Activity的包名 3)DLPluginPackage mPluginPackage:标识当前的插件Apk的对象 4)DLPluginManage mPluginManager:插件管理器 5)AssetManager mAssetManager:Asset管理器 6)Resources mResources:资源管理器 7)Theme mTheme:主题对象 8)ActivityInfo mActivityInfo:描述当前的插件Activity的相关的信息对象 9)Activity mProxyActivity:代理Activity对象 10)DLPlugin mPluginActivity:插件的接口 11)ClassLoader mPluginClassLoader:类加载器
6、DLServiceAttachable:
与DLAttachable的功能是类似的,只不过一个是针对Activity,一个是针对Service。
7、DLServiceProxyImpl:
1)利用类加载器加载指定的插件内部的服务名称,实际上是利用反射创建对象 2) 将插件内部的Service对象绑定到代理Service对象上 3)直接调用插件Service的onCreate的方法
二、dynamicload包
1、DLBasePluginActivity、DLBasePluginFragmentActivity
1、Activity mProxyActivity:Activity代理是真正运行中的Activity 2、Activity that:等同mProxyActivity 3、DLPluginManager mPluginManager:插件管理器 4、DLPluginPackage mPluginPackage:插件的包名 职责: 1、代理Activity的赋值 2、指向插件Apk对象的本身 3、类似onCreate、setContentView等Activity相关方法,判断是内部启动还是外部启动,如果是内部启动,完全可以不需要代理Activity的处理 4、凡是调用了onAttach,均是属于外部的启动
2、DLPlugin:
这是一个插件开发的接口:
public void onCreate(Bundle savedInstanceState); public void onStart(); public void onRestart(); public void onActivityResult(int requestCode, int resultCode, Intent data); public void onResume(); public void onPause(); public void onStop(); public void onDestroy(); public void attach(Activity proxyActivity, DLPluginPackage pluginPackage); public void onSaveInstanceState(Bundle outState); public void onNewIntent(Intent intent); public void onRestoreInstanceState(Bundle savedInstanceState); public boolean onTouchEvent(MotionEvent event); public boolean onKeyUp(int keyCode, KeyEvent event); public void onWindowAttributesChanged(LayoutParams params); public void onWindowFocusChanged(boolean hasFocus); public void onBackPressed(); public boolean onCreateOptionsMenu(Menu menu); public boolean onOptionsItemSelected(MenuItem item);
3、DLProxyActivity、DLProxyFragmentActivity:
插件Activity的代理类。其中的主要成员变量:
1、DLPlugin:指向插件对象 2、DLProxyImpl:指向代理的实现对象
4、DLProxyService
Service代理服务
5、DLServicePlugin
一个接口,包括Service的关键性的方法。
三、util包
1、DLConfigs:
存储与获取so的修改时间
2、DLConstants:
在这个常量类中,主要配置下面几大类常量:
1、内部启动还是外部启动 2、Dex路径以及相关的包名,存储的Tag 3、Activity的相关类型 4、CPU相关的体系结构
3、DLUtils:
这个工具类包含以下功能:
1、获取在SDcard目录下指定插件Apk文件的包名getPackageInfo 2、获取在SDcard目录下指定插件Apk文件的应用图标getAppIcon 3、获取在SDcard目录下指定插件Apk文件的应用名称getAppLabel 4、利用反射机制获取指定的插件Activity中的类型
4、SoLibManager
1、获取CPU相关信息 2、在线程中将插件的so文件拷贝到当前工程目录的so文件的目录文件夹中(根据当前的cpu体系结构,拷贝合适的so文件)