我最近尝试制作一个android插件,发现了很多关于SO的问题,但没有很多详细的答案,所以我想我应该在这里分享我的研究,尽管这个问题现在已经很老了。我不确定插件是否真的是您想要在这里做的,因为您可能可以使用谷歌的 JSON/ATOM 自定义搜索 API 并解析它,但尽管如此,我还是提供了有关如何让插件在 Android 上运行的详细信息。我希望它对其他人有用。
如果你看这里:插件管理器.java http://source.android.com/source/downloading.html你会看到以下几行:
// Only plugin matches one of the signatures in the list can be loaded
// inside the WebView process
private static final String SIGNATURE_1 = "308204c5..."
这里使用的签名是 Adobe Flash 插件的签名(Adobe 现已放弃对该插件的支持。)
再往下你会看到:
if (SystemProperties.getBoolean("ro.secure", false)) {
boolean signatureMatch = false;
for (Signature signature : signatures) {
for (int i = 0; i < SIGNATURES.length; i++) {
if (SIGNATURES[i].equals(signature)) {
signatureMatch = true;
break;
}
}
}
if (!signatureMatch) {
return false;
}
}
这意味着如果ro.secure=0
那么它不会检查签名 - 否则它只会允许 flash 插件。ro.secure
是一个构建属性,如果您拥有设备的 root 权限或者您有 dev 构建(类型adb shell getprop ro.secure
找出你拥有什么)。如有必要,您可以研究如何更改此设置。我使用的是 Qualcomm Snapdragon MDP8960,它是已经有 ro.secure=0 的开发板。要让你的插件签名包含在 Android 中,你必须与负责人交谈 - 不确定目前这是否可行。
现在编写一个插件 - 你可以在 android 源代码树中找到一个名为 SampleBrowserPlugin 的示例(如果你想构建它,请确保你有一个 64 位 Linux 机器 - 类型make SampleBrowserPlugin
从源树根开始。您可能需要首先使用设置构建配置lunch
您可以在 android 源代码树网站上找到说明)
我实际上从中获取了我需要的来源github上的android源码 https://github.com/android/并对源代码进行了 NDK 构建,因为我比修改 android 构建脚本更熟悉如何执行此操作。它也比下载整个 android 树要快得多 - 您可以通过查看 Android.mk 中包含的内容来了解要下载的内容(见下文)。
基本上,我从设备中提取了所需的共享对象库,以确保我的插件兼容。他们在/system/lib
在我的设备上:(例如输入adb pull /system/libnativehelper.so
等来自您想要存储它们的目录)
得到以下内容:
libnativehelper.so
libandroid.so
libutils.so
libcutils.so
libEGL.so
libGLESv2.so
libskia.so
把它们放在哪里SO_LIB_PATH
指向在Android.mk
(参见下文并根据需要更改路径)。
然后,在安装 NDK sdk 后,您应该能够使用以下构建脚本 - 不需要 64 位计算机 - (您可以安装 winbash、使用 cygwin 或 Linux 虚拟机,例如 Oracle VM VirtualBox:
(将这些文件放入C:/Path/BrowserPlugin/jni/
并确保ndk-build
命令在您的路径上)
(如果您使用的是 Linux,请删除.cmd
from ndk-build.cmd
)
构建.sh:
#!/bin/bash
echo -e "Mode\t\t: Debug"
OPTIM=debug
### ---------------- Generic Build Command ----------------
# run NDK build
ndk-build.cmd \
-d \
-B \
NDK_DEBUG=1 \
NDK_PROJECT_PATH=C:/Path/BrowserPlugin/jni \
NDK_APPLICATION_MK=C:/Path/BrowserPlugin/jni/Application.mk \
NDK_MODULE_PATH=C:/Path/BrowserPlugin/jni \
NDK_APP_OUT=C:/Path/BrowserPlugin/jni/Out/ \
APP_BUILD_SCRIPT=C:/Path/BrowserPlugin/jni/Android.mk \
APP_OPTIM=$OPTIM
cp C:/Path/BrowserPlugin/jni/Out/local/armeabi/libsampleplugin.so C:/Path/BrowserPlugin/libs/armeabi/.
echo "copied libsampleplugin.so into PROJECT_ROOT/libs dir"
Android.mk:
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES := \
main.cpp \
PluginObject.cpp \
RenderingThread.cpp \
animation/AnimationPlugin.cpp \
animation/AnimationThread.cpp \
audio/AudioPlugin.cpp \
background/BackgroundPlugin.cpp \
form/FormPlugin.cpp \
navigation/NavigationPlugin.cpp \
paint/PaintPlugin.cpp \
video/VideoPlugin.cpp \
jni-bridge.cpp \
WEBCORE_PATH := C:/Path/AndroidBrowserPlugin/webkit/Source/WebCore
LOCAL_C_INCLUDES += \
$(JNI_H_INCLUDE) \
$(LOCAL_PATH) \
$(LOCAL_PATH)/animation \
$(LOCAL_PATH)/audio \
$(LOCAL_PATH)/background \
$(LOCAL_PATH)/form \
$(LOCAL_PATH)/navigation \
$(LOCAL_PATH)/paint \
$(LOCAL_PATH)/video \
$(WEBCORE_PATH)/bridge \
$(WEBCORE_PATH)/plugins \
C:/Path/AndroidBrowserPlugin/webkit/Source/WebKit/android/JavaVM \
C:/Path/AndroidBrowserPlugin/webkit/Source/WebKit/android/plugins \
C:/Path/AndroidBrowserPlugin/platform_external_skia/include/core \
C:/Path/AndroidBrowserPlugin/frameworks_native/include \
C:/Path/AndroidBrowserPlugin/frameworks_native/libs \
C:/Path/AndroidBrowserPlugin/frameworks_native/opengl/libs \
C:/Path/AndroidBrowserPlugin/platform_system_core/include \
C:/Path/AndroidBrowserPlugin/frameworks_native/opengl/include \
C:/Users/user/android-ndk-r8c/platforms/android-14/arch-arm/usr/include \
C:/Path/AndroidBrowserPlugin/BrowserPlugin/jni/libs/armeabi \
C:/Path/AndroidBrowserPlugin/platform_bionic \
C:/Path/AndroidBrowserPlugin/platform_bionic/libc/private \
C:/Path/AndroidBrowserPlugin/platform_hardware_libhardware/include
SO_LIB_PATH := C:/Path/AndroidBrowserPlugin/libs_qualcomm_MDP8960
LOCAL_LDLIBS := \
-L$(SO_LIB_PATH)/ -lnativehelper -landroid -lutils -lcutils -lEGL -lGLESv2 -lskia
LOCAL_CFLAGS += -fvisibility=hidden
LOCAL_CFLAGS += -DHAVE_PTHREADS -DANDROID
LOCAL_MODULE:= libsampleplugin
LOCAL_MODULE_TAGS := optional
include $(BUILD_SHARED_LIBRARY)
应用程序.mk:
# =============================================================================
#
# Main build file defining the project modules and their global variables.
#
# =============================================================================
# Don't remove this - mandatory
APP_PROJECT_PATH := $(call my-dir)
# The only STL implementation currently working with exceptions
APP_STL := gnustl_static
# Don't optimize for better debugging
APP_OPTIM := debug
您可能还需要一些头文件(例如JNIHelp.h
)您可以放置例如在进行 ndk 构建的根目录中BrowserPlugin/jni/
.
希望bash build.sh
应该建立你的libsampleplugin.so
构建脚本将其复制到应用程序目录中。然后您可以例如将项目导入 eclipse 并构建应用程序。将其安装在设备上,然后例如使用 WAMP 服务器托管以下文件:
索引.html:
<!DOCTYPE html>
<html>
<head>
<title>Test Plugin</title>
</head>
<body>
<object type="application/x-testbrowserplugin" height=50 width=250 id="testPlugin">
<param name="DrawingModel" value="Bitmap" />
<param name="PluginType" value="Form" />
</object>
</body>
</html>
run ipconfig
从您的主机获取 IP 地址,例如192.168.x.x
然后将您的设备浏览器指向例如http://192.168.x.x/
瞧,您应该看到一个表单插件。
我无法让动画插件正常工作,表单插件也不能完全工作,但至少插件被识别并加载正常。
现在,您可以使用示例插件浏览器作为指南或使用其他互联网资源来编写 webkit NPAPI 插件来执行您喜欢的操作。