android 动态调用apk,通过反射动态加载未安装apk
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
不知道哪里出了问题,折腾了好几天了
logcat显示
I load plugin class com.plugin.PluginMain
W dalvik Class resolved by unexpected DEX: Lcom/plugin/PluginMain;(0x42771290):0x50da8000 ref [LLogCatBroadcaster;] LLogCatBroadcaster;(0x42736e80):0x4006e000
.........
源码
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;
import android.content.*;
public class PluginActivity extends Activity
{
private Context mContext = this;
private Class> localClass;
private Object localInstance;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
String dexpath = "/sdcard/AppProjects/plugin/bin/plugin.apk";
String cachePath = getApplication().getCacheDir().getPath();
String dexoutputpath = cachePath;
String libPath = cachePath;
LoadAPK(dexpath, dexoutputpath, libPath);
pluginActivityCreate();
}
public void LoadAPK(String dexpath, String dexoutputpath, String libPath)
{
try
{
ClassLoader classLoader = getClassLoader();
DexClassLoader localDexClassLoader = new DexClassLoader(dexpath, dexoutputpath, libPath, classLoader);
String activityname = getActivityName(dexpath);
if (activityname != null)
{
localClass = localDexClassLoader.loadClass(activityname);
Constructor> localConstructor = localClass.getConstructor(new Class[] {Context.class});
localInstance = localConstructor.newInstance(new Object[] {mContext});
Log.i("load plugin",localClass.toString());
}
return;
}
catch (Exception e)
{
e.printStackTrace();
}
}
public String getActivityName(String apkFile)
{
PackageInfo plocalObject = mContext.getPackageManager().getPackageArchiveInfo(apkFile, 1);
if ((plocalObject.activities != null) && (plocalObject.activities.length > 0))
{
return plocalObject.activities[0].name;
}
else
{
return null;
}
}
private void pluginActivityCreate(){
try
{
Method onCreate = localClass.getDeclaredMethod("onCreate", new Class[]{Bundle.class});
onCreate.setAccessible(true);
onCreate.invoke(localInstance, new Object[]{null});
}
catch (NoSuchMethodException e)
{
e.printStackTrace();
}
catch (IllegalArgumentException e)
{
e.printStackTrace();
}
catch (InvocationTargetException e)
{
e.printStackTrace();
}
catch (IllegalAccessException e)
{
e.printStackTrace();
}
}
}
插件
import android.app.*;
import android.os.*;
import android.util.*;
import android.view.*;
import android.view.ViewGroup.*;
import android.content.*;
import android.widget.*;
import android.graphics.*;
public class PluginMain extends Activity
{
protected Activity mProxyActivity = this;
private String TAG = "plugin";
public PluginMain()
{
super();
}
public PluginMain(Context context)
{
super();
this.mProxyActivity = (Activity) context;
}
@Override
public void onCreate(Bundle savedInstanceState)
{
if (mProxyActivity == this)
{
super.onCreate(savedInstanceState);
}
else
{
mProxyActivity.setContentView(getView(mProxyActivity));
}
Log.d(TAG, "Plugin onCreate");
}
private View getView(Context context)
{
LinearLayout layout = new LinearLayout(context);
layout.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
layout.setBackgroundColor(Color.WHITE);
Button button = new Button(context);
button.setText("button");
layout.addView(button, LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
button.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View p1)
{
// TODO: Implement this method
Toast.makeText(mProxyActivity, "HelloWorld", Toast.LENGTH_SHORT).show();
}
});
return layout;
}
}
android 动态调用apk,通过反射动态加载未安装apk相关推荐
- Android插件化开发之用DexClassLoader加载未安装的APK资源文件来实现app切换背景皮肤
第一步.先制做一个有我们需要的图片资源的APK 如下图,这里有个about_log.png,我们需要生成apk文件. 生成的apk文件如果你不到项目的文件夹里面去取apk,想通过命令放到手机里面去可以 ...
- Android应用开发提高系列(4)——Android动态加载(上)——加载未安装APK中的类...
前言 近期做换肤功能,由于换肤程度较高,受限于平台本身,实现起来较复杂,暂时搁置了该功能,但也积累了一些经验,将分两篇文章来写这部分的内容,欢迎交流! 关键字:Android动态加载 声明 欢迎转载, ...
- [转]Android应用开发提高系列(4)——Android动态加载(上)——加载未安装APK中的类...
本文转自:http://www.cnblogs.com/over140/archive/2012/03/29/2423116.html 前言 近期做换肤功能,由于换肤程度较高,受限于平台本身,实现起来 ...
- Android应用开发提高系列(5)——Android动态加载(下)——加载已安装APK中的类和资源...
前言 Android动态加载(下)--加载已安装APK中的类和资源. 声明 欢迎转载,但请保留文章原始出处:) 博客园:http://www.cnblogs.com 农民伯伯: http://ov ...
- 【Android 安全】DEX 加密 ( 多 DEX 加载 | 65535 方法数限制和 MultiDex 配置 | PathClassLoader 类加载源码分析 | DexPathList )
文章目录 一.65535 方法数限制和 MultiDex 配置 二.多 DEX 加载引入 三.PathClassLoader 类加载源码分析 四.BaseDexClassLoader 类加载源码分析 ...
- Android开发之动态加载,运行未安装apk
Android运行未安装apk可以使用Android的DexClassLoader类 这个也可以再Android的官方文档中看到 A class loader that loads classes f ...
- jQuery EasyUI动态添加控件或者ajax加载页面后不能自动渲染问题的解决方法
博客分类: jquery-easyui jQueryAjax框架HTML 现象: AJAX返回的html无法做到自动渲染为EasyUI的样式.比如:class="easyui-layout ...
- 【Android 逆向】整体加固脱壳 ( DexClassLoader 加载 dex 流程分析 | DexFile loadDexFile 函数 | 构造函数 | openDexFile 函数 )
文章目录 前言 一.DexFile.loadDexFile 函数分析 二.DexFile 构造函数分析 三.DexFile.openDexFile 函数分析 前言 上一篇博客 [Android 逆向] ...
- 【Android 逆向】整体加固脱壳 ( DexClassLoader 加载 dex 流程分析 | DexPathList 中根据 File 加载 DexFile | loadDexFile 分析 )
文章目录 前言 一.根据 File 加载 DexFile 二.DexPathList.loadDexFile 函数分析 前言 上一篇博客 [Android 逆向]整体加固脱壳 ( DexClassLo ...
最新文章
- DataGrid鼠标事件处理
- HarmonyOS之常用组件Text的功能和使用
- kerberos体系下的应用(yarn,spark on yarn)
- Servlet使用适配器模式进行增删改查案例(DeptDaoImpl.java)
- python函数结构_PYTHON 之结构体,全局变量,函数参数,lambda编程 等
- html5着陆页模板,多用途着陆页HTML模板
- 办公自动化-实测doc文档-创建文档添加内容-0223
- 静态代码检查工具简介
- flume监听服务器文件,flume监听服务器端口数据库
- LINUX警告:检测到时钟错误。您的创建可能是不完整的。-转
- 在字符串中标红_在C ++中标记字符串
- SQL查询效率-100w数据查询只要1秒
- linux命令行中的大括号,linux命令行学习(19):花括号扩展(brace expansion)
- TMC2300-LA 低压、超静音微型步进电机驱动器
- html如何调用less,LESS
- 解决 DOES NOT SUPPORT INDEXING ERROR IN A GO PROGRAM
- kaggle实战:Titanic
- eSPI自学笔记(二):Perpheral Channel与Subtractive Decode
- 外接硬盘在电脑中不显示的解决方案
- numpy矩阵与向量类型的向量乘法