当前位置:首页 » 安卓系统 » androidapk加载

androidapk加载

发布时间: 2022-06-07 20:21:55

A. android 怎么动态的加载类

java 里面,我们可以把一些类放到 .jar 文件里面,然后用 ClassLoader 动态加载。例如:
[java] view plain
URLClassLoader ucl = URLClassLoader.newInstance(new URL[]
{new URL("file:/sdcard/files/test.jar")});
Class clazz = ucl.loadClass("com.test.TestClass");
但是在 Android 上面,情况有所不同。
首先第一个是 jar 文件的制作,Java 里面直接把 .class 文件打包到 .jar 文件里面就可以了,但是 Android 的 Dalvik VM 是不认 Java 的 byte code 的,所以不能直接这么打包,而要用 dx 工具转成 Dalvik byte code 才可以。当然,dx 工具转了之后,jar 包里面就不是 .class 文件了,而是 .dex 文件。
第二个是,Android 里面虽然也提供了 URLClassLoader 的实现,但是并不能用。要动态加载其它类,可以用的 Class Loader 有:
DexClassLoader
PathClassLoader
其中,DexClassLoader 可以加载 apk, jar 或者 dex 文件,例如:
[java] view plain
File jarFile = new File("/sdcard/test.dex");
if ( jarFile.exists() ) {
DexClassLoader cl = new DexClassLoader(jarFile.toString(), "/sdcard/test", null, ClassLoader.getSystemClassLoader());
Class<?> c = cl.loadClass("com.qihoo360.test.Test");
...
}
但是 DexClassLoader 要求指定一个可写的目录,即 DexClassLoader 构造函数的第二个参数,在上例中是 /sdcard/test

这个参数的含义是:directory where optimized DEX files should be written

因为 Dalvik 在加载 dex 文件时,会动态进行优化,DexClassLoader 要求指定优化后 dex 文件存放的位置。
PathClassLoader 的限制要更多一些,它只能加载已经安装到 Android 系统中的 apk 文件,也就是 /data/app 目录下的 apk 文件。其它位置的文件加载的时候都会出现 ClassNotFoundException. 例如:
[java] view plain
PathClassLoader cl = new PathClassLoader(jarFile.toString(), "/data/app/", ClassLoader.getSystemClassLoader());
为什么有这个限制呢?我认为这其实是当前 Android 的一个 bug, 因为 PathClassLoader 会去读取 /data/dalvik-cache 目录下的经过 Dalvik 优化过的 dex 文件,这个目录的 dex 文件是在安装 apk 包的时候由 Dalvik 生成的。例如,如果包的名字是 com.qihoo360.test,Android 应用安装之后都保存在 /data/app 目录下,即 /data/app/com.qihoo360.test-1.apk,那么 /data/dalvik-cache 目录下就会生成 data@[email protected]@classes.dex 文件。在调用 PathClassLoader 时,它就会按照这个规则去找 dex 文件,如果你指定的 apk 文件是 /sdcard/test.apk,它按照这个规则就会去读 /data/dalvik-cache/[email protected]@classes.dex 文件,显然这个文件不会存在,所以 PathClassLoader 会报错。
在 Google 修正这个问题之前,我们要么就只能用 DexClassLoader,要么就只能用 PathClassLoader 加载已安装的 apk 了。

B. 安卓开发怎么先启动APP再加载资源 因为APP启动太慢了,我想先启动进入activity,然后

可以开一个线程,把不需要及时显示的放在线程中加载

C. 如何动态加载android的so文件,如何压缩apk尺寸,androidapk

在Android中调用动态库文件(*.so)都是通过jni的方式,而且往往在apk或jar包中调用so文件时,都要将对应so文件打包进apk或jar包,工程目录下图:

以上方式的存在的问题:
1、缺少灵活性比较类似静态加载了(不是静态加载),能加载的so文件绑定死了;
2、但so文件很多或很大时,会导致对应的apk和jar包很大;
3、不能动态的对so文件更新;

Android中加载so文件的提供的API:
void System.load(String pathName);

说明:
1、pathName:文件名+文件路劲;
2、该方法调用成功后so文件中的导出函数都将插入的系统提供的一个映射表(类型Map);

看到以上对System.load(String pathName);的函数说明可定有人会想到将so文件放到一个指定的目录然后再通过参数pathName直接引用该目录的路劲和对应的so文件问题不就解决了吗?
这里有个问题被忽略了,那就是System.load只能加载两个目录路劲下的so文件:
1、/system/lib ;
2、安装包的路劲,即:/data/data/<packagename>/…
而且这两个路劲又是有权限保护的不能直接访问;

问题解决方法:
先从网络下载so文件到手机目录(如:/test/device/test.so) –> 将test.so加载到内存(ByteArrayOutputStream) –> 然后保存到对用安装包目录;
具体代码如下:

try {
String localPath = Environment.getExternalStorageDirectory() + path;
Log.v(TAG, "LazyBandingLib localPath:" + localPath);

String[] tokens = mPatterns.split(path);
if (null == tokens || tokens.length <= 0
|| tokens[tokens.length - 1] == "") {
Log.v(TAG, "非法的文件路径!");
return -3;
}
// 开辟一个输入流
File inFile = new File(localPath);
// 判断需加载的文件是否存在
if (!inFile.exists()) {
// 下载远程驱动文件
Log.v(TAG, inFile.getAbsolutePath() + " is not fond!");
return 1;
}
FileInputStream fis = new FileInputStream(inFile);

File dir = context.getDir("libs", Context.MODE_PRIVATE);
// 获取驱动文件输出流
File soFile = new File(dir, tokens[tokens.length - 1]);
if (!soFile.exists()) {
Log.v(TAG, "### " + soFile.getAbsolutePath() + " is not exists");
FileOutputStream fos = new FileOutputStream(soFile);
Log.v(TAG, "FileOutputStream:" + fos.toString() + ",tokens:"
+ tokens[tokens.length - 1]);

// 字节数组输出流,写入到内存中(ram)
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len = -1;
while ((len = fis.read(buffer)) != -1) {
baos.write(buffer, 0, len);
}
// 从内存到写入到具体文件
fos.write(baos.toByteArray());
// 关闭文件流
baos.close();
fos.close();
}
fis.close();
Log.v(TAG, "### System.load start");
// 加载外设驱动
System.load(soFile.getAbsolutePath());
Log.v(TAG, "### System.load End");

return 0;

} catch (Exception e) {
Log.v(TAG, "Exception " + e.getMessage());
e.printStackTrace();
return -1;

}

D. 想请教下各位,android动态加载apk的实现方法

其实有一个很实际的问题就是当你重新做一个功能,比你重用一个功能所花的时间更少的情况下那么重用还有价值么,以上出现的情况可说是百分百这个问题我早就想明白了,不过不知道怎么说明白。反正重用就是实验室里的东西不过不重要啦,反正你的问题就是在android里面反编译出xml就好了,如果你非要一条路走到底,不想其他实现的话。

E. 如何更新android系统中到Setting.apk

第一步:
首先要在android源码根目录下执行
740 . build/envsetup.sh
741 brunch jordan
这一步其实是全编译android来,会在根目录下生成update-cm-7.2.0-RC1-jordan-UNOFFICIAL-signed.zip,这个ROM,用于更新系统。
在以后,其实可以直接
. build/envsetup.sh
来初始化编译环境。
进入android-cm7/packages/apps/Settings,执行命令mm:
结果如下:
make: Entering directory `/home/neo/defy/android-cm7'
Copying: out/target/common/obj/APPS/Settings_intermediates/emma_out/lib/classes-jarjar.jar
Install: out/target/proct/jordan/system/app/Settings.apk
Copying: out/target/common/obj/APPS/SettingsTests_intermediates/emma_out/lib/classes-jarjar.jar
Install: out/target/proct/jordan/data/app/SettingsTests.apk
make: Leaving directory `/home/neo/defy/android-cm7'
可见,在out/target/proct/jordan/system/app/目录下 生成了Settings.apk文件。

第二步:
在目录android-cm7/out/target/proct/jordan/system/app下执行
# adb remount
将文件系统重新挂载,获得文件系统到读写权限,再执行push,将Settings.apk加载到目标路径,覆盖原来到Settings,
# adb push Settings.apk /system/app
3122 KB/s (4576533 bytes in 1.431s)
手机上重新打开设置,就可以看见刚才修改到效果了。

F. 如何把电脑里的apk文件加载到安卓模拟器

模拟后不是能联网吗,就可以下载啦,先下个文件管理的东西,再用文件管理打开电脑里的apk文件,或者直接从网上下,方便多了

G. android 怎么动态更新apk中jar包

核心类
1.1 DexClassLoader类
可以加载jar/apk/dex,可以从SD卡中加载为安装的apk。
1.2 PathClassLoader类
只能加载已经安装到Android系统中的apk文件。
一、正文
1.1
类似于eclipse的插件化实现, 首先定义好接口, 用户实现接口功能后即可通过动态加载的方式载入jar文件, 以实现具体功能。 注意 , 这里的jar包需要经过android dx工具的处理 , 否则不能使用。

H. 如何动态加载android的so文件,如何压缩apk尺寸

1、去除不必要的依赖,检查所有直接和间接的依赖关系
2、去除不用的资源,asset下的文件没用的就删掉,res下的,尤其是图片,没用的就删,在build.gradle中release标签里加上shrinkResources true,没有的资源就不会被打到包里了
3、启用代码混淆,混淆不仅可以防止反编译,也可以减小包的体积,它主要是把包里的dex文件变小了

I. android 怎么加载未安装的apk资源

准备

准备被调用Android工程:TestB
ITest
public interface ITest {
String getMoney();
}
TestBActivity

public class TestBActivity extends Activity implements ITest {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}

@Override
public String getMoney() {
return "1";
}

}

代码说明:很简单的代码。将生成后的TestB.apk拷贝到SD卡的根目录下。

调用 :

调用工程TestA

public class TestAActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

String path = Environment.getExternalStorageDirectory() + "/";
String filename = "TestB.apk";
DexClassLoader classLoader = new DexClassLoader(path + filename, path,
null, getClassLoader());

try {
Class mLoadClass = classLoader.loadClass("com.nmbb.TestBActivity");
Constructor constructor = mLoadClass.getConstructor(new Class[] {});
Object TestBActivity = constructor.newInstance(new Object[] {});

Method getMoney = mLoadClass.getMethod("getMoney", null);
getMoney.setAccessible(true);
Object money = getMoney.invoke(TestBActivity, null);
Toast.makeText(this, money.toString(), Toast.LENGTH_LONG).show();

} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
}

执行的时候可以发现会自动生成TestB.dex文件。动态加载方面还可以搜索一下"Java动态加载"方面的资料,很有参考价值。

J. android 怎么动态加载jar

核心类 1.1 DexClassLoader类 可以加载jar/apk/dex,可以从SD卡中加载为安装的apk。 1.2 PathClassLoader类 只能加载已经安装到Android系统中的apk文件。 一、正文 1.1 类似于eclipse的插件化实现, 首先定义好接口, 用户实现接口功能后即可通过动态加载的方式载入jar文件, 以实现具体功能。 注意 , 这里的jar包需要经过android dx工具的处理 , 否则不能使用。

热点内容
内置存储卡可以拆吗 发布:2025-05-18 04:16:35 浏览:336
编译原理课时设置 发布:2025-05-18 04:13:28 浏览:378
linux中进入ip地址服务器 发布:2025-05-18 04:11:21 浏览:612
java用什么软件写 发布:2025-05-18 03:56:19 浏览:32
linux配置vim编译c 发布:2025-05-18 03:55:07 浏览:107
砸百鬼脚本 发布:2025-05-18 03:53:34 浏览:945
安卓手机如何拍视频和苹果一样 发布:2025-05-18 03:40:47 浏览:742
为什么安卓手机连不上苹果7热点 发布:2025-05-18 03:40:13 浏览:803
网卡访问 发布:2025-05-18 03:35:04 浏览:511
接收和发送服务器地址 发布:2025-05-18 03:33:48 浏览:372