GVKun编程网logo

Android插件化-RePlugin项目集成与使用详解(android 插件化方案)

12

本文将为您提供关于Android插件化-RePlugin项目集成与使用详解的详细介绍,我们还将为您解释android插件化方案的相关知识,同时,我们还将为您提供关于360Replugin插件化插件配置

本文将为您提供关于Android插件化-RePlugin项目集成与使用详解的详细介绍,我们还将为您解释android 插件化方案的相关知识,同时,我们还将为您提供关于360 Replugin 插件化插件配置要点、Android Gradle Plugin指南(三)——依赖关系、android库和多项目配置、android phonegap插件开发方法 plugin,Android开发前景怎么样、Android Studio 插件库Plugins 搜索不到插件的实用信息。

本文目录一览:

Android插件化-RePlugin项目集成与使用详解(android 插件化方案)

Android插件化-RePlugin项目集成与使用详解(android 插件化方案)

前言:前一段时间新开源了一种全面插件化的方案-- RePlugin,之前一种都在关注 Droidplugin 并且很早也在项目中试用了,但最终没有投入到真正的生产环节,一方面是项目中没有特别需要插件化的需求,另一方面也考虑到 Droidplugin 不是特别稳定,Android系统每更新一次 Droidplugin 可能就会出现一些 Bug,毕竟 Hook 了 Android 原生的太多东西,系统一旦更新引发 Bug 是在所难免的。当然,这些并不能否认 Droidplugin 的优秀,它的原理和思路值得我们深入探究、学习,前一段时间更新过几篇插件化的原理分析的文章(基于 DrodiPlugin 原理)学习过程中不得不叹服作者的思路和技术深度!前几篇小白也能看懂的插件化系列文章仍然会不定期更新,但目前我们可以先来学习学习 RePlugin,毕竟多学无害,也能互相参考他们的思路,比较优缺点。

1.什么是RePlugin?

在Android开发领域,有关插件化的讨论一直热度不减。目前市面上的插件化方案虽然很多,但多数只能实现某些功能的插件化,距离开发者的预期尚有相当差距。对此,在近期GMTC全球移动技术大会上,360手机卫士主程序架构负责人张炅轩宣布,360的插件化框架RePlugin已经可以实现“全面插件化”,同时具有出色的稳定性和灵活性,可适用于各种类型的应用上。
“RePlugin预计7月份开源,这将是我们献给安卓世界最好的礼物。”360如是说。

2.RePlugin有什么用?

RePlugin是一套完整的、稳定的、适合全面使用的,占坑类插件化方案,由360手机卫士的RePlugin Team研发,也是业内首个提出”全面插件化“(全面特性、全面兼容、全面使用)的方案。

3.RePlugin官方介绍

其主要优势有:

  1. 极其灵活:主程序无需升级(无需在Manifest中预埋组件),即可支持新增的四大组件,甚至全新的插件
  2. 非常稳定:Hook点仅有一处(ClassLoader),无任何Binder Hook!如此可做到其崩溃率仅为“万分之一”,并完美兼容市面上近乎所有的Android ROM
  3. 特性丰富:支持近乎所有在“单品”开发时的特性。包括静态Receiver、Task-Affinity坑位、自定义Theme、进程坑位、AppCompat、DataBinding等
  4. 易于集成:无论插件还是主程序,只需“数行”就能完成接入
  5. 管理成熟:拥有成熟稳定的“插件管理方案”,支持插件安装、升级、卸载、版本管理,甚至包括进程通讯、协议版本、安全校验等
  6. 数亿支撑:有360手机卫士庞大的数亿用户做支撑,三年多的残酷验证,确保App用到的方案是最稳定、最适合使用的

一、集成主工程

1、在项目根目录的 build.gradle 下添加 RePlugin Host Gradle 依赖:

buildscript {
  repositories {
    jcenter()
  }
  dependencies {
    classpath 'com.android.tools.build:gradle:2.3.3'
    // 1、添加RePlugin Host Gradle依赖
    classpath 'com.qihoo360.replugin:replugin-host-gradle:2.2.1'
  }
}

2、在 app/build.gradle 下添加 RePlugin Host Library 依赖(为了更清晰的表示出代码添加的位置,将原有代码也一并贴出):
apply plugin: 'com.android.application'

android {
  compileSdkVersion 26
  buildToolsversion "26.0.1"
  defaultConfig {
    applicationId "cn.codingblock.repluginstudy"
    minSdkVersion 21
    targetSdkVersion 26
    versionCode 1
    versionName "1.0"
    testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
  }
  buildTypes {
    release {
      minifyEnabled false
      proguardFiles getDefaultProguardFile('proguard-android.txt'),'proguard-rules.pro'
    }
  }
}

apply plugin: 'replugin-host-gradle'// 集成 RePlugin 添加的配置

// 集成 RePlugin 添加的配置
repluginHostConfig {
  useAppCompat = true // 如果项目需要支持 AppComat,则需要将此配置置为 true
  // 如果应用需要个性化配置坑位数量,则需要添加以下代码进行配置
//  countNottranslucentStandard = 6
//  countNottranslucentSingletop = 2
//  countNottranslucentSingleTask = 3
//  countNottranslucentSingleInstance = 2
}

dependencies {
  compile filetree(dir: 'libs',include: ['*.jar'])
  androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2',{
    exclude group: 'com.android.support',module: 'support-annotations'
  })
  compile 'com.android.support:appcompat-v7:26.+'
  compile 'com.android.support.constraint:constraint-layout:1.0.2'
  compile 'com.qihoo360.replugin:replugin-host-lib:2.2.1' // 集成 RePlugin 添加的配置
  testCompile 'junit:junit:4.12'
}

以上代码有三点需要注意:

  1. 需要将 apply plugin: 'replugin-host-gradle' 放在 android {...} 之后。
  2. 如果项目需要支持 AppComat,则需要将 repluginHostConfig 的 userAppCompat 置为 true。
  3. 如果应用需要个性化配置坑位数量,则需要在 repluginHostConfig 中添加以下代码进行配置:
countNottranslucentStandard = 6

countNottranslucentSingletop = 2

countNottranslucentSingleTask = 3

countNottranslucentSingleInstance = 2 

3、让工程的 Application 直接继承自 RePluginApplication:

public class MyApplication extends RePluginApplication { } 

当然,同时不要忘了在 AndroidManifest 对 MyApplication 的相关配置。

说明:有时候由于项目原有结构的需要,我们可能不能直接使用继承 RePluginApplication 的方式,这个问题看来 RePlugin 开发者也想到了,所以还特地多了一种选择,下面是项目的 Application 不继承 RePluginApplication 的方式:

public class MyApplication extends Application {

  @Override
  protected void attachBaseContext(Context base) {
    super.attachBaseContext(base);
    RePlugin.App.attachBaseContext(this);
  }

  @Override
  public void onCreate() {
    super.onCreate();
    RePlugin.App.onCreate();
  }

  @Override
  public void onLowMemory() {
    super.onLowMemory();
    RePlugin.App.onLowMemory();
  }

  @Override
  public void onTrimMemory(int level) {
    super.onTrimMemory(level);
    RePlugin.App.onTrimMemory(level);
  }

  @Override
  public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    RePlugin.App.onConfigurationChanged(newConfig);
  }
}

二、集成插件

新建一个工程做为插件APP,这里为了方便起见,直接在主工程中新建了一个 Module。

1、同集成主工程类似,在根目录的 build.gradle 添加 RePlugin Plugin Gradle 依赖(若是单独创建插件工程,则不需要添加注释1下面的代码):

buildscript {
  repositories {
    jcenter()
  }
  dependencies {
    classpath 'com.android.tools.build:gradle:2.3.3'
    // 1、添加RePlugin Host Gradle依赖(主工程用)
    classpath 'com.qihoo360.replugin:replugin-host-gradle:2.2.1'
    // 2、添加RePlugin Plugin Gradle依赖(插件工程用)
    classpath 'com.qihoo360.replugin:replugin-plugin-gradle:2.2.1'
  }
}

2、在 app/build.gradle 中添加 replugin-plugin-gradle 插件和 replugin-plugin-lib 依赖:

apply plugin: 'com.android.application'

android {
  ...
}

apply plugin: 'replugin-plugin-gradle' // 集成 RePlugin 添加的配置

dependencies {
  compile filetree(dir: 'libs',module: 'support-annotations'
  })
  compile 'com.android.support:appcompat-v7:26.+'
  compile 'com.android.support.constraint:constraint-layout:1.0.2'
  compile 'com.qihoo360.replugin:replugin-plugin-lib:2.2.1' // 集成 RePlugin 添加的配置
  testCompile 'junit:junit:4.12'
}

三、管理插件

RePlugin 对插件定义两种方式一种是外置插件、一种是内置插件。

  1. 外置插件:即从网络下载或者从SD卡中获得的,以 .apk 结尾。
  2. 内置插件:内置于 APP 之中,并随 APP 一并发版,需要将插件 apk 改成 .jar 结尾放入主程序的assets/plugins目录。

(一)外置插件的安装(升级)、启动、卸载

安装插件:

PluginInfo pluginInfo = RePlugin.install(Environment.getExternalStorageDirectory().getPath().toString() + "/plugin1.apk");

System.out.println(pluginInfo); 

同时别忘了添加文件读写的权限。 输出日下:

复制代码 代码如下:

10-30 16:10:23.769 20280-20280/cn.codingblock.repluginstudy I/System.out: PInfo { <cn.codingblock.plugin1:1(4)> [APK] [DEX_EXTRACTED] processes=[] js={"pkgname":"cn.codingblock.plugin1","name":"cn.codingblock.plugin1","low":10,"high":10,"ver":1,"verv":2814792716779521,"path":"\/data\/user\/0\/cn.codingblock.repluginstudy\/app_p_a\/-347346251.jar","type":11,"frm_ver":4} dex=/data/data/cn.codingblock.repluginstudy/app_p_od/-347346251.dex nlib=/data/data/cn.codingblock.repluginstudy/app_p_n/-347346251 }

安装成功了! (升级插件也是用 install() 方法,不可降级,同本版可覆盖安装)

启动插件

先来看一下 RePlugin.java 中启动插件相关的源码

/**
 * 创建一个用来定向到插件组件的Intent <p>
 * <p>
 * 推荐用法: <p>
 * <code>
 * Intent in = RePlugin.createIntent("clean","com.qihoo360.mobilesafe.clean.CleanActivity");
 * </code> <p>
 * 当然,也可以用标准的Android创建方法: <p>
 * <code>
 * Intent in = new Intent(); <p>
 * in.setComponent(new ComponentName("clean","com.qihoo360.mobilesafe.clean.CleanActivity"));
 * </code>
 *
 * @param pluginName 插件名
 * @param cls    目标全名
 * @return 可以被RePlugin识别的Intent
 * @since 1.0.0
 */
public static Intent createIntent(String pluginName,String cls) {
  Intent in = new Intent();
  in.setComponent(createComponentName(pluginName,cls));
  return in;
}

/**
 * 开启一个插件的Activity <p>
 * 其中Intent的ComponentName的Key应为插件名(而不是包名),可使用createIntent方法来创建Intent对象
 *
 * @param context Context对象
 * @param intent 要打开Activity的Intent,其中ComponentName的Key必须为插件名
 * @return 插件Activity是否被成功打开?
 * FIXME 是否需要Exception来做?
 * @see #createIntent(String,String)
 * @since 1.0.0
 */
public static boolean startActivity(Context context,Intent intent) {
  // Todo 先用旧的开启Activity方案,以后再优化
  ComponentName cn = intent.getComponent();
  if (cn == null) {
    // Todo 需要支持Action方案
    return false;
  }
  String plugin = cn.getPackageName();
  String cls = cn.getClassName();
  return Factory.startActivityWithNoInjectCN(context,intent,plugin,cls,IPluginManager.PROCESS_AUTO);
}

根据 RePlugin 的 startActivity() 和 createIntent() 方法注释中的示例可知,启动插件需要先用插件的名字和目标Activity的全路径创建一个 Intent,然后调用 RePlugin.startActviity() 启动即可:

Intent intent = RePlugin.createIntent("Plugin1","cn.codingblock.plugin1.MainActivity");

if (!RePlugin.startActivity(MainActivity.this,intent)) {

  Toast.makeText(mContext,"启动失败",Toast.LENGTH_LONG).show();

} 

点击按钮,输出如下:

10-30 16:21:02.464 20280-20280/cn.codingblock.repluginstudy D/RePlugin.ws001: start activity: intent=Intent { cmp=Plugin1/cn.codingblock.plugin1.MainActivity } plugin=Plugin1 activity=cn.codingblock.plugin1.MainActivity process=-2147483648

10-30 16:21:02.464 20280-20280/cn.codingblock.repluginstudy D/RePlugin.ws001: start activity: intent=Intent { cmp=Plugin1/cn.codingblock.plugin1.MainActivity } plugin=Plugin1 activity=cn.codingblock.plugin1.MainActivity process=-2147483648 download=true

10-30 16:21:02.464 20280-20280/cn.codingblock.repluginstudy D/RePlugin.ws001: plugin=Plugin1 not found,start download ...

10-30 16:21:02.469 20280-20280/cn.codingblock.repluginstudy D/RePlugin.ws001: isNeedTodownload(): V5 file not exists. Plugin = Plugin1 

启动失败了!(插件名称确实是:Plugin1,而不是 plugin1 )

把 ==createIntent() 方法的第一参数换成插件的包名 cn.codingblock.plugin1 ==试一试,居然可以了。

但是,注释总不会这样赤裸裸的坑我们吧!

卸载插件

RePlugin.uninstall("Plugin1"); 

点击卸载,输入如下:

10-30 16:31:21.988 5006-5006/cn.codingblock.repluginstudy D/RePlugin.ws001: MP.pluginUninstall ... pluginName=Plugin1

10-30 16:31:21.988 5006-5006/cn.codingblock.repluginstudy D/RePlugin.ws001: Not installed. pluginName=Plugin1 

没卸载成功?哈哈,这个简单,原套路把参数换成包名,果然可以了:

10-30 16:41:46.179 10193-10193/cn.codingblock.repluginstudy D/RePlugin.ws001: MP.pluginUninstall ... pluginName=cn.codingblock.plugin1

10-30 16:41:46.202 10193-10193/cn.codingblock.repluginstudy D/RePlugin.ws001: sendIntent pr=cn.codingblock.repluginstudy intent=Intent { act=ACTION_UNINSTALL_PLUGIN (has extras) }

10-30 16:41:46.203 10193-10193/cn.codingblock.repluginstudy D/RePlugin.ws001: Clear plugin cache. pn=cn.codingblock.plugin1

10-30 16:41:46.204 10193-10193/cn.codingblock.repluginstudy D/RePlugin.ws001: removeInfo plugin table: info=PInfo { <cn.codingblock.plugin1:1(4)> [APK] processes=[] js={"pkgname":"cn.codingblock.plugin1","frm_ver":4,"used":true} dex=/data/user/0/cn.codingblock.repluginstudy/app_p_od/-347346251.dex nlib=/data/user/0/cn.codingblock.repluginstudy/app_p_n/-347346251 } rc=true

10-30 16:41:46.204 10193-10193/cn.codingblock.repluginstudy D/RePlugin.ws001: cached filename: cn.codingblock.plugin1 -> null

10-30 16:41:46.275 10193-10263/cn.codingblock.repluginstudy V/RenderScript: 0xb34e8000 Launching thread(s),cpus 4 

启动插件那里毕竟在官方教程里面找不到,但是 Plugin.uninstall() 方法传入插件名即可这可是官方文档说的,这次不会是官方文档和源码注释合起伙来坑我们把? 经过多次试验后,有个有趣的发现:对于启动插件创建 Intent 的createIntent() 方法和 卸载插件的 RePlugin.uninstall() 方法,如果项目是使用继承 RePluginApplication 方式的话,参数传包名才生效;如果不是继承的方式传插件名才生效!(本人是在一款小米3手机上试验的,由于并没有广泛测试,所以不保证其他手机也是这个套路)这真是奇了葩了!

卸载插件时有一点需要注意:如果插件正在运行,则不会立即卸载插件,而是将卸载诉求记录下来。直到所有“正在使用插件”的进程结束并重启后才会生效。(引自官方说明)

(二)内置插件

添加内置插件非常简单,首先在主工程的 assets 目录下创建一个 plugins 文件夹,然后将要作为插件的 apk 后缀名改成 .jar 并放入到新建的 plugins 文件夹下,剩下的事情就不用管了,交给 RePlugin 即可,也就说,框架会自动加载插件。

  1. 内置插件无需开发者安装,启动方式和外置插件一致,但不可删除。
  2. 内置插件可通过 RePlugin.install() 升级(需要先将升级包下载好),升级后等同于外置插件。

四、小结

初步体验了一下发现,虽然目前有可能会有那么一点坑需要踩一踩,在使用起来也不比 Droidplugin 方便,需要在宿主和插件两端都要做集成工作。但总体明显发现,这次的插件化框架明显比以前那些的插件化框架资料更加的全面、丰富,而且从 wiki 上发现 RePlugin 团队充满了很大的热情在孜孜不倦维护、更新,并且计划明确,哪些功能在未来会添加、哪些功能在未来会被舍弃,一目了然,让我们更加看到了 RePlugin 美好的未来,我相信在未来的插件化领域即使 RePlugin 不能一家独大,也必然处于一个非常重要的地位!

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程小技巧。

360 Replugin 插件化插件配置要点

360 Replugin 插件化插件配置要点

版本:com.qihoo360.replugin:replugin-plugin-gradle:2.3.2

1. 插件包名不允许与宿主相同;    否则无法通过 RePlugin.startActivity ()来启动插件 Activity

2.UnsatisfiedLinkError 问题。 由于插件使用 32/64 位的 so 导致混乱,插件及宿主统一声明仅使用 32 位配置,且在宿主中放置一个空的 32 位 so 库进行 zhan''wei

Android Gradle Plugin指南(三)——依赖关系、android库和多项目配置

Android Gradle Plugin指南(三)——依赖关系、android库和多项目配置

原文地址:http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Dependencies-Android-Libraries-and-Multi-project-setup


4、Dependencies,Android Libraries and Multi-project setup(依赖关系,Android库和多项目设置)


Gradle项目可以依赖于其它组件。这些组件可以是外部二进制包,或者是其它的Gradle项目。


4.1 Dependencies on binary packages(依赖二进制包)


4.1.1 Local packages(本地包)


配置一个外部库的jar包依赖,你需要在compile配置中添加一个依赖。

dependencies {
        compile files(''libs/foo.jar'')
    }

    android {
        ...
    }


注意:这个dependencies DSL标签是标准Gradle API中的一部分,所以它不属于android标签。


这个compile配置将被用于编译main application。它里面的所有东西都被会被添加到编译的classpath中,同时也会被打包进最终的APK。

以下是添加依赖时可能用到的其它一些配置选项:

    * compile:main application(主module)。

    * androidTestCompile:test application(测试module)。

    * debugCompile:debug Build Type(debug类型的编译)。

    * releaseCompile:release Build Type(发布类型的编译)。

因为没有可能去构建一个没有关联任何Build Type(构建类型)的APK,APK默认配置了两个或两个以上的编译配置:compile和<buildtype>Compile.

创建一个新的Build Type将会自动创建一个基于它名字的新配置。


这对于debug版本需要使用一个自定义库(为了反馈实例化的崩溃信息等)但发布版本不需要,或者它们依赖于同一个库的不同版本时会非常有用。


4.2.2 Remote artifacts(远程文件)


Gradle支持从Maven或者Ivy仓库中拉取文件。


首先必须将仓库添加到列表中,然后必须在依赖中声明Maven或者Ivy声明的文件。

repositories {
        mavenCentral()
    }


    dependencies {
        compile ''com.google.guava:guava:11.0.2''
    }

    android {
        ...
    }

注意:mavenCentral()是指定仓库URL的简单方法。Gradle支持远程和本地仓库。

注意:Gradle会遵循依赖关系的传递性。这意味着如果一个依赖本身依赖于其它东西,这些东西也会一并被拉取回来。


更多关于设置依赖关系的信息,请参考Gradle用户指南和DSL文档。


4.2 Multi project setup(多项目设置)


Gradle项目也可以通过使用多项目配置依赖于其它Gradle项目。


多项目配置的实现通常是在一个根项目路径下将所有项目作为子文件夹包含进去。



例如,给定以下项目结构:

MyProject/
     + app/
     + libraries/
        + lib1/
        + lib2/


我们可以定义3个项目。Grand将会按照以下名字映射它们:

    :app

    :libraries:lib1

    :libraries:lib2


每一个项目都拥有自己的build.gradle文件来声明自己如何构建。

另外,在根目录下还有一个setting.gradle文件用于声明所有项目。

这些文件的结构如下:

MyProject/
     | settings.gradle
     + app/
        | build.gradle
     + libraries/
        + lib1/
           | build.gradle
        + lib2/
           | build.gradle

其中setting.gradle的内容非常简单:

include '':app'', '':libraries:lib1'', '':libraries:lib2''

这里定义了哪一个文件夹才是真正的Gradle项目。


其中:app项目可能依赖于这些库,这是通过以下依赖配置声明的:

dependencies {
        compile project('':libraries:lib1'')
    }


更多关于多项目配置的信息请参考这里。


4.3 Library projects(库项目)


在上面的多项目配置中,:libraries:lib1和:libraries:lib2可能是一个Java项目,并且:app这个Android项目将会使用它们的jar包输出。


但是,如果你想要共享代码来访问Android API或者使用Android样式的资源,那么这些库就不能是通常的Java项目,而应该是Android库项目。


4.3.1 Creating a Library Project(创建一个库项目)


一个库项目与通常的Android项目非常类似,只是有一点小区别。


尽管构建库项目不同于构建应用程序,它们使用了不同的plugin。但是在内部这些plugin共享了大部分相同的代码,并且它们都由相同的com.android.tools.build.gradle.jar提供。

buildscript {

        repositories {

            mavenCentral()

        }


        dependencies {

            classpath ''com.android.tools.build:gradle:0.5.6''

        }

    }


    apply plugin: ''android-library''


    android {

        compileSdkVersion 15

    }

这里创建了一个使用API 15编译SourceSet的库项目,并且依赖关系的配置方法与应用程序项目的配置方法一样,同样也支持自定义配置。


4.3.2 Differences between a Project and a Library Project(普通项目和库项目之间的区别)


一个库项目的main输出是一个.aar包(它代表Android的归档文件)。它组合了编译代码(例如jar包或者是本地的.so文件)和资源(manifest,res,assets)。

一个库项目同样也可以独立于应用程序生成一个测试用的apk来测试。


标识Task同样适用于库项目(assembleDebug,assembleRelease),因此在命令行上与构建一个项目没有什么不同。


其余的部分,库项目与应用程序项目一样。它们都拥有build type和product flavor,也可以生成多个aar版本。

记住大部分Build Type的配置不适用于库项目。但是你可以根据库项目是否被其它项目使用或者是否用来测试来使用自定义的sourceSet改变库项目的内容。


4.3.3 Referencing a Library(引用一个库项目)


引用一个库项目的方法与引用其它项目的方法一样:

dependencies {

        compile project('':libraries:lib1'')

        compile project('':libraries:lib2'')

    }


注意:如果你要引用多个库,那么排序将非常重要。这类似于旧构建系统里面的project.properties文件中的依赖排序。


4.3.4 Library Publication(库项目发布)


一般情况下一个库只会发布它的release Variant(变种)版本。这个版本将会被所有引用它的项目使用,而不管它们本身自己构建了什么版本。这是由于Gradle的限制,我们正在努力消除这个问题,所以这只是临时的限制。


你可以控制哪一个Variant版本作为发行版:

android {

        defaultPublishConfig "debug"

    }

注意这里的发布配置名称引用的是完整的Variant版本名称.Relesae,debug只适用于项目中没有其它特性版本的时候使用。如果你想要使用其它Variant版本取代默认的发布版本,你可以:

android {

        defaultPublishConfig "flavor1Debug"

    }


将库项目的所有Variant版本都发布也是可能的。我们计划在一般的项目依赖项目(类似于上述所说的)情况下允许这种做法,但是由于Gradle的限制(我们也在努力修复这个问题)现在还不太可能。

默认情况下没有启用发布所有Variant版本。可以通过以下启用:

android {

        publishNonDefault true

    }


理解发布多个Variant版本意味着发布多个arr文件而不是一个arr文件包含所有Variant版本是非常重要的。每一个arr包都包含一个单一的Variant版本。

发布一个变种版本意味着构建一个可用的arr文件作为Gradle项目的输出文件。无论是发布到一个maven仓库,还是其它项目需要创建一个这个库项目的依赖都可以使用到这个文件。


Gradle有一个默认文件的概念。当添加以下配置后就会被使用到:

compile project('':libraries:lib2'')


创建一个其它发布文件的依赖,你需要指定具体使用哪一个:

dependencies {

        flavor1Compile project(path: '':lib1'', configuration: ''flavor1Release'')

        flavor2Compile project(path: '':lib1'', configuration: ''flavor2Release'')

    }


重要:注意已发布的配置是一个完整的Variant版本,其中包括了build type,并且需要像以上一样被引用。

重要:当启用非默认发布,maven发布插件将会发布其它Variant版本作为扩展包(按分类器分类)。这意味着不能真正的兼容发布到maven仓库。你应该另外发布一个单一的Variant版本到仓库中,或者允许发布所有配置以支持跨项目依赖。

android phonegap插件开发方法 plugin,Android开发前景怎么样

android phonegap插件开发方法 plugin,Android开发前景怎么样

<1> 在控制台    创建一个phonegap工程  命令如下

phonegap create my-app

cd my-app

phonegap run android

<2> 将工程导入 eclipse

<3> 配置 cordova _plugins.js 文件

首先给大家看看cordova _plugins.js 文件:

cordova.define(‘cordova/plugin_list’, function(require, exports, module) {

module.exports = [

{

“file”: “plugins/org.apache.cordova.camera/www/CameraConstants.js”,

“id”: “org.apache.cordova.camera.Camera”,

“clobbers”: [

“Camera”

]

},

{

“file”: “plugins/org.apache.cordova.camera/www/CameraPopoverOptions.js”,

“id”: “org.apache.cordova.camera.CameraPopoverOptions”,

“clobbers”: [

“CameraPopoverOptions”

]

},

{

“file”: “plugins/org.apache.cordova.camera/www/Camera.js”,

“id”: “org.apache.cordova.camera.camera”,

“clobbers”: [

“navigator.camera”

]

},

{

“file”: “plugins/org.apache.cordova.camera/www/CameraPopoverHandle.js”,

“id”: “org.apache.cordova.camera.CameraPopoverHandle”,

“clobbers”: [

“CameraPopoverHandle”

]

},

{

“file”: “plugins/org.apache.cordova.dialogs/www/notification.js”,

“id”: “org.apache.cordova.dialogs.notification”,

“merges”: [

“navigator.notification”

]

},

{

“file”: “plugins/org.apache.cordova.dialogs/www/android/notification.js”,

“id”: “org.apache.cordova.dialogs.notification_android”,

“merges”: [

“navigator.notification”

]

},

{

“file”: “plugins/org.apache.cordova.vibration/www/vibration.js”,

“id”: “org.apache.cordova.vibration.notification”,

“merges”: [

“navigator.notification”

]

},

{

“file”: “plugins/intent.js”,

“id”: “org.apache.cordova.intent”,

“merges”: [

“navigator.intent”

]

},

];

module.exports.Metadata =

// TOP OF MetaDATA

{

“org.apache.cordova.camera”: “0.2.7”,

“org.apache.cordova.dialogs”: “0.2.6”,

“org.apache.cordova.vibration”: “0.3.7”,

“org.apache.cordova.intent” :“0.0.1”,

}

// BottOM OF MetaDATA

});

我之前配置了camera  ,dialog , vibration   ,大家可以参考

现在来分解  ,这里要配置2个地方

module.exports

《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》

【docs.qq.com/doc/DSkNLaERkbnFoS0ZF】 完整内容开源分享

= [{}];

module.exports.Metadata = { }

在module.exports 的花括号里面配置

{

“file”: “plugins/intent.js”,

“id”: “org.apache.cordova.intent”,

“merges”: [

“navigator.intent”

]

},

file 代表  javascript写的接口位置

id   代表  唯一

merges   代表你在 javascript中调用该接口的语句    (类似activity中的 getApplication() 等等 ;就是个调用语句)

在module.exports.Metadata 中配置id

标号随意

<4> 在plugin目录下编写javascript接口

贴上intent.js的接口代码

cordova.define(“org.apache.cordova.intent”, function(require, exports, module) {

var exec = require(‘cordova/exec’);

module.exports = {

/**

  • 一共5个参数

第一个 :成功会掉

第二个 :失败回调

第三个 :将要调用的类的配置名字(在config.xml中配置 稍后在下面会讲解)

第四个 :调用的方法名(一个类里可能有多个方法 靠这个参数区分)

第五个 :传递的参数 以json的格式

*/

demo: function(mills) {

exec(function(winParam){

alert(winParam);

}, null, “Demo”, “intent”, [mills]);

},

};

});

Demo中成功返回 会弹出一个Alert();

在javascript中的 调用语句是

navigator.intent.demo(1);

贴上整的javascript

Notification Example

总结

以上是小编为你收集整理的android phonegap插件开发方法 plugin,Android开发前景怎么样全部内容。

如果觉得小编网站内容还不错,欢迎将小编网站推荐给好友。

原文地址:https://blog.csdn.net/m0_64383081/article/details/121898901

Android Studio 插件库Plugins 搜索不到插件

Android Studio 插件库Plugins 搜索不到插件

翻墙后设置代理后就可以了 点击图上面Installed旁边的设置按钮 然后测试google.com是否可以正常访问

设置好就可以了

 

 

今天关于Android插件化-RePlugin项目集成与使用详解android 插件化方案的讲解已经结束,谢谢您的阅读,如果想了解更多关于360 Replugin 插件化插件配置要点、Android Gradle Plugin指南(三)——依赖关系、android库和多项目配置、android phonegap插件开发方法 plugin,Android开发前景怎么样、Android Studio 插件库Plugins 搜索不到插件的相关知识,请在本站搜索。

本文标签:

上一篇Android使用WebSocket实现多人游戏(android websocketclient)

下一篇Android开发入门环境快速搭建实战教程(android 开发环境搭建步骤)