Android插件化框架virtualapk
一,宿主。
1,建立一个宿主工程
2,配置宿主:
classpath 'com.didi.virtualapk:gradle:0.9.0'
3,继续配置:
apply plugin: 'com.didi.virtualapk.host'
compile 'com.didi.virtualapk:core:0.9.0'
4,初始化
5,权限设置以及application注册。
6,宿主跳转到插件的代码:
完整代码:
package com.shenbin.myhost; import android.app.Activity; import android.content.Intent; import android.content.pm.PackageManager; import android.os.Environment; import android.support.v4.app.ActivityCompat; import android.os.Bundle; import android.view.View; import android.widget.TextView; import android.widget.Toast; import com.didi.virtualapk.PluginManager; import java.io.File; public class MyHostMainActivity extends Activity implements View.OnClickListener { //ui private TextView mTextAdd1; //data private String mApkName1 = "plugin1.apk"; private String mPackageName1 = "com.shenbin.myplugin"; private String mClassName1 = "com.shenbin.myplugin.MyPluginMainActivity"; private boolean mFileExists = false; private static final int REQUEST_EXTERNAL_STORAGE = 1; private static String[] PERMISSIONS_STORAGE = { "android.permission.READ_EXTERNAL_STORAGE", "android.permission.WRITE_EXTERNAL_STORAGE", "android.permission.INTERNET" }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); verifyStoragePermissions(this); setContentView(R.layout.activity_my_host_main); mTextAdd1 = (TextView) findViewById(R.id.text_add_plugin1); mTextAdd1.setOnClickListener(this); loadPlugin1(); } @Override public void onClick(View _view) { switch (_view.getId()) { case R.id.text_add_plugin1: if (mFileExists) { Toast.makeText(this, "1111!", Toast.LENGTH_SHORT).show(); Intent _intent = new Intent(); _intent.setClassName(mPackageName1, mClassName1); startActivity(_intent); } else { Toast.makeText(this, "文件包不存在!", Toast.LENGTH_SHORT).show(); } break; } } private void loadPlugin1() { String _path = Environment.getExternalStorageDirectory().getAbsolutePath().concat("/" + mApkName1); File _file = new File(_path); mFileExists = _file.exists(); if (mFileExists) { try { PluginManager.getInstance(this).loadPlugin(_file); } catch (Exception e) { e.printStackTrace(); } } } public static void verifyStoragePermissions(Activity activity) { try { //检测是否有写的权限 int permission = ActivityCompat.checkSelfPermission(activity, "android.permission.WRITE_EXTERNAL_STORAGE"); if (permission != PackageManager.PERMISSION_GRANTED) { // 没有写的权限,去申请写的权限,会弹出对话框 ActivityCompat.requestPermissions(activity, PERMISSIONS_STORAGE, REQUEST_EXTERNAL_STORAGE); } } catch (Exception e) { e.printStackTrace(); } } }
宿主工程完成,接下来是插件工程。
二,插件工程。
1,建立一个插件工程,并配置。
2,第二步配置:
apply plugin: 'com.didi.virtualapk.plugin'
// 插件配置信息,放在文件最下面 virtualApk { packageId = 0x6f // 插件资源id,避免资源id冲突 targetHost = '../myhost/app' // 宿主工程的路径 applyHostMapping = true // 插件编译时是否启用应用宿主的apply mapping }
插件的配置完成。
接下来就是注意的地方:
1,插件的gradle版本,2.14.1。目前其他版本有各种问题。
2,怎么打插件的包?双击下面的红框里面的
3,然后会编译,然后会生成apk包。
4,把这个包改成对应的名字,放到手机sd卡,然后运行宿主工程,这样就可以模拟插件化了。也可以把这个插件的apk放到服务器,然后宿主进行下载,下载完之后加载,然后进行宿主跳转到插件。
最后一个,两个工程的目录:
源码下载地址:
http://www.book520.top/2018/01/30/virtualapk/
路径要对应,否则编译不成功。