导航:首页 > 操作系统 > android加载class

android加载class

发布时间:2022-09-23 11:38:14

android如何调用class类

就像在java中正常调用一样。new出来一个对象,然后就可以调用其方法了。不用非得写在Activity中.

② android手机的apk文件中的class.dex文件是什么是做什么用的呢

简单说就是优化后的android版.exe。每个apk安装包里都有。相对于PC上的java虚拟机能运行.class;android上的Davlik虚拟机能运行.dex。

作用

让dalvik能够运行。

dex好处

可以直接用DexClassLoader类加载,动态加载。于是只要在dex上加壳,在程序运行时脱壳,就可以规避静态反编译的风险。

(2)android加载class扩展阅读

使用dex文件的原因

在Android系统中,一个App的所有代码都在一个Dex文件里面。Dex是一个类似Jar的包,存储了很多Java编译字节码的归档文件。

因为Android系统使用Dalvik虚拟机,所以需要把使用Java Compiler编译之后的class文件转换成Dalvik能够执行的class文件。

③ Android手机的apk文件中的class.dex文件是什么是做什么用的呢

简单说就是优化后的android版.exe。每个apk安装包里都有。相对于PC上的java虚拟机能运行.class;android上的Davlik虚拟机能运行.dex。

作用

让dalvik能够运行。

dex好处

可以直接用DexClassLoader类加载,动态加载。于是只要在dex上加壳,在程序运行时脱壳,就可以规避静态反编译的风险。

(3)android加载class扩展阅读

使用dex文件的原因

在Android系统中,一个App的所有代码都在一个Dex文件里面。Dex是一个类似Jar的包,存储了很多Java编译字节码的归档文件。

因为Android系统使用Dalvik虚拟机,所以需要把使用Java Compiler编译之后的class文件转换成Dalvik能够执行的class文件。

④ Android类加载器以及与Java类加载器区别

加载的字节码不同

Android类加载器和Java的类加载器的类体系结构不一样:

Android的BootClassLoader和Java的BootStrapClassLoader区别:

Android类加载器和Java的类加载器工作机制是类似的,使用双亲委托机制。

⑤ 如何使用URLClassLoader加载本地的Class文件

在Java里面,我们可以把一些类放到.jar文件里面,然后用ClassLoader动态加载。例如:[java]viewplainURLClassLoaderucl=URLClassLoader.newInstance(newURL[]{newURL("file:/sdcard/files/test.jar")});Classclazz=ucl.loadClass("com.test.TestClass");但是在Android上面,情况有所不同。首先第一个是jar文件的制作,Java里面直接把.class文件打包到.jar文件里面就可以了,但是Android的DalvikVM是不认Java的bytecode的,所以不能直接这么打包,而要用dx工具转成Dalvikbytecode才可以。当然,dx工具转了之后,jar包里面就不是.class文件了,而是.dex文件。第二个是,Android里面虽然也提供了URLClassLoader的实现,但是并不能用。要动态加载其它类,可以用的ClassLoader有:DexClassLoaderPathClassLoader其中,DexClassLoader可以加载apk,jar或者dex文件,例如:[java]viewplainFilejarFile=newFile("/sdcard/test.dex");if(jarFile.exists()){DexClassLoadercl=newDexClassLoader(jarFile.toString(),"/sdcard/test",null,ClassLoader.getSystemClassLoader());Classc=cl.loadClass("com.qihoo360.test.Test");}但是DexClassLoader要求指定一个可写的目录,即DexClassLoader构造函数的第二个参数,在上例中是/sdcard/test这个参数的含义是:因为Dalvik在加载dex文件时,会动态进行优化,DexClassLoader要求指定优化后dex文件存放的位置。PathClassLoader的限制要一些,它只能加载已经安装到Android系统中的apk文件,也就是/data/app目录下的apk文件。其它位置的文件加载的时候都会出现ClassNotFoundException.例如:[java]viewplainPathClassLoadercl=newPathClassLoader(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了。

⑥ android中.class是什么意思

这些是java的基础知识.
this代表本类的一个引用,
this.*表示调用本类的某个方法,这个时候通常可以省略this;但在内部类中不能省略,否则编译器会认为是内部类的引用,所以要在this前加上类名
*.this表示本类的引用,通常前面的*是用本类的名字表示,当然也可以省略,但是如果是在内部类中一定要加上类名;
*.class表示其他的类;
在android中通常用的最多的地方是intent.setClass(A.this, B.class);

⑦ android插件化(四)Hook加载插件APK(ClassLoader方式)

前面插件化一和二说了下插桩式加载未安装的APK,主要是重写了getResource和getClassloader两个方法来实现的。以及每个组件要实现一个接口,通过接口注入上下文来达到它的生命周期。

那么插桩式和hook式的实现方式有什么不同呢?

插桩式是怎么加载到插件中的class文件呢,是通过将将APK转化成插件的Classloader,然后想要加载插件的class文件,我们的去拿这个插件的classloader去loadClass。所以是有一个中间者的。

hook式呢是将插件apk融入到了我们的宿主apk,那直接在里面就可以直接loadClass了,在不用这个插件的ClassLoader了,这样的话对于插件和宿主就没什么区别了,不像插桩式有一个中间者。

那么要实现hook式 就要知道android中一个class文件式怎样被加载到内存中去的。其实就是通过PathClassLoader来加载的。

那么我们先看下ClassLoader

任何一个java程序都是由一个或者多个class组成的,在程序运行时,需要将class文件加载到JVM中才可以使用,负责加载这些class文件的就是java的类加载机制。CLassLoader的作用就是加载class文件提供给程序运行时使用,每个Class对象内部都有一个ClassLoader来标示自己是有那个classLoade加载的。

Android app的所有的java文件都是通过PathClassLoader来加载的,那么它的父类是BaseDexClassLoader,还有一个兄弟类是DexClassLoader,那么他们有什么区别呢。

从上面可以看出这两个类的构造函数不同。(在26的源码中DexClassLoader中的optimizedDirectory也废弃了)

PathClassLoader:用于Android应用程序类加载器。可以加载指定的dex,以及jar、zip、apk中的classes.dex

DexClassLoader:加载指定的dex以及jar、zip、apk中的classes.dex。

可以看到创建ClassLoader的时候需要接收一个CLassLoader parent的参数,这个parent的目的就在于实现类加载的委托。

某个类加载器在接到加载类的请求时,首先将加载任务委托给父类加载器,一次递归,如果父加载器可以完成加载任务,那么就返回,只有当父加载器无法完成加载任务时,才自己去加载。

因此我们自己创建的ClassLoader:newPathClassLoader("/sdcard/xx.dex",getClassLoader()),并不仅仅只能加载我们的xx.dex中的class。

需要注意的是,findBootstrapClassOrNull 这个方法,当parent为null的时候,去这个BootCLassLoader进行加载,

但是在Android当中的实现:

所以new PathClassLoader("/sdcard/xx.dex",null),是不能加载Activity.class的。

上面分析了加载了一个class,是利用了双亲委托机制,那么要是都找不到那就开始调用自己的findCLass方法

在ClassLoader类中findClass:

任何ClassLoader的子类,都可以重写loadClass和findClass。如果你不想使用双亲委托,就重写loadClas修改实现,重写findClass则表示在双亲委托机制下,父ClassLoader都找不到class的情况下,定义自己去查找一个class。

而我们的PathClassLoader会自己负责加载Activity这样的类,利用双亲委托父类去加载activity,而我们的PathClassLoader没有重写findClass,是在它的父类里面。因此我们可以看看父类的findClass是如何实现的。

可以看到加载PathClassLoader加载class,转化为从DexPathList中加载class了,那么我们看看DexPathList中的findClass

那么从上面分析得到

到这里我们想要加载一个插件的apk ,其实最终加载的是一个dex文件(先说class文件,加载资源后面说),有没有办法吧这个dex文件给转化成一个 Element 对象,给放到 Elemeng数组 当中,这样直接就可以加载我们插件中的类了。

1、首先我们肯定是要得到插件APK的的中DexPathList对象中的dexElement数组

2、插件的dexElements数组我们拿到了,那么是不是要开始拿我们系统里面的 ,我们反射获取,和上面的一样。

3、上面我们获取到了系统和我们插件的dexElement数组,然后我们将这个数组合并到一个新的数组里面去,并且给注入到系统里面

至此,加载插件的一个流程基本就完成了。但是上面只是处理了class文件,没有处理资源。资源的话我们也是采用hook的方式去实现

在宿主的Application中hook这个方法,然后去重写getAsserts和getResources两个方法:

然后在插件的BaseActivity中继续重写getAssets和getResources两个方法

这样就可以完成hook式加载一个未安装的APK了。至此基本就完成了插桩式和Hook式插件化的基本实现。(后面几篇是优化)。

⑧ android 动态加载class,无法卸载么

class or interface may be unloaded if and only if its class loader is unreachable.
Classesloaded by the BootstrapClassLoader may not be unloaded。

意思是 类或接口可能不会被卸载除非ClassLoader是不能到达的,
被BootstrapClassLoader加载的类可能不会被卸载。也就是说BootstrapClassLoader加载的部分基本不可能被卸载。

其实一个已经加载的类是无法被更新的,如果你试图用同一个ClassLoader再次加载同一个类,
就会得到异常(java.lang.LinkageError: plicate classdefinition),
我们只能够重新创建一个新的ClassLoader实例来再次加载新类。
至于原来已经加载的类,开发人员不必去管它,
因为它可能还有实例正在被使用,只要相关的实例都被内存回收了,那么JVM就会在适当的时候把不会再使用的类卸载。

java的回收机制主要是针对堆区的,即主要针对的是对象的回收,
而其他的关于类的内存,因为自身并不占用太多而且也不会膨胀式地增长,
所以java没有对这部分的回收作过多地考虑。

⑨ 关于android链接class库调试

呵呵,一看就是第一次运行AVD吧?
一块黑色的区域,中间是“ANDROID”证明一切都很正常,不过就是需要等到待机界面出来,不要着急,电脑上运行会比较慢。
要是你有Android手机或MID等实体机就会发现那仅仅是个待机界面而已。
祝你好运!

⑩ android 动态加载class,无法卸载么

可以的,android中使用布局是为了加快开发,最终控件还是通过解析XML后,通过代码添加的。 具体方法: 例如你的布局是一个Linearlayout linear;上面有一本Button btn1; 要删除这个btn1要做的就是 linear.removeView( btn1 );

阅读全文

与android加载class相关的资料

热点内容
磁力计校正算法 浏览:491
解压缩后变小了 浏览:957
智友文件夹 浏览:81
android操作系统开发的操作系统 浏览:478
原神手机怎么改b站服务器 浏览:296
桩基箍筋加密区高度规范 浏览:91
手机樱花动漫app怎么用 浏览:382
php科学计数法转换 浏览:642
sip认证算法 浏览:785
androidapp卡顿原因 浏览:905
25编程器电路 浏览:849
安卓九是什么东西 浏览:939
隐藏nodejs命令行窗口 浏览:62
人体与写生素描pdf 浏览:883
java集合性能 浏览:143
单片机三线通信 浏览:209
昆山ug编程培训学费 浏览:628
黄色app怎么盈利的 浏览:957
怎么修改linux密码 浏览:703
国家发展中心app长什么样子 浏览:242