当前位置:首页 » 安卓系统 » androidapp插件

androidapp插件

发布时间: 2024-09-28 19:30:36

㈠ android 怎么动态的加载类

android 如何动态的加载类----app插件技术

转自:http://blog.csdn.net/mingli198611/article/details/8858076
?
前言:
?
? ? ? 在目前的软硬件环境下,Native App与Web App在用户体验上有着明显的优势,但在实际项目中有些会因为业务的频繁变更而频繁的升级客户端,造成较差的用户体验,而这也恰恰是Web App的优势。现如今很多项目要求需要采用类似于微信或Q游这样的插件化开发模式越来越多,本文就是阐述android的动态加载技术来满足插件化开发模式的文章。
?
1.基本概念
1.1??在Android中可以动态加载,但无法像java中那样方便动态加载jar。
Android的虚拟机(DalvikVM)是不认识Java打出jar的byte code,需要通过dx工具来优化转换成Dalvikbyte code才行。这一点在咱们Android项目打包的apk中可以看出:引入其他Jar的内容都被打包进了classes.dex。即android要加载的java类必须dex格式的代码文件.
1.2??在Android中可以加载基于NDK的so库。
NDK的执行效率很高,加密性很好,但同时开发入门难度大,一般用于加解密、数学运算等场合。so的加载很简单,如果APK发布时已经携带了so文件,只需要在加载时调用System.loadLibrary(libName)方法即可。由于软件的安装目录中存放so的目录是没有写权限的,开发者不能更改该目录的内容,所以如果要动态加载存放在其他地方的so文件,用System.load(pathName)方法即可。
1.3??在Android中支持动态加载dex文件的两种方式:
DexClassLoader:这个可以加载jar/apk/dex,也可以从SD卡中加载,也是本文的重点
PathClassLoader:只能加载已经安装到Android系统中的apk文件。也就是 /data/app 目录下的 apk 文件。其它位置的文件加载的时候都会出现 ClassNotFoundException.因为 PathClassLoader 会去读取 /data/dalvik-cache 目录下的经过 Dalvik 优化过的 dex 文件,这个目录的 dex 文件是在安装 apk 包的时候由 Dalvik 生成的。
?
2.注意
2.1 采用不用安装的插件开发模式,只能够使用?DexClassLoader进行加载.不过动态加载是有一些限制的,比如插件(子apk)包中的Activity、Service类是不能动态加载的,因为缺少声明;即使你在Manifest文件中进行了声明,系统默认也是到安装apk所在的路径中去寻找类,所以你会遇到一个ClassNotFound的异常。插件里你可以用主apk中先前放入的layout、strings等资源。但是插件中自带的界面只能用纯代码进行编写,插件中是不能加载插件(子apk)中的xml作为layout等资源使用的。所以在开发上一些特效会比较困难些,建议预先植入主apk中。
2.2?大家可以看看DexClassLoader的API文档,里面不提倡从SD卡加载,不安全
3.如何制作插件
3.1 把工程导出为jar包
3.2 执行SDK安装目录android-sdk-windows\platform-tools下的dx命令,把jar包转换为dex格式

dx?--dex?--output=dex名 jar包名

4.如何做到启动未安装的apk中的activity?

采用反射机制,把主apk中的activity的context传递到插件的activity中,然后采用反射进行回调插件activity的方法。不足之出就是,插件中的activity并不是真正的activity,它只是运行在主activity中。比如:点击返回直接退出当前activity而不是回到主activity。实例如下:
?
这是调用的Activity:
?
[java]?view plain ? ?
package?com.beyondsoft.activity;??
??
import?java.lang.reflect.Constructor;??
import?java.lang.reflect.InvocationTargetException;??
import?java.lang.reflect.Method;??
??
import?dalvik.system.DexClassLoader;??
import?android.app.Activity;??
import?android.content.pm.PackageInfo;??
import?android.os.Bundle;??
import?android.util.Log;??
??
public?class?PlugActivity?extends?Activity?{??
??
????private?Class?mActivityClass;??
????private?Object?mActivityInstance;??
????Class?localClass;??
????private?Object?instance;??
??
????@Override??
????protected?void?onCreate(Bundle?savedInstanceState)?{??
????????super.onCreate(savedInstanceState);??
??
????????Bundle?paramBundle?=?new?Bundle();??
????????paramBundle.putBoolean("KEY_START_FROM_OTHER_ACTIVITY",?true);??
????????paramBundle.putString("str",?"PlugActivity");??
????????String?dexpath?=?"/sdcard/FragmentProject.apk";??
????????String?dexoutputpath?=?"/mnt/sdcard/";??
????????LoadAPK(paramBundle,?dexpath,?dexoutputpath);??
????}??
??
????@Override??
????protected?void?onStart()?{??
????????super.onStart();??
????????Method?start;??
????????try?{??
????????????start?=?localClass.getMethod("onStart");??
????????????????start.invoke(instance);??
????????}?catch?(Exception?e)?{??
????????????//?TODO?Auto-generated?catch?block??
????????????e.printStackTrace();??
????????}??
????}??
??
????@Override??
????protected?void?onResume()?{??
????????//?TODO?Auto-generated?method?stub??
????????super.onResume();??
????????Method?resume;??
????????try?{??
????????????resume?=?localClass.getMethod("onResume");??
????????????resume.invoke(instance);??
????????}?catch?(Exception?e)?{??
????????????//?TODO?Auto-generated?catch?block??
????????????e.printStackTrace();??
????????}??
????}??
??
????@Override??
????protected?void?onPause()?{??
????????super.onPause();??
????????Method?pause;??
????????try?{??
????????????pause?=?localClass.getMethod("onPause");??
????????????pause.invoke(instance);??
????????}?catch?(Exception?e)?{??
????????????e.printStackTrace();??
????????}??
????}??
??
????@Override??
????protected?void?onStop()?{??
????????super.onStop();??
????????try?{??
????????????Method?stop?=?localClass.getMethod("onStop");??
????????????stop.invoke(instance);??
????????}?catch?(Exception?e)?{??
????????????e.printStackTrace();??
????????}??
????}??
??
????@Override??
????protected?void?onDestroy()?{??
????????//?TODO?Auto-generated?method?stub??
????????super.onDestroy();??
????????try?{??
????????????Method?des?=?localClass.getMethod("onDestroy");??
????????????des.invoke(instance);??
????????}?catch?(Exception?e)?{??
????????????//?TODO?Auto-generated?catch?block??
????????????e.printStackTrace();??
????????}??
????}??

㈡ 开发安卓app用什么软件

开发安卓应用(Android App)主要使用以下几种软件:

Android Studio

Android Studio是谷歌官方推出的集成开发环境(IDE),专为Android应用开发设计。它提供了丰富的功能和工具,如代码编辑器、编译器、模拟器、性能分析工具等,能帮助开发者高效编写、测试和优化应用。此外,Android Studio还集成了Google Play服务,方便开发者集成谷歌的服务和API。

Eclipse with ADT

虽然Android Studio是目前的主流选择,但Eclipse曾经也是一款非常流行的Android开发工具。Eclipse是一个通用的IDE,而ADT(Android Development Tools)是一个插件,为Eclipse增加了Android开发的支持。然而,随着Android Studio的推出和不断完善,Eclipse的使用率已经大幅下降。

IntelliJ IDEA

IntelliJ IDEA是JetBrains公司开发的一款强大的Java IDE,也支持Android开发。与Android Studio相比,IntelliJ IDEA更加灵活和可定制,但它的学习曲线相对较陡,适合有一定经验的开发者。

Visual Studio Code

Visual Studio Code(VS Code)是微软开发的一款轻量级但功能强大的代码编辑器,通过安装插件也能支持Android开发。VS Code具有跨平台、可定制性强、启动速度快等特点,受到了越来越多开发者的青睐。

总的来说,Android Studio是目前开发安卓应用的首选软件,因为它提供了最全面的功能和最便捷的集成开发环境。然而,根据开发者的需求和习惯,Eclipse、IntelliJ IDEA和Visual Studio Code也是可行的选择。

㈢ 怎样检测android应用软件第三方插件SDK的安全问题

1、爱内测平台的插件评估将为您引用第三方从安全、性能测试、功能、兼容性等方面进行评估,以及集成第三方插件对您的应用是否有影响,包括功能、安装包大小、性能等方面进行评估。
2、插件测试主要通过黑白名单方式收集近千款常用插件安全漏洞、性能、兼容性测试以及引用后对自身产品的影响,再采用主动检测方式将插件进行反编译再对插件从源码与程度应用安全2大类型进行安全检测。

㈣ apkplug是什么

ApkPlug是一款好用的Android平台下的模块化、插件化开发框架工具。

ApkPlug可以帮你减少apk应用代码,缩小apk应用体积,同时支撑动态加载、应用内进行更新升级,支持第三方插件接入,为你开发APP减少人力和时间成本。
有以下特点:
完美支持Android原生四大组件。
插件化apk:多个APK在一个APK上运行。而且APK无需改造为插件。
插件异常隔离:再也不会发生因插件奔溃而导致主应用随之奔溃的情况。
类ip地址传送数据更方便快捷:新增主应用与插件,插件与插件之间类似ip地址传输的数据流管道通讯方式,使其之间的通信更简单快捷。

开发一般有3个步骤:
1,注册开发者账号,获取应用授权AppAuth。
2,插件应用中导入SDK和配置文档,之后编译打包。
3, 主应用中导入SDK和配置文档。并放置打包好的插件应用APK。之后编译打包启动即可。

热点内容
php中替换字符串 发布:2024-09-28 22:01:48 浏览:581
sql数据库的使用 发布:2024-09-28 22:01:41 浏览:626
你们的wifi密码多少 发布:2024-09-28 21:53:07 浏览:376
android访问服务器 发布:2024-09-28 21:48:46 浏览:733
安卓平板如何实现电脑双击 发布:2024-09-28 21:27:11 浏览:360
德育php 发布:2024-09-28 21:24:36 浏览:17
企业密信如何登录服务器ld 发布:2024-09-28 21:22:52 浏览:463
通过ip不能访问网站 发布:2024-09-28 21:21:47 浏览:523
c语言取整数部分 发布:2024-09-28 21:17:59 浏览:66
进来学编程 发布:2024-09-28 21:01:17 浏览:966