动态引用APK文件
来源:互联网 发布:sql nvl函数 编辑:程序博客网 时间:2024/06/08 19:29
不安装APK,仍然可以调用APK文件中的Java类,这种访问Java类的方式称为“动态引用APK文件”,——相当于传统的java程序动态调用jar文件。
APK文件本质上是ZIP格式的压缩文件,要想动态调用APK文件,在APK文件中必须包含一个classes.dex文件(classes.dex文件是Android应用中所有的Java源代码编译生成的Davlik虚拟机格式的二进制文件)。每一个编译过的Android工程目录的bin目录下都有一个classes.dex文件和一个相应的APK文件。
动态调用的APK文件的扩展名并不重要,也可以使用任何的扩展名,还甚至可以没有扩展名。比如XXXX.apk,XXXX.jar,XXXX.abcd,XXXX都没问题。
下面演示一个动态调用APK文件中的Java类的完整案例:
(1)编写Remote工程——新建一个Remote项目,并在其中添加一个如下类:
package songshi.remote;public class ServiceClass {public String addService(){return "MyProject调用Remote工程的AddService方法成功";}}运行Remote工程,生成Remote.apk(在bin目录下),将此APK文件push到Android模拟器DDMS的/mnt/sdcard/下。
(2)编写MyProject工程,布局文件添加一个按钮
package com.songshi.myproject;import java.lang.reflect.Method;import dalvik.system.DexClassLoader;import android.media.RemoteControlClient.MetadataEditor;import android.os.Bundle;import android.os.Environment;import android.app.Activity;import android.view.Menu;import android.view.View;import android.widget.Button;import android.widget.Toast;public class MainActivity extends Activity {/* * 使用DexClassLoader类动态装载APK文件 * public DexClassLoader(String dexPath, String optimizedDirectory, String libraryPath, ClassLoader parent); * dexPath参数:表示APK文件的路径; * optimizedDirectory参数:表示一个用于写入优化后的APK文件的目录,通常为程序的私有数据目录; * parent参数:通常为ClassLoader.getSystemClassLoader() * */private DexClassLoader dexClassLoader;private Button btnAdd;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//第 1 步:装载APK文件//定义优化目录:/data/data/com.songshi.myprojectString optimizedDirectory= Environment.getDataDirectory().toString() + "/data/" + getPackageName();dexClassLoader=new DexClassLoader("/mnt/sdcard/Remote.apk", optimizedDirectory, null, ClassLoader.getSystemClassLoader());btnAdd=(Button) findViewById(R.id.btnAdd);btnAdd.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubtry{//第 2 步:装载要访问的类Class c=dexClassLoader.loadClass("songshi.remote.ServiceClass"); //Call requires API level 14 (current min is 8)//第 3 步:创建类的对象Object obj=c.newInstance();//第 4 步:用Java反射技术调用ServiceClass类中的addService方法Method method = obj.getClass().getMethod("addService", null);String add =String.valueOf(method.invoke(obj, null));Toast.makeText(MainActivity.this, add, Toast.LENGTH_LONG).show();}catch(Exception e){Toast.makeText(MainActivity.this, "error:"+e.getMessage(), Toast.LENGTH_LONG).show();}}});} /* * APK文件并不是什么类都可以调用。例如,有Context类型参数的方法就不能动态访问,因为只有已经安装的APK程序才能获得Context对象。 * 还有四大组件类也不可以使用,例如,由于窗口类是由系统自动创建和维护的,所以 Activity的子类自然就不能通过动态访问的方式当做窗口类来使用。 * */@Overridepublic boolean onCreateOptionsMenu(Menu menu) {// Inflate the menu; this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.main, menu);return true;}}
运行
0 0
- 动态引用APK文件
- 动态引用js文件
- Android动态加载jar,dex,apk文件
- 动态引用外部的Javascript脚本文件
- 页面动态引用JS或CSS文件
- Linux qtcreator引用动态库.pro文件
- .so动态库文件到APK ./mk文件编写
- Android 打包so动态库文件到APK
- Android 打包so动态库文件到APK
- Android 打包so动态库文件到APK
- Android 打包so动态库文件到APK
- Android 打包so动态库文件到APK
- Android 打包so动态库文件到APK
- 动态加载apk文件并调用其代码
- 动态加载未安装的apk文件里面的类
- android动态加载未安装的apk文件中…
- 关于apk加壳之动态加载dex文件
- 如何动态加载apk文件(未安装的apk)中的类
- Number of 1 Bits
- $locationChangeStart ,$locationChangeSuccess,$routeChangeStart,$routeChangeSuccess如何使用
- 【PA2014】【BZOJ3727】Zadanie
- hdoj f(n) 2582 (GCD打表&找规律)好题
- 黑马程序员之System、Runtime、Math、Date、Calendar类
- 动态引用APK文件
- Android LocalSocket与Socket 区别
- UVA 11624 两次bfs搞搞
- UITextView 光标定位
- WPF Prism 中Command绑定的简单应用
- 关于UI适配的文档
- 计算机网络(浅谈应用层协议原理)
- [OpenGL]OpenGL中的三维变换
- 把事情往苦逼里做