Android DynamicLoadApk 代码剖析

代码结构:

一、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文件)
打赏