当前位置:首页 » 安卓系统 » androiddx

androiddx

发布时间: 2022-01-29 06:47:21

㈠ 求解:在Android中无法使用混淆后的第三方包问题

本应该暴露出来的参数或者类名被你混淆了,或者你把原来的变量类型改变了 造成变量类型不匹配

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

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

作用

让dalvik能够运行。

dex好处

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

(2)androiddx扩展阅读

使用dex文件的原因

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

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

㈢ android开发有没有可以通过代码将.class文件转化成.dex文件的jar包

adt里面有dx.jar,可以将class转换成dex.

安卓系统触摸屏参数问题:P dX dY Xv Yv Prs Size

prs代表压力值,越小越好!变成红色表示数值已稳定或最大

㈤ android dex何时加载

1 问题
在Android系统中,一个App的所有代码都在一个Dex文件里面。Dex是一个类似Jar的存
储了多有Java编译字节码的归档文件。因为Android系统使用Dalvik虚拟机,所以需要把
使用Java Compiler编译之后的class文件转换成Dalvik能够执行的class文件。这里需要强
调的是,Dex和Jar一样是一个归档文件,里面仍然是Java代码对应的字节码文件。
当Android系统启动一个应用的时候,有一步是对Dex进行优化,这个过程有一个专门的
工具来处理,叫DexOpt。DexOpt的执行过程是在第一次加载Dex文件的时候执行的。这
个过程会生成一个ODEX文件,即Optimised Dex。执行ODex的效率会比直接执行Dex文
件的效率要高很多。但是在早期的Android系统中,DexOpt有一个问题,也就是这篇文
章想要说明并解决的问题。DexOpt会把每一个类的方法id检索起来,存在一个链表结构
里面。但是这个链表的长度是用一个short类型来保存的,导致了方法id的数目不能够超过
65536个。当一个项目足够大的时候,显然这个方法数的上限是不够的。尽管在新版本的
Android系统中,DexOpt修复了这个问题,但是我们仍然需要对老系统做兼容。
2 思路
一种有效的解决思路是把Dex文件分割成多个较小的Dex。这就如同很多项目会把自己分
割成多个Jar文件一样,不同的功能在不同的Jar文件里面,通过一些配置和额外的操作,
可以让虚拟机有选择性的加载Jar文件。但是在Android系统中,一个应用是只允许有一
个Dex文件的。也就是说在编译期的时候,所有的Jar文件最终会被合并成一个Dex文件。
我们没有办法在Apk文件里面打包两个Dex,让DexOpt分别对两个Dex文件做处理,而
Android系统也不会同时为一个Apk加载两个Dex。
1
2.1 动态加载
如果我们把Dex分成多个文件,然后在程序运行的时候,再把多的那几个动态的加载进来
是否可行呢?也就是说我们能否在运行时阶段把代码加入虚拟机中。对于虚拟机来说,其
实所有的代码都是在运行时被加载进来的。而不同于C语言还存在着静态链接。虚拟机在
所有Java代码执行之前被启动,然后开始把字节码加载到环境中执行,我们可以理解成所
有的代码都是动态加载到虚拟机里的。
而说到加载,不得不说的是ClassLoader。它的工作就是加载.class文件。在Android的
Dalvik环境中,对应的是DexClassLoader,它们的功能是完全一样的。ClassLoader的
一大特点就是它是一个树状结构。每个ClassLoader都有一个父亲ClassLoader。也就是
说,ClassLoader不是把所有的Class放到一个巨大的数组或别的什么数据结构中来处理。
ClassLoader在加载一个Jar中的类的时候,需要制定另一个ClassLoader作为父亲节点,
当我们需要通过ClassLoader得到一个类类型的时候,ClassLoader会把请求优先交给父
亲ClassLoader来处理,而父亲ClassLoader又会交给它的父亲,一直到根ClassLoader。
如果根ClassLoader有这个类,而返回这个类的类类型,否则把这个请求交给这个请求的
来源子ClassLoader。这是一种向上传递,向下分发的机制。这种情况下,对于调用着来
说,子ClassLoader永远都是包含最多Class的ClassLoader。有一点我们需要注意,父亲
ClassLoader只会向请求来源分发自己的处理结果。所以如果来源是自己,那么如果没有
请求类它就会返回空,而不是遍历所有子ClassLoader去请求是否有被请求的类。
在Android系统中,对于一个应用来说,其实有两个ClassLoader,一个是SystemClassLoader,这个ClassLoader里面除了Java标准的类库之外,还有一个android.jar,所有
Android Framework层的类都在这里。而另外一个重要的ClassLoader就是基于Android
Context的ClassLoader。所有属于当前应用的类都是用这个ClassLoader来加载的,我们
可以在Android源码中看到,所有的Activity,Service,View都是使用这个ClassLoader
来反射并创建的。我们暂时把它叫做ContextClassLoader。
3 加载外部Dex
3.1 构建一个Dex文件
这一步并不复杂,首先我们把所需要的.class文件或者是Jar文件和一些源码一起编译生
成一个Jar文件。然后使用Android SDK提供的dx工具把Jar文件转成Dex文件。我们可以
提前对它进行ODex操作,让它在被DexClassLoader加载的时候,跳过DexOpt的部分工
作,从而加快加载的过程。
2
3.2 DexClassLoader
现在的工作就是在运行时加载这个Dex文件了。我们可以在Application启动的onCreate
方法里面加载Dex,但是如果你的Dex太大,那么它会让你的App启动变慢。我们也可以
使用线程去加载,但我们必须保证加载完成之后再进行某个外部类的请求。当然也可以真
正等到需要某个外部类的时候再进行Dex加载。这根本上取决于Dex文件本身的大小,太
大了可以预加载,而比较小可以等到实际需要的时候再加载。我们暂且把这个加载了外部
Dex的ClassLoader成为ExternalClassLoader
上面我们提到了树形结构和系统中的多个ClassLoader,当我们加载外部Dex的时候,我
们是否需要指定一个父ClassLoader呢?我们当然需要一个父ClassLoader,否则我们ExternalClassLoader连一些基本的Java类都没有,它根本不可能成功的加载一个Dex。进一
步的,我们要选择哪一个ClassLoader来作为我们的父亲呢?是SystemClassLoader还是
ExternalClassLoader?这是根据情况来定的,如果外部的Dex文件里没有任何和Android
相关的代码,那么SystemClassLoader是我们的首选,否则我们就应该用ContextClassLoader。如果是后者的情况,我们的树可以被看成一个链表。
3.3 外部的View, Acitivity等
我们知道,我们编写的四大组建都不是由我们自己来创建的,是由系统来给我们构造并
管理其生命周期的。那么这个过程是什么样的呢?拿Activity来举例,我们需要通过调用
当前Activity/Context的startActivity,传入一个Intent来调用启动一个新的Activity。系
统有一个ActivityManager来处理这里的逻辑。这里的逻辑相当的复杂,但简单来说,
ActivityManager会收到并处理这个Intent,从而决定是是启动一个新的,还是把旧的放
到前台。它会先查找这个Activity在哪个应用里面,这是通过扫描每个应用的AndroidManifest来确定。这些信息是在PackageManager里面被检索的。总之如果这个Activity
不再任何的manifest里面,它就不可能被启动。所以仅有一个Activity类是不够的,我们
需要在manifest里面声明它。
上面是Activity的情况,Service之类的也是同理。那么View怎么办?尽管我们可以直接创
建View,但是大部分的View都不是我们创建的,而是通过XML布局文件Inflate出来的。
也就是说,我们在XML定义了一些外部Dex里面的View,那么显然这个XML是不能被成
功的Inflate的。因为除非系统会使用我们的ExternalClassLoader,否则它肯定是找不到
我们的类的:ContextClassLoader里面并没有外部Dex中的类。
也就是说问题的根本在于,对于那些Android系统为我们创建的对象,它是不能包含在外
部Dex里面的。而Android系统中大部分的组建类的生命周期都交给了系统来管理。我们
3
不可能自己来创建这些类对象。那么另一种思路:我们是不是可以通过使用我们的ExternalClassLoader来代替ContextClassLoader呢?尽管系统的ContextClassLoader是私有
的,但是我们可以通过反射强制的把它替换成我们的ExternalClassLoader。而对于那些
外部的组建(Activity等),尽管我们没有它们的类,但是并不影响我们在AndroidManifest里面声明这个Activity。因为Android系统只是把它作为一个检索,并不会真正检查它
里面的组建是不是真的在虚拟机环境中已经被加载了,只有真正使用Intent启动某个组建
的时候才会去检查。而只要我们保证这个时候我们已经加载了外部的ClassLoader,那么
这个组建就可以被正常的启动。
还有一点,除了我们要为外部可能有的组建在AndroidManifest里面做声明一外,那些外
部组建可能用到的权限我们也需要一一声明,例如如果外部Activity使用了相机功能,那
么如果我们的Manifest里面没有声明使用相机功能的权限的话,即便这个Activity能成功
为加载出来,仍然是不能使用的。
4 核心代码段
加载外部Dex
mClassLoader = new DexClassLoader ( f . getAbsolutePath ( ) ,
mContext . getCacheDir ( ) . getAbsolutePath ( ) ,
null , mContext . getClassLoader ( ) ) ;
让系统使用ExternalClassLoader
t r y {
F ie ld mMainThread = ge t F ie ld ( A c t i v i t y . class , ”mMainThread”) ;
Object mainThread = mMainThread . get ( a c t i v i t y ) ;
Class t hreadClass = mainThread . get Class ( ) ;
F ie ld mPackages = ge t F ie ld ( threadClass , ”mPackages”) ;
WeakReference<?> r e f ;
Map< St ring , ?> map =(Map< St ring , ? >) mPackages . get (mainThread ) ;
r e f = (WeakReference<? >) map . get (mContext . getPackageName ( ) ) ;
Object apk = r e f . get ( ) ;
Class apkClass = apk . get Class ( ) ;
F ie ld mClassLoader = ge t F ie ld ( apkClass , ”mClassLoader”) ;
mClassLoader . set (apk , classLoader ) ;
} catch ( I llegalArgument Except ion e) {
i f (DEBUG) {
e . print St ackTrace ( ) ;
}
} catch ( I llega lAc c essEx c ept ion e) {
i f (DEBUG) {
4
e . print St ackTrace ( ) ;
}
}
5

㈥ android dx.bat怎么用

Android无法使用.BAT 批处理文件。

㈦ android和java的区别

android Java虚拟机和sun java虚拟机的主要区别体现在因为手机内存和硬件的限制,不可能直接将sun java虚拟机的机制搬过去,对于一些字节、内存管理方面需要重新设计,一下是主要区别:
1、Dalvik 和标准 Java 虚拟机(JVM)
Dalvik 基于寄存器,而 JVM 基于栈。基于寄存器的虚拟机对于更大的程序来说,在它们编译的时候,花费的时间更短。 JVM字节码中,局部变量会被放入局部变量表中,继而被压入堆栈供操作码进行运算,当然JVM也可以只使用堆栈而不显式地将局部变量存入变量表中。Dalvik字节码中,局部变量会被赋给65536个可用的寄存器中的任何一个,Dalvik指令直接操作这些寄存器,而不是访问堆栈中的元素。
2、Dalvik 和 Java 字节码的区别
VM字节码由.class文件组成,每个文件一个class。JVM在运行的时候为每一个类装载字节码。相反的,Dalvik程序只包含一个.dex文件,这个文件包含了程序中所有的类。Java编译器创建了JVM字节码之后,Dalvik的dx编译器删除.class文件,重新把它们编译成Dalvik字节码,然后把它们写进一个.dex文件中。这个过程包括翻译、重构、解释程序的基本元素(常量池、类定义、数据段)。常量池描述了所有的常量,包括引用、方法名、数值常量等。类定义包括了访问标志、类名等基本信息。数据段中包含各种被VM执行的函数代码以及类和函数的相关信息(例如DVM所需要的寄存器数量、局部变量表、操作数堆栈大小),还有实例变量。
3、Dalvik 和 Java 运行环境的区别
Dalvik 经过优化,允许在有限的内存中同时运行多个虚拟机的实例,并且每一个Dalvik 应用作为一个独立的Linux 进程执行。独立的进程可以防止在虚拟机崩溃的时候所有程序都被关闭。
Dalvik虚拟机在android2.2之后使用JIT (Just-In-Time)技术,与传统JVM的JIT并不完全相同,
Dalvik虚拟机有自己的 bytecode,并非使用 Java bytecode。

还有以下几点:
1、Dalvik主要是完成对象生命周期管理,堆栈管理,线程管理,安全和异常管理,以及垃圾回收等等重要功能。
2、Dalvik负责进程隔离和线程管理,每一个Android应用在底层都会对应一个独立的Dalvik虚拟机实例,其代码在虚拟机的解释下得以执行。
3、不同于Java虚拟机运行java字节码,Dalvik虚拟机运行的是其专有的文件格式Dex。

不过有一点是习惯了java语言开发的程序员,在android平台上同样可以接着使用java的全部语法,只不过新增了很多知识点。

㈧ android程序运行时提示:the file dx.jar was not loaded from the SDK folder! 但是我有dx.jar这个文件

该提示意思是:
文件dx.jar没有从SDK文件夹加载!
是不是你的SDK没有将路径加载到eclipse中?

㈨ android开发环境搭建出错dx.jar

tools中有文件名为“android”的程序, 运行它, 选择你要下载的版本, 下载。

㈩ android系统 主要有哪几部分

android系统分为四部分,从高到低分别是:

1、Android应用层

2、Android应用框架层

3、Android系统运行层

4、Linux内核层

Android系统构架主要应用于ARM平台,但不仅限于ARM,通过编译控制,在X86、MAC等体系结构的机器上同样可以运行。

(10)androiddx扩展阅读

Android运行库

Android包括了一个核心库,该核心库提供了JAVA编程语言核心库的大多数功能。

每一个Android都拥有一个独立的Dalvik虚拟机实例。Dalvik被设计成一个设备可以同时高效地运行多个虚拟系统。Dalvik虚拟机执行(.dex)的Dalvik可执行文件,该格式文件针对小内存使用做了优化。

同时虚拟机是基于寄存器的,所有的类都经由JAVA编译器编译,然后通过SDK中的“dx”工具转化成.dex格式由虚拟机执行。

热点内容
jmeter脚本调试 发布:2024-05-02 15:21:45 浏览:326
安卓微信数据怎么传到新手机 发布:2024-05-02 15:17:19 浏览:631
服务器搭建备案 发布:2024-05-02 15:17:10 浏览:719
王者荣耀服务器为什么崩溃 发布:2024-05-02 15:03:23 浏览:965
android立方体 发布:2024-05-02 15:00:06 浏览:61
手机存储的音乐删除了怎么办 发布:2024-05-02 14:55:00 浏览:379
方舟如何运行服务器 发布:2024-05-02 14:47:45 浏览:772
如何创作抖音模板脚本 发布:2024-05-02 14:42:36 浏览:856
ftp被动模式下载 发布:2024-05-02 14:33:25 浏览:314
教堂电影院ftp 发布:2024-05-02 14:32:35 浏览:482