フルプラグイン時代RePlugin到来

8813 ワード

一、RePluginの紹介
RePluginは完全で、安定で、全面的に使用するのに適しており、ピット類のプラグイン化案である.この定義を説明するには、「逐語」を分解します.
完全:プラグインを「単品のように」動作させ、大部分の特性を安定させることをサポートする:このように柔軟で完全な場合、そのフレームワークの崩壊率は業界内の低い「万分の一」が全面的に使用するのに適している:その目的はアプリケーション内の「すべての機能がプラグイン」のピット類を占める:安定を前提とするManifestピット構想プラグイン化案:Android原生APIと言語に基づいて開発することである.原生特性を十分に利用する
RePlugin: Githubアドレス
RePlugin使用簡易例:Githubアドレス学習交流としてのみ使用、starへようこそ
二、RePlugin配置説明
RePluginはホストエンジニアリングとプラグインエンジニアリングに分けられ、エンジニアリングの下で以下の内容を配置する必要がある.
1、宿主工事の配置
A)Projectレベルgradleのdependenciesに追加
classpath 'com.qihoo360.replugin:replugin-host-gradle:2.1.3'
B)Moduleレベルgradleに追加
apply plugin: 'replugin-host-gradle' compile 'com.qihoo360.replugin:replugin-host-lib:2.1.3'
2、プラグインエンジニアリングの配置
A)Projectレベルgradleのdependenciesに追加
classpath 'com.qihoo360.replugin:replugin-plugin-gradle:2.1.4'
B)Moduleレベルgradleに追加
apply plugin: 'replugin-plugin-gradle' compile 'com.qihoo360.replugin:replugin-plugin-lib:2.1.3'
三、RePlugin内蔵プラグイン
1、内蔵プラグインのインストール
組み込みプラグインはjarファイルとしてassets->pluginsディレクトリの下に配置されます(注:組み込みプラグインはこのディレクトリの下に置いてこそRePlugginによって識別され、自動的にインストールされます.pluginsフォルダが自動的に作成されず、手動で作成する必要があります).
2、内蔵カード識別メカニズム
プラグインの関連配置情報は、assets->plugins-builtinに格納jsonのフォーマットで格納.jsonファイルの下で、プログラムが起動する時、RePluginによって識別して自動的にプラグインのインストールを行います
  [{"high":null,
    "frm":null,
    "ver":100,
    "low":null,
    "pkg":"com.qihoo360.replugin.sample.demo1",
    "path":"plugins/demo1.jar","name":"demo1"
  }]

3、内蔵プラグインのアップグレード
A)メインプログラムのパッケージアップグレード
パッケージの更新をインストールすると、プラグインのバージョンが更新されると自動的にアップグレードされます.
B)installによるアップグレード
外付けプラグインとのアップグレード、Replugin.Install()メソッドによるプラグインのアップグレード
4、内蔵プラグインの削除
jarファイルを直接削除すれば、RePluginは残りの操作を完了します.
四、RePlugin外付けプラグイン
1、外付けプラグインのインストール
i.外付けカードの取り付け方式
アプリをロードする方式でRePluginを使用する.インストール()メソッド
ii. 外付けプラグインのインストールに関する注意事項
Debugモードの場合、アプリケーションで署名検証を閉じる必要があります.RePluginConfigの処理で署名検証を閉じます(次のバージョンでは署名検証がデフォルトで閉じる予定ですが、releaseで開くことを推奨します)
  @Override
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
        //--------------          
        RePluginConfig config = new RePluginConfig();
        config.setVerifySign(!BuildConfig.DEBUG);
        config.setPrintDetailLog(BuildConfig.DEBUG);
        config.setUseHostClassIfNotFound(true);
        RePlugin.App.attachBaseContext(this, config);    }

iii.プラグインのインストール
RePluginを通ります.インストール方法は、RePlugin.preload()メソッドはプラグインをプリロードし、ユーザー体験を向上させる
  PluginInfo pluginInfo = RePlugin.install(absolutePath + "/aa.apk");
  if (pluginInfo != null) {
        Toast.makeText(MainActivity.this, "      ",Toast.LENGTH_SHORT).show();
        boolean preload = RePlugin.preload(pluginInfo);   
 if (preload){
        Toast.makeText(MainActivity.this, "     ", Toast.LENGTH_SHORT).show();
    } else {    
        Toast.makeText(MainActivity.this, "      ",Toast.LENGTH_SHORT).show();
    }

iiii. プラグインのバージョン
PluginのAndroidManifestでプラグインの別名とバージョンを設定する必要があります.設定しない場合はパッケージ名とversionをデフォルト値とします(注:同バージョンの上書きはしばらくサポートされていません.アップグレードプラグインはバージョン番号を変更する必要があります.アンインストールして再インストールするにもバージョン変更が必要です).
    
    

2、プラグインのアップグレード
RePluginを通ります.install(pi)メソッドのアップグレード
3、プラグインのアンインストール
RePluginを通ります.uninstall(「demo 01」)アンインストール
五、RePluginホストとプラグインの相互作用
1、ホストがプラグインの中の4大コンポーネントを開く
A)Activity
  RePlugin.startActivity(MainActivity.this, RePlugin.createIntent("plugin01", "com.dg.replugindemo01.MainActivity"));

B)Service
  PluginServiceClient.bindService(RePlugin.createIntent( "exam", "AbcService"), mServiceConn);

B)Service
  PluginServiceClient.bindService(RePlugin.createIntent( "exam", "AbcService"), mServiceConn);

B)ContentProvider
  PluginProviderClient.query(xxx);

....
2、ホストがプラグインを呼び出す方法
A)fetchComponentList(String pluginName);//プラグインのコンポーネントリストの取得
B)fetchPackageInfo(String pluginName);//プラグインのパッケージ情報の取得
C)fetchResources(String pluginName);//プラグインのリソース情報の取得
D)fetchClassLoader(String pluginName);//プラグインのClassLoaderオブジェクトの取得
E)fetchContext(String pluginName);//プラグインのContextオブジェクトの取得
F)fetchBinder(String pluginName, String module, String process);//プラグイン内のPluginクラスから、プラグイン定義のIBinderを取得
例:
    //         
    ClassLoader classLoader = RePlugin.fetchClassLoader("plugin01");
    try {    
    Class> aClass = classLoader.loadClass("com.dgcredit.replugindemo01.DateHelper");   
    Method formatDate = aClass.getMethod("formatDate", Date.class); 
    String invoke = (String) formatDate.invoke(null, new Date()); 
    tvShow.setText(invoke);
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    } catch (NoSuchMethodException e) {
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    } catch (InvocationTargetException e) {
        e.printStackTrace();
    }

////プラグインをロードし、プラグインのリソース情報を取得する
    Resources resources = RePlugin.fetchResources("plugin01");
    int identifier = resources.getIdentifier("icon_app", "drawable", "com.dgcredit.replugindemo01");
    ivShow.setImageResource(identifier);

3、プラグイン呼び出しホスト方法
//         

  ClassLoader classLoader = RePlugin.getHostClassLoader();
    try {
        Class> aClass = classLoader.loadClass("com.dgcredit.repluginhostdemo.DateHelper");
        Method formatDate = aClass.getMethod("formatDate", Date.class);
        String invoke = (String) formatDate.invoke(null, new Date());
        viewById.setText(invoke);
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    } catch (NoSuchMethodException e) {
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    } catch (InvocationTargetException e) {
        e.printStackTrace();
    }

//ホスト内の画像リソースのロード
  ClassLoader classLoader = RePlugin.getHostClassLoader();
    try{
        Class clazz = classLoader.loadClass("com.dgcredit.repluginhostdemo.R$drawable");
        Field field = clazz.getField("icon_app");
        int identifier = (int)field.get(null);
        ivShow.setImageResource(identifier);
    }catch(Exception e){
        Log.i("Loader", "error:"+Log.getStackTraceString(e));
    }

4、プラグイン呼び出しホストコンポーネント
  Intent intent = new Intent();
  intent.setComponentName(new ComponentName("com.qihoo360.replugin.sample.host", "com.qihoo360.replugin.sample.host.MainActivity"));
  context.startActivity(intent);

六、RePluginアクセスエラー集錦
1、Themeエラー
  Caused by: java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity.

解決策
A)プラグインからアプリケーションへのthemeの導入を取り除き、プラグインのactivityに対して個別に関連themeを設定する
   android:theme="@style/AppTheme"

B)宿主のbuild.gradleに追加
  repluginHostConfig {
    useAppCompat = true
}

2、Activity NotFoundExceptionエラー
Unable to find explicit activity class{com.qihoo360.replugin.sample.host/con.qihoo360.replugin.sample.host.loader.a.ActivityN1NRNTS3};have you declared this activity in your AndroidManifest.xml?

解決方法:
    Setting instand run  。   Bug   2.1.4     ,    

3、Fail to apply plugin[id'replugin-plugin-gradle']エラー
解決方法:
   plugin    android    ,      android     

4、外付けプラグインRePlugin.install()法無反応
解決方法:
@override
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
        //--------------            -----------//
        RePluginConfig config = new RePluginConfig();
        config.setVerifySign(!BuildConfig.DEBUG);
        RePlugin.App.attachBaseContext(this, config);
        // =======================//
        }

ドキュメントは整理整頓中ですので、ご検討をお待ちしております...