eoe 移动开发者论坛

 找回密码
 加入eoe

QQ登录

只需一步,快速开始

查看: 7295|回复: 7
收起左侧

Android动态加载jar/dex遇到的问题

[复制链接]

签到天数: 1 天

连续签到: 1 天

[LV.1]初来乍到

1

主题

127

帖子

381

e币
发表于 2013-3-13 14:27:40 | 显示全部楼层 |阅读模式

没有eoe的账号,级别还太低,出门如何吹牛逼?

您需要 登录 才可以下载或查看,没有帐号?加入eoe

x
本帖最后由 fengzi8834760 于 2013-3-13 14:33 编辑

想法:实现与腾讯游戏大厅融合自身开发游戏的方式,安装了游戏大厅后对于腾讯自主研发的游戏比如:斗地主,用户无需安装就可以直接使用。

设计思路:把子apk放到assets目录中,在主程序中将此apk拷贝到SD卡中,用动态加载方式去调用。

实现:


[mw_shl_code=java,true]        public void loadAPK(Bundle paramBundle, String dexpath, String dexoutputpath) {
                ClassLoader localClassLoader = ClassLoader.getSystemClassLoader();
                DexClassLoader localDexClassLoader = new DexClassLoader(dexpath,
                                dexoutputpath, null, localClassLoader);
                try {
                        PackageInfo plocalObject = getPackageManager()
                                        .getPackageArchiveInfo(dexpath, 1);

                        if ((plocalObject.activities != null)
                                        && (plocalObject.activities.length > 0)) {
                                String activityname = plocalObject.activities[0].name;
                                Log.d(TAG, "activityname = " + activityname);

                                Class localClass = localDexClassLoader.loadClass(activityname);
                                Constructor localConstructor = localClass
                                                .getConstructor(new Class[] {});
                                Object instance = localConstructor.newInstance(new Object[] {});
                                Log.d(TAG, "instance = " + instance);

                                Method localMethodSetActivity = localClass.getDeclaredMethod(
                                                "setActivity", new Class[] { Activity.class });
                                localMethodSetActivity.setAccessible(true);
                                localMethodSetActivity.invoke(instance, new Object[] { this });

                                Method methodonCreate = localClass.getDeclaredMethod(
                                                "onCreate", new Class[] { Bundle.class });
//                                Method methodonCreate = localClass.getDeclaredMethod("init", new Class[]{String.class});
                                methodonCreate.setAccessible(true);
                                methodonCreate.invoke(instance, paramBundle);
                        }
                        return;
                } catch (Exception ex) {
                        ex.printStackTrace();
                }
        }[/mw_shl_code]

采用以上方法在外置SD卡(/mnt/sdcard/)上可以启动子apk,但在内置SD卡(/storage/sdcard0)中无法启动,报错语句:
DexClassLoader localDexClassLoader = new DexClassLoader(dexpath,
dexoutputpath, null, localClassLoader);

错误信息如下:

java.lang.IllegalArgumentException: Optimized data directory /storage/sdcard0 is not owned by the current user. Shared storage cannot protect your application from code injection attacks.


大家有没有遇到过此问题,如何解决?

该用户从未签到

9

主题

1729

帖子

4548

e币
发表于 2013-5-13 13:42:59 | 显示全部楼层
楼主,这个问题你解决没有啊

签到天数: 1 天

连续签到: 1 天

[LV.1]初来乍到

1

主题

127

帖子

381

e币
 楼主| 发表于 2013-5-15 14:35:47 | 显示全部楼层
拷贝文件到/data/data/包名 目录下即可解决此问题

该用户从未签到

0

主题

15

帖子

27

e币
发表于 2013-7-26 15:02:47 | 显示全部楼层
坐等解决方案

签到天数: 1 天

连续签到: 1 天

[LV.1]初来乍到

27

主题

276

帖子

934

e币
发表于 2013-9-15 15:30:45 | 显示全部楼层
        String path = Environment.getExternalStorageDirectory() + File.separator;
        String filename = "LoadUnstallApkDemo.apk";

        String optimizedDirectory = path + File.separator + "dex_temp"  ;
        // 核心是这里, 通过getDir来获取一个File对象,然后在获取到getAbsolutePath, 传递给DexClassLoader 即可
        File file = getDir("dex", 0) ;
        DexClassLoader classLoader = new DexClassLoader(path + filename, file.getAbsolutePath(),
                                                                                                        null, getClassLoader());

该用户从未签到

2

主题

32

帖子

120

e币
发表于 2015-2-4 17:01:36 | 显示全部楼层
这个帖子为什么没人结掉啊,,,只要原因的麻烦解释一下!!!!

该用户从未签到

0

主题

5

帖子

47

e币
发表于 2015-2-25 14:09:22 | 显示全部楼层
原因上面写了
Optimized data directory /storage/sdcard0 is not owned by the current user. Shared storage cannot protect your application from code injection attacks.

说那个目录不只是属于当前用户,从共享的存储读取代码可能会导致你的应用受到攻击

该用户从未签到

13

主题

118

帖子

317

e币
发表于 2015-10-30 15:03:51 | 显示全部楼层
楼主,咱们将apk拷贝到sdcard目录的??
*滑动验证:
您需要登录后才可以回帖 登录 | 加入eoe

本版积分规则

推荐阅读
赞助商们

QQ|联系我们|小黑屋|手机版|eoe 移动开发者论坛 ( 京ICP备11018032 京公网安11010802020210  

GMT+8, 2018-1-24 15:46 , Processed in 0.619227 second(s), 44 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表
关闭

扫一扫 关注eoe官方微信