Android插件化框架virtualapk

一,宿主。

1,建立一个宿主工程

Android插件化框架virtualapk2,配置宿主:

classpath 'com.didi.virtualapk:gradle:0.9.0'

Android插件化框架virtualapk

3,继续配置:

apply plugin: 'com.didi.virtualapk.host'
compile 'com.didi.virtualapk:core:0.9.0'
Android插件化框架virtualapk

4,初始化

Android插件化框架virtualapk

5,权限设置以及application注册。

Android插件化框架virtualapk

6,宿主跳转到插件的代码:

Android插件化框架virtualapk

完整代码:

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/
路径要对应,否则编译不成功。