Phantom 是满帮集团开源的一套稳定、灵活、兼容性好的 Android 插件化方案。
AndroidManifest.xml
中预埋组件),即可支持插件新增组件,甚至新增插件特性 | Atlas | Small | VirtualAPK | RePlugin | Phantom |
---|---|---|---|---|---|
Hook 数量 | 较多 | 较少 | 较少 | 仅一处 | 零 |
四大组件 | 全支持 | 只支持 Activity |
全支持 | 全支持 | 除 ContentProvider 外,全支持 |
剔除公共库 | 支持 | 支持 | 支持 | 不支持 | 支持 |
兼容性适配 | 高 | 高 | 高 | 高 | 非常高 |
插件热更新 | 不支持 | 不支持 | 不支持 | 不支持 | 支持 |
插件快速部署 | 不支持 | 不支持 | 不支持 | 支持 | 支持 |
插件宿主通信 | 一般 | 一般 | 弱 | 一般 | 强 |
在宿主项目根目录下的 build.gradle
中增加宿主 gradle 依赖
buildscript {
dependencies {
classpath 'com.wlqq.phantom:phantom-host-gradle:3.1.2'
}
}
在宿主工程 Application 模块的 build.gradle
中增加宿主 library 依赖,并应用宿主 gradle 依赖包含的 gradle 插件 com.wlqq.phantom.host
dependencies {
compile 'com.wlqq.phantom:phantom-host-lib:3.1.3'
}
apply plugin: 'com.wlqq.phantom.host'
在宿主工程 Application 模块中的 Application#onCreate()
方法中初始化 Phantom
public class YourApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
PhantomCore.getInstance().init(this, new PhantomCore.Config());
}
}
// 安装打包到宿主 assets 中 plugins 目录下的插件
InstallResult ret = PhantomCore.getInstance().installPluginFromAssets("plugins/com.wlqq.phantom.pluign.component_1.0.0.apk");
// 插件安装成功后启动插件(执行插件的 Application#onCreate 方法)
if (ret.isSuccess() && ret.plugin.start()) {
Intent intent = new Intent();
// 指定插件 Activity 所在的插件包名以及 Activity 类名
intent.setClassName("com.wlqq.phantom.pluign.component", "com.wlqq.phantom.pluign.component.MainActivity");
PhantomCore.getInstance().startActivity(this, intent);
}
在插件项目根目录下的 build.gradle
中增加插件 gradle 依赖
buildscript {
dependencies {
classpath 'com.wlqq.phantom:phantom-plugin-gradle:3.1.2'
}
}
在插件项目 Application 模块的 build.gradle
中增加插件 library 依赖,并应用宿主 gradle 依赖包含的 gradle 插件 com.wlqq.phantom.plugin
android {
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
// Phantom 混淆配置文件
proguardFile 'proguard-phantom.pro'
}
}
}
dependencies {
provided 'com.wlqq.phantom:phantom-plugin-lib:3.1.2'
compile 'com.android.support:support-v4:28.0.0'
}
apply plugin: 'com.wlqq.phantom.plugin'
phantomPluginConfig {
// BEGIN 剔除公共库配置
// 若插件中有使用 support-v4 ,则需要剔除掉(必须)
excludeLib "com.android.support:support-v4:28.0.0"
// END
// BEGIN 生成插件额外的混淆配置文件,避免因剔除公共库引起的混淆问题
libraryJarsProguardFile file('proguard-phantom.pro')
// END
// BEGIN 快速部署插件配置
// 宿主包名
hostApplicationId = "com.wlqq.phantom.sample"
// 宿主 launcher Activity full class name
hostAppLauncherActivity = "com.wlqq.phantom.sample.MainActivity"
// 插件包名
pluginApplicationId = android.defaultConfig.applicationId
// 插件版本名
pluginVersionName = android.defaultConfig.versionName
// END
}
AndroidManifest.xml
中申明对宿主 Phantom 插件框架最低版本依赖<meta-data
android:name="phantom.service.import.PhantomVersionService"
android:value="30000"/>
与编译独立 APK 相同,如:
./gradlew assembleDebug
./gradlew assembleRelease
插件端使用的 Gradle 插件会自动为项目的 variant 生成相应的插件安装 task ,格式为 phInstallPlugin${variant}
,例如:
./gradlew phInstallPluginDebug
./gradlew phInstallPluginRelease
如果你在使用过程中遇到问题,或者有好的建议,欢迎给我们提 issue 或 Pull Request。详细说明请移步 贡献指南
临时交流 QQ 群号:690051836
Apache License 2.0, part MIT. See the LICENSE file for details.
参考以及使用的开源项目
项目名称 | 开源协议 | 说明 |
---|---|---|
Maven | Apache License | 依赖库版本比较 |
jsemver | MIT License | 依赖库版本比较 |
Atlas | Apache License | 首次加载插件提速 jar 包及 so 库 |
RePlugin | Apache License | Gradle Plugin 快速部署插件到宿主 反射工具类 ReflectUtils |
VirtualApk | Apache License | 构建 Gradle Plugin 对 Gradle 4.x + Android Gradle Plugin 3.x 的兼容处理 |
phantom页面加载 通过Phantomjs,一个网页可以被加载、分析和通过创建网页对象呈现,访问我的博客园地址:http://www.cnblogs.com/paulversion/p/8393842.html,并将当前页面进行截图保存。pageload.js代码如下: var page = require('webpage').create(); page.open("http://www.
在爬虫、自然语言处理群320349384中的交流中,偶然接触到phantomjs、casper等相对于httpclient较新的框架及采集解决方案,微查之后发现方案可行,故尽清明三日之力,将其二次开发应用于百度元搜索信息采集项目中,达到预期效果,下一步将重点应用到腾讯微博采集和抢票抢手机项目中。下面,将分步骤介绍一下。 一、phantomjs介绍 (1)一个基于webkit内
基本定义(也是来自网络) 当某个事务a范围查询数据时,另一个事务b在该范围内插入了数据,当事务a再次范围查询时,会产生幻行(即多了事务b插入的那行数据)。 网络上的其他定义 看看幻读的正确理解 时间点 事务A 事务B 1 开启事务 2 开启事务 3 查询数据“张三”,不存在 4 插入数据“张三” 5 提交事务 6 查询数据“张三”,不存在 7 插入数据“张三”,不成功 事务A查询“张三”,查询不到
本文介绍了PhantomReference的作用,以及它与WeakReference区别。同时纠正网上关于引用对象回收时间的错误说法(个人认为不正确)。本文没有考虑finalize方法是如何实现(具体可以参考Finalizer和FinalReference的介绍),只考虑finalize方法执行条件和结果。 术语 reference(phantom reference):引用对象本身,也就是Wea
<head> <titile> by phantom </titile> </head> 代码显示: <style type="text/css"> img{ max-width:100%;} video{ max-width:100%; height:auto;} header ul li{ float:left; list-style:none; list-style-type:n
声明:本文非原创,加入了自己的一些认识,感谢网友的无私分享:https://thief.one/2017/03/13/Phantomjs-Api%E4%BB%8B%E7%BB%8D/ 之前几篇文章介绍了Selenium+Phantomjs用法,也探讨过性能优化问题。然而利用selenium或者说python去运行phantomjs本质上并不是高效的方法,再者selenium对于phantomj
A simple to understand definition for phantom assembly Our "rule of thumb" is that if we do not hold stocks of a material, it is created with special procurement key 50 (= Phantom assembly). e.g. in o
//连接phantom钱包 async connectWallet(){ // console.log('"window.solana.isPhantom :',window.solana.isPhantom); try { //{ onlyIfTrusted: true }是 onlyIfTrusted 的参数,可以去掉 const resp =
From:CRACKL@B by:Hellspawn 引用: [*] Теперь заголовок окна и префикс CPU, можно задавать вручную CAPTEXT и PRETEXT, по-умолчанию "PhantOm" и "o_O".[*] Исправлено несколько багов с "custom handler except
问题内容: Java 8 及以下版本的Java文档看起来像这样: 虚拟引用对象,在收集器确定其引用对象可以通过其他方式回收之后,将其排队。与Java终结机制相比,虚拟引用最常用于以更灵活的方式安排 事前清理操作 。如果垃圾收集器在某个时间点确定幻像引用的参考对象是幻像可到达的,则在那时或以后的某个时间,它将使该引用入队。 为了确保保留可回收对象,可能无法检索幻像引用的引用对象:幻像引用的get方法
问题内容: 我将硒与PhantomJs配合使用来抓取URL。我如下初始化了驱动程序 从驱动程序获得的页面源为空 我有什么想念的吗? 问题答案: 最近,POODLE漏洞迫使网站删除SSLv3支持。由于PhantomJS<v1.9.8默认情况下使用SSLv3,因此无法加载页面。要解决此问题,您需要使用或运行PhantomJS。请参阅此答案以获取纯PhantomJS。 如果这样不能解决问题,您还可以添加
问题内容: 我设置了PhantomJS并将其录制到视频中:https : //www.dailymotion.com/video/xnizmh_1_webcam 生成说明:http : //phantomjs.org/build.html 我的设置有什么问题吗? 设置好之后,我阅读了快速入门教程并尝试编写此代码 它给我“找不到命令”错误。我怎么解决这个问题? 问题答案: Guidouil的回答使我
问题内容: 我唯一了解的是 如果使用其 方法,它将始终返回而不是对象。它有什么用? 通过使用,您可以确保无法从 方法中恢复该对象。 但是这个概念/类的用途是什么? 您是否曾在您的任何项目中使用过此功能,或者在任何示例中应使用此功能? 问题答案: 我在简单,非常专业的内存分析器中使用s来监视对象的创建和销毁。我需要他们追踪破坏。但是这种方法已经过时了。(它于2004年针对J2SE1.4编写。)专业的
问题内容: 我想在Python中使用PhantomJS。我用谷歌搜索了这个问题,但是找不到合适的解决方案。 我发现 可能是一个不错的选择。但是我无法通过一些争论。 使用可能是目前合适的解决方案。我想知道是否有更好的解决方案。 有没有办法在Python中使用PhantomJS? 问题答案: 在python中使用PhantomJS的最简单方法是通过Selenium。最简单的安装方法是 安装NodeJS
问题内容: 我在应用程序中使用selenium+ phantomjs,但我想在后台启动我的应用程序,selenium和phantomjs窗口。我该怎么做? 我试过了: 问题答案:
问题内容: 我想将“自定义标头”添加到python中的Selenium PhantomJS中。这些是我要添加的标题。 这是我正在使用的代码: 如何修改包含这些自定义标头的代码? 请帮忙。 问题答案: 以以下方式设置标题: 然后开始使用驱动程序:
问题内容: 我正在浏览Selenium WebDriver的文档,例如它可以驱动Chrome。我当时在想,“驱动” PhantomJS效率会更高吗? 有没有办法将Selenium与PhantomJS一起使用? 我的预期用途是进行网页抓取:我抓取的网站上加载了AJAX和许多可爱的JavaScript,并且我认为此设置可以很好地替代我目前使用的Scrapy Python框架。 问题答案: Phanto