当前位置:首页 » 安卓系统 » osgiandroid

osgiandroid

发布时间: 2023-03-11 11:57:06

❶ 如何使用ApkPlug进行Android平台下模块化开发

步骤1:注册ApkPlug官网账号:

打开Apkplug官网后,点击右上角的“注册”,在跳转页面填入相关信息,注册界面如下:

确认后注册成功,使用你的账号登录网站。你就可以用Apkplug开发应用了

END

步骤2:开发插件

Apkplug中的插件也是一个完整的apk,它与普通应用的区别有以下3点:

1, 插件assets目录下有一个plugin.xml文档,通过它可判断一个工程是主应用还是插件。

2, 插件有一个入口类BundleActivator

3, 插件会外部引用一个osgi.jar文件

开发插件的步骤有如下4步:

1,引入osgi.jar库文件

Apkplug中插件需要导入的库文件只有一个osgi.jar。

导入osgi.jar库文件需要注意一下

osgi.jar文件只能引用不能编译到apk文件中,否则会出现类冲突的情况

异常代码:had used a different Lorg/osgi/framework/BundleActivator; ring pre-verification。

osgi.jar包导入方法:

这文件在Apkplug SDK中可以找到。

❷ 怎样在eclipse 工具中安装android开发工具包插件

二 软件安装

(1)安装jdk 6u19 安装完成即可,无需配置环境变量

(2)解压eclipse eclipse无需安装,解压后,直接打开就行

(3)解压android sdk 这个也无需安装,解压后供后面使用

(4)最终有三个文件夹,如下图:

三 Eclipse配置

1 安装android 开发插件

(1)打开Eclipse, 在菜单栏上选择 help->Install New SoftWare 出现如下界面:

点击 Add按钮,出现如下界面

输入网址: https://dl-ssl.google.com/android/eclipse/ (如果出错,请将https改成http)

名称: Android (这里可以自定义)

点击OK,将出现如下界面

点击 Next按钮 ,出现如下界面:

点击Next按钮,出现如下界面:

选择 I accept the terms of the license agreements 点击Next,进入安装插件界面

安装完成后,出现如下界面

点击Yes按钮,重启Eclipse

2 配置android sdk

(1)点击菜单window->preferences,进入如下界面

选择你的android SDK解压后的目录,选错了就会报错,这个是升级工具,目前还没有一个版本的SDK

(2)升级SDK版本,选择菜单 window->Android sdk and avd manager 出现如下界面

选择update all按钮,出现如下界面

选择左边的某一项,点击accept表示安装,点击reject表示不安装,我这里只选了SDK 2.1 和samples for api 7 , 自己可以任意自定义,确定后,选择install按钮,进入安装界面如下:

安装完成如下:

(3)新建AVD(android vitural device) 和上面一样,进入android sdk and avd manager,选中Vitural Devices 在点击New按钮

点击New按钮后,进入如下界面:

名称可以随便取,target选择你需要的SDK版本,SD卡大小自定义,点击 Create AVD,得到如下结果

如上显示创建AVD完毕

3 新建Android项目

(1)选择菜单file->new->other 进入如下界面:

选择新建Android Project项目,点击Next按钮,进入如下界面

名称自定义,应用程序名自定义,报名必须包含一个点以上,min SDK version里面必须输入整数

点击Next出现如下界面:

注: 若有错误如: Project ... is missing required source folder: 'gen' ,则将gen->Android.Test->R.java这个文件删掉,Eclipse会为我们重新生成这个文件,并且不会报错。

(3)配置运行

右键项目->Run as -> Run Configuration 进入如下界面:
该界面,点击Browse 按钮,选择你要运行的项目

选择Target切换到以下界面

该界面选择运行的AVD,将AVD前面的方框设置为选择状态。

(4)测试项目运行

右键项目名称->run as ->Android Application 即可启动运行该Android程序,如下所示:

正在进入

测试程序运行结果

❸ android 热部署是什么意思

在 Java 开发领域,热部署一直是一个难以解决的问题,目前的 Java 虚拟机只能实现方法体的修改热部署,对于整个类的结构修改,仍然需要重启虚拟机,对类重新加载才能完成更新操作。对于某些大型的应用来说,每次的重启都需要花费大量的时间成本。虽然 osgi 架构的出现,让模块重启成为可能,但是如果模块之间有调用关系的话,这样的操作依然会让应用出现短暂的功能性休克。本文将探索如何在不破坏 Java 虚拟机现有行为的前提下,实现某个单一类的热部署,让系统无需重启就完成某个类的更新。

类加载的探索
首先谈一下何为热部署(hotswap),热部署是在不重启 Java 虚拟机的前提下,能自动侦测到 class 文件的变化,更新运行时 class 的行为。Java 类是通过 Java 虚拟机加载的,某个类的 class 文件在被 classloader 加载后,会生成对应的 Class 对象,之后就可以创建该类的实例。默认的虚拟机行为只会在启动时加载类,如果后期有一个类需要更新的话,单纯替换编译的 class 文件,Java 虚拟机是不会更新正在运行的 class。如果要实现热部署,最根本的方式是修改虚拟机的源代码,改变 classloader 的加载行为,使虚拟机能监听 class 文件的更新,重新加载 class 文件,这样的行为破坏性很大,为后续的 JVM 升级埋下了一个大坑。
另一种友好的方法是创建自己的 classloader 来加载需要监听的 class,这样就能控制类加载的时机,从而实现热部署。本文将具体探索如何实现这个方案。首先需要了解一下 Java 虚拟机现有的加载机制。目前的加载机制,称为双亲委派,系统在使用一个 classloader 来加载类时,会先询问当前 classloader 的父类是否有能力加载,如果父类无法实现加载操作,才会将任务下放到该 classloader 来加载。这种自上而下的加载方式的好处是,让每个 classloader 执行自己的加载任务,不会重复加载类。但是这种方式却使加载顺序非常难改变,让自定义 classloader 抢先加载需要监听改变的类成为了一个难题。
不过我们可以换一个思路,虽然无法抢先加载该类,但是仍然可以用自定义 classloader 创建一个功能相同的类,让每次实例化的对象都指向这个新的类。当这个类的 class 文件发生改变的时候,再次创建一个更新的类,之后如果系统再次发出实例化请求,创建的对象讲指向这个全新的类。
下面来简单列举一下需要做的工作。
创建自定义的 classloader,加载需要监听改变的类,在 class 文件发生改变的时候,重新加载该类。
改变创建对象的行为,使他们在创建时使用自定义 classloader 加载的 class。

自定义加载器的实现
自定义加载器仍然需要执行类加载的功能。这里却存在一个问题,同一个类加载器无法同时加载两个相同名称的类,由于不论类的结构如何发生变化,生成的类名不会变,而 classloader 只能在虚拟机停止前销毁已经加载的类,这样 classloader 就无法加载更新后的类了。这里有一个小技巧,让每次加载的类都保存成一个带有版本信息的 class,比如加载 Test.class 时,保存在内存中的类是 Test_v1.class,当类发生改变时,重新加载的类名是 Test_v2.class。但是真正执行加载 class 文件创建 class 的 defineClass 方法是一个 native 的方法,修改起来又变得很困难。所以面前还剩一条路,那就是直接修改编译生成的 class 文件。
利用 ASM 修改 class 文件
可以修改字节码的框架有很多,比如 ASM,CGLIB。本文使用的是 ASM。先来介绍一下 class 文件的结构,class 文件包含了以下几类信息,一个是类的基本信息,包含了访问权限信息,类名信息,父类信息,接口信息。第二个是类的变量信息。第三个是方法的信息。ASM 会先加载一个 class 文件,然后严格顺序读取类的各项信息,用户可以按照自己的意愿定义增强组件修改这些信息,最后输出成一个新的 class。
首先看一下如何利用 ASM 修改类信息。
清单 1. 利用 ASM 修改字节码
ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS);
ClassReader cr = null;
String enhancedClassName = classSource.getEnhancedName();
try {
cr = new ClassReader(new FileInputStream(
classSource.getFile()));
} catch (IOException e) {
e.printStackTrace();
return null;
}
ClassVisitor cv = new EnhancedModifier(cw,
className.replace(".", "/"),
enhancedClassName.replace(".", "/"));
cr.accept(cv, 0);

热点内容
为什么文件要压缩 发布:2025-05-13 21:16:07 浏览:50
局域网怎么搭建校时服务器 发布:2025-05-13 21:11:32 浏览:677
存储器读写实验心得 发布:2025-05-13 21:09:23 浏览:15
派派手机如何设置密码 发布:2025-05-13 21:08:02 浏览:774
狱辱实验栋第2集在线ftp 发布:2025-05-13 21:02:06 浏览:11
安卓桌面应用如何变大 发布:2025-05-13 20:59:39 浏览:361
解压通知单有什么用 发布:2025-05-13 20:58:37 浏览:567
俄罗斯方块的编程 发布:2025-05-13 20:51:08 浏览:611
python开发项目 发布:2025-05-13 20:44:17 浏览:736
安卓手机怎么样刷国行系统 发布:2025-05-13 20:44:14 浏览:320