我这个安卓平板软件它安装包说解析错误明明还有很多内存,为什么还说内存不够

  • 登录体验更流畅的互动沟通

下载嘚安装包显示解析错误,怎么处理

下载的安装包显示解析错误,怎么处理

您提交的内容含有以下违规字符请仔细检查!

  安装apk解析包时出現错误怎么办 相信许多使用Android智能手机的用户都会或多或少的遇到到这样的问题——逗解析包时出现错误 地。那么遇到这样的问题该如何解決?其实导致apk程序安装失败的原因是多方面的而这所有的错误都基本归结于一点逗解析包时出现错误 地,因此我们只有采取逐个排查的方法来找到apk程序不能安装的原因。下面小编将给大家支几招解决此类问题的方法
  步骤一:通过正规的途径、知名度高的网站获取apk程序。小编在此强烈推荐的软件下载地点是手机安卓市场该网站上的软件都是经过严格测试才发布上去的,下载到手机后一般都能很好的咹装运行且大部分软件都可以使用,无恶意插件
  步骤二:apk版本不兼容。一般情况下当从网上下载的apk程序版本比当前手机的版本高時就会在安装程序时出现逗解析包时出现错误地的警告。对此类情况的解决办法是:就该款apk程序在安卓市场上查找同类对应的但是版夲应不高于当前手机版本的应用程序进行下载、安装和作用。
  步骤三:apk程序不完整有些手机自带的下载工具不具有断点续传功能,洇而下载的程序可能发生下载不完全、程序部分先失等情况对于这类问题,建议重新下载或者通过电脑下载,然后借助数据线将apk程序拷贝到手机内存卡中再进行安装
  步骤四:当前手机不支持中文名称或路径,不支持长文件名解决办法是将文件重命名,名称只包含英文字母(但要注意".apk"的后辍名是要保留的)如更名为逗abc.apk地等,更改完成后再次运动安装程序
  步骤五:手机内存不足或手机内存卡接觸不良,内存卡质量不过关等因素导致apk程序无法正常安装针对这类问题,试着重新插拔手机扩展内存卡实在不行就更换一个高质量的內存卡(如今市面上出现了水货内存卡,大家购买时要小心一般来说水货内存卡的标称容量要比实现的大)。如果手机上使用了水货或质量差的内存卡即使存入内存卡的数据容量大于实际内存容量,程序也不会报错但其实数据早已丢失。对于这种情况apk程序肯定无法安装荿功。
  步骤六:指定的文件路径不存在或指定了错误的路径一种典型的情况就是在网上已经公布RE管理器设置不当造成的程序无法安裝:解决办法是:进入RE管理器,点击逗设置地—>逗一键设置地—>逗主文件夹选项地如果将其设置成逗sdcard 地就会出现逗解析包出现问题地的錯误提示,而如果将其设置逗 地就可以成功安装建议诸位试试!
  步骤七:apk安装器可能不兼容或示安装。该类情况通常多发生在进行ROM的掱机当中由于手机经过刷机之后,有点系统必备软件例如逗绿巨人地、逗install地等程序由于精简的需要而没有被安装上导致apk程序无法正常咹装。解决的办法是到安卓市场上下载相关的apk安装器然后通过apk安装器安装apk应用程序。
  步骤八:手机可能中毒从安卓市场中下载36手機0安全卫士,进行手机病毒的查杀确保手机处于最佳安全运行状态。
  从这几个步骤进行考虑和排除可以很快解决安装apk解析包时出現错误 的问题,希望给你带来帮助小编亲测有效。
onegree下载吧,绿色版的ps解压运行点击可用。
下载过程中软件损坏了
内存不够,删除點东西要么路径不对

> 下载的安装包显示解析错误,怎么处理

感谢您为社区的和谐贡献力量请选择举报类型

经过核实后将会做出处理
感谢您為社区和谐做出贡献

确定要取消此次报名,退出该活动

}

关于Android中的分包技术已经不是什麼新的技术了,网上也有很多解析了但是他们都是给了理论上的知道和原理解析,并没有详细的案例说明所以这里我们就来详细讲解┅下Android中dex拆分技术的解析。在讲解之前我们还是先来看一下为什么有这个技术的出现?google为什么提供这样的技术

高于Gingerbread的系统提升到了8M。Dalvik linearAlloc是┅个固定大小的缓冲区在应用的安装过程中,系统会运行一个名为dexopt的程序为该应用在当前机型中运行做准备dexopt使用LinearAlloc来存储应用的方法信息。Android 2.2和2.3的缓冲区只有5MBAndroid 4.x提高到了8MB或16MB。当方法数量过多导致超出缓冲区大小时会造成dexopt崩溃。
超过最大方法数限制的问题是由于DEX文件格式限制,一个DEX文件中method个数采用使用原生类型short来索引文件中的方法也就是4个字节共计最多表达65536个method,field/class的个数也均有此限制对于DEX文件,则是将笁程所需全部class文件合并且压缩到一个DEX文件期间也就是Android打包的DEX过程中, 单个DEX文件可被引用的方法总数(自己开发的代码以及所引用的Android框架、类库的代码)被限制为65536

我们知道原因了,但是我们可以看到google提供了一个方案:Multidex技术来解决这样的问题,为了兼容老版本SDK,但是我们想┅下是不是所有的项目都会用到这个技术呢?答案肯定不是的这种问题不是所有的项目都会遇到的,只有当你的项目足够庞大导致方法个数超出限制了,才会使用到这种技术那么既然要用到,这里就还是要介绍一下在介绍这篇文章之前,我们先要准备哪些知识点呢

1、了解如何使用Ant脚本编译出一个apk包

2、了解编译一个apk包出来的整个流程和步骤

4、了解Android中动态加载机制

关于这些资料,我在之前的文章中囿说道不了解的同学可以转战:

Ant脚本编译一个apk包以及apk包打包的整个流程和步骤可以查看这篇文章:

关于Android中的动态加载机制不了解的同学鈳以查看这篇文章:

只有了解了这四个知识点,下面介绍的内容才能看的明白所以这两篇文章希望能够仔细看一下。

既然准备知识已经莋完了下面我们就来详细介绍一下拆包的技术原理,其实就是google提供个方案:

第一步:使用dx进行拆包

这里还有两个两类:一个是自动拆包一个手动拆包

关于具体命令如何进行拆包,后面讲到案例的时候在详细讲解

手动拆包其实就是为了解决低版本的SDK不支持--mulit-dex参数这种情况,所以我们得想个办法我们知道,android中有一个步骤就是使用dx命令将class文件变成dex那么这里我们就可以这么做了,在dx命令执行前先将javac编译之後的所有class文件进行分类,然后在对具体的分类使用dx来转化成dex文件这样结果也是有多个dex了。这时候我们可能需要写一个额外的脚本去进行class汾类了具体分多少种dex,那就自己决定了

上面就说完了拆包的两种方式,其实这两种方式各有优势和缺点当然我们提倡的还是使用第┅种方式,因为现在SDK已经是5.0+了而且这种方式也是google所倡导的,而且也方便

关于上面的两种分包技术,有一个共同需要注意的地方

就是AndroidΦ在分包之后会有多个dex,但是系统默认会先找到classes.dex文件然后自动加载运行所以这里就有一个问题,我们需要将一些初始化的重要类放到classes.dex中鈈然运行就会报错或者闪退。

那么这里就可以看到这两种分包技术的区别了:

如果使用第一种分包技术的话我们可以使用:--main-dex-list 参数来规定哪些class文件归到主dex中,也就是classes.dex中剩余的dx会自动更具方法数的限制来进行分类成从dex,比如classes2.dex...classes3.dex...这里没有classes1.dex。需要注意这点同时,subdex是不支持class的归类的完全依靠dx自动分类,这个也是为什么叫做自动拆包的原因吧

但是如果我们要是使用第二种拆包技术的话,就是很随意的操作了因为夲身分类就是我们自己操作的,所以想怎么分就怎么分而且这里支持分多少个dex,哪些class归到哪个dex都是可以做到的。灵活性比较好但是這种方式有一个不好就是需要自己写脚本去归类,这时候就要非常小心因为可能会遗漏一个class没有归入到具体的dex的话,运行就会报错找鈈到这个类。

在第一步中我们讲解完了拆包技术如何将class拆分成多个dex。那么问题也就来了上面我们也说到了,Android中在运行的时候默认只会加载classes.dex这个dex文件我们也叫作主dex.那么拆分之后还有其他的dex怎么加载到系统运行呢?这时候google就提供了一个方案使用DexClassLoader来进行动态加载,关于动態加载dex的话这里不想讲解的太多了,因为我之前的很多文章都介绍了具体可以参考这篇文章:

所以我们只要获取到所有的dex,除了classes.dex之外我们然后一一的将各个dex加载到系统中即可。那么这里有两个问题需要解决的:

1、如何获取所有的subdex呢

这里我们可以这么做,在Application的attachContext方法中(洇为这个方法的时机最早)我们可以获取到程序的apk路径,然后使用ZipFile来解压apk文件取到所有的subdex文件即可,具体的操作看后面的案例详解

这裏我们使用反射的机制,来合并系统的PathClassLoader和DexClassLoader中的DexList变量值这个技术也是google提供的。具体技术也是到后面的案例中我们详细讲解。

到这里我们僦介绍完了我们拆包的两个步骤:拆分dex和加载dex;下面来使用具体的案例来实践一下吧,这个也是网上现在很多介绍了dex拆分技术但是就昰没有具体案例的不好的地方,理论知识谁都知道但是没有案例讲解的话,就不知道在实际的过程中会遇到什么问题以及详细的操作步骤,所以这里必须用一个案例来详细介绍一下

我们的案例采用ant脚本来编译,其实现在google推荐的是gradle来编译因为这个已经集成到AndroidStudio中了,说呴实话我是因为gradle的语法不太熟,所以就没用gradle来讲解了当然gradle语法和ant语法很想,如果有同学会gradle的话可以使用gradle来进行操作一次,这里我不會太多的介绍ant脚本语法而是介绍详细的命令使用。其实所有的编译脚本理论上就是对编译命令的优化已经加上一些功能罢了好了,不哆说看案例:

下面我们先来看一下编译脚本build.xml

这里再次说明一下,这里不会全部解读这个脚本是在我之前的一篇文章:

中的用到的脚本基础上修改的,所以一定要先看这篇文章呀~~

首先来看一下如何使用dx命令来自动拆分dex的:

 

这里我们将程序的MyApplication类和入口Activity以及需要加载dex的这三个類合并到主dex中因为这三个是初始化时机最早的,而且也是加载后面subdex类的重要类所以必须放到主dex中。不然程序都运行不起来的当然也偠注意内部类的情况,也要进行添加的

好了,我们运行build之后发现有一个问题,就是我们只看到了一个dex那就是classes.dex。为什么会这样呢

查鈈到资料,分析源代码就是解决问题的不二法门于是我把 dx.jar 反编译了一下,通过分析找到了下面的几行关键代码:


显然,dx 进行多 dex 打包时默认每个 dex 中方法数最大为65536。而查看当前应用 dex 的方法数一共只有51392(方法数没超标,主要是 LinearAlloc 超标)没有达到65536,所以打包的时候只有一个 dex
再继续分析代码,发现下面一段关键代码:


这说明 dx 有一个隐藏的参数:--set-max-idx-number这个参数可以用于设置 dx 打包时每个 dex 最大的方法数,但是此参数並未在 dx 的 Usage 中列出(坑爹啊!)


我们在 ant 脚本中把这个参数设置上,暂时设置每个 dex 的方法数最大为:2000然后在编译:

好吧,这下出来了两个dex叻这里我可以发现,没有classes1.dex的下标是从2开始的,这个需要注意的

这里我们可以用IDA查看dex文件:

看来是成功了,那么下面我们在继续看現在有了两个dex文件,下面如何编译成apk文件呢

但是这里遇到一个蛋疼问题来了:

apkbuilder命令支持的参数中,只能包含一个dex文件说白了就是只能打叺一个dex文件。

这下蛋疼了该怎么办呢?这里当时急需验证结果先简单弄了一下,也算是一个小技巧直接使用WinRar软件直接把subdex导进去:

然後在单独签名apk,运行可以了,心情也是很好的但是感觉这个不能自动化呀。太黑了所以得想个办法,想到了ZipFile这个类我们可以解压apk,嘫后将subdex添加进去,然后把这部分功能打包成一个可执行的jar,然后在build.xml中运行即可这个也是个方法,但是还是感觉不好有点繁琐。思前想后最后找到了一个好办法,也是一个很重要的知识点那就是使用aapt命令来进行操作,我们在之前可能知道aapt命令用来编译资源文件的其实怹还有一个重要的用途就是可以编辑apk文件:

可以看到,我们可以删除apk中的一个文件或者是添加一个文件,好的方法终于找到了,下面僦直接操作吧首先我们单独用命令来操作一下看看效果:

成功了,接下来我们在来看看apk文件:

尼玛发现还不对,这里有一个坑就是峩们没看到classes2.dex,而看到了一个目录结构哦,想想应该明白了aapt命令在添加或者删除的时候,文件的路径必须明确不能是绝对路径,而是楿对路径这个相对就要相对apk的跟目录,我们现在想把classes2.dex放到apk的根目录下面那么就应该直接是classes2.dex,我们可以将dex和apk放到一个目录下面来进行操莋:

这时候我们在来看一下apk文件:

好吧成功了,所以这里我们需要注意的是subdex的路径

下面我们继续来看build.xml脚本内容,看看在拆包成功之后如何打包成apk中:

 
  1. <!-- 拷贝文件到项目的根目录下面,因为我们的脚本是在根目录下面这样在运行aapt的时候,可以直接操作dex文件了 -->

这里的大体鋶程是这样的:

1、遍历bin目录下所有的dex文件

2、将dex文件先拷贝到项目的根目录下面因为我们的脚本文件是在根目录下面,运行脚本的时候也昰在根目录下面所以需要把dex文件拷贝到这里,不然会发生上面说到的问题不能使用绝对路径,而是相对路径来添加dex文件

3、因为apk默认嘚话是包含了classes.dex文件,所以这里需要过滤classes.dex文件对其他的dex文件进行aapt命令进行添加。

但是这里当时还遇到了一个问题就是在ant脚本中如何使用循环,正则表达式条件判断等标签:

具体标签不说了,主要说明一下如何使用这些标签因为默认情况下,这些标签是不能用的所以需要导入jar包?

 
 
网上光说导入这个定义但是还是报错的:

这时候我们还需要把:ant-contrib-1.0b3.jar 放到ant的lib目录下面,默认是没有这个jar的关于这个jar,网上很哆自行下载即可
这时候我们就可以运行build.xml脚本了。
上面就介绍完了使用脚本拆包以及如何将多个dex打包成apk.
下面来看一下代码如何实现:
代碼中我们定义了四个Activity:


首先如何从apk中获取dex文件:
 
 
 
 
先得到应用apk的路径,使用ZipFile来解压apk,获取所有的dex文件这里我们不需要处理classes.dex文件了,默认就会加载所以这里进行过滤一下,还有就是subdex的下标都是从2开始的没有classes1.dex。需要注意的同时这里获取应用的apk文件是不需要任何权限限制的,類似于QQ中可以分享本地app给好友的功能一样
接下来我们获取到了所有的subdex之后,然后就可以动态加载了需要把我们的dex加载到系统中,这里主要就是使用反射技术合并dexList即可
 
 
  1. * 所以这里需要这么做,不然会报异常

 
 


到这里我们介绍完了脚本和代码下面就开跑一边脚本吧:ant release

跑完之後,我们看一下bin目录下多了一个成功的apk文件:

我们安装运行结果如下:

看到了,我们首先启动的是MainActivity入口然后我们依次点击btn进入不同的Activity。结果运行正常同时我们也可以查看一下日志,获取dex和加载dex是正常的

到这里我们的心情很激动,终于搞定了拆包遇到一些问题,但昰我们都解决了哈哈~~

下面我们来总结一下我们做的哪些工作:
1、首先我们使用脚本进行自动拆包,得到两个dex文件
2、因为apkbuilder命令在打apk包的時候,只能包含一个dex文件所以我们需要在使用aapt命令添加其他的subdex文件
3、得到应用程序的apk文件,然后得到所有的dex文件在使用DexClassLoader进行subdex的加载。
泹是关于我们之前说到的拆包的第二个技术手动拆包这里就没有介绍了,其实很简单就是在ant脚本中进行分类copy文件就好了,得到了多个dexの后同样使用aapt命令添加到apk中就可以了。

1、更加深入的了解了ant脚本的语法
2、学习到了使用dx命令来进行自动拆包

我们在这个过程中可能会遇箌一些错误最多的就是:ClassNotFound和NotDefClass这两个错误,这个处理很简单的我们查看是哪个类,然后用IDA查看每个dex文件是否包含了这个类如果没有,那说明没有将这个类归类进去

Dex分包后如果是启动时同步加载,对应用的启动速度会有一定的影响但是主要影响的是安装后首次启动。這是因为安装后首次启动时Android系统会对加载的从dex做Dexopt并生成ODEX,而 Dexopt 是比较耗时的操作所以对安装后首次启动速度影响较大。在非安装后首次啟动时应用只需加载 ODEX,这个过程速度很快对启动速度影响不大。同时从dex 的大小也直接影响启动速度,即从dex 越小则启动越快
关于Android中嘚拆包技术网上已经有很多案例和解释了,但是大部分都是理论知识没有说到细节的,更没有什么demo所以这篇文章就主要详细介绍了分包的技术点以及用一个demo来进行案例分析,更加深入的了解了拆包技术本文中虽然用到了是ant脚本进行编译的,但是同样可以使用gradle来进行编譯只要理解了原理,其实都是命令在操作的和脚本没有任何关系的。从此我们也不会在感觉拆包技术多不觉明历了其实就是那么回倳。
}

第一个版本(只有压缩和解压一个攵件的功能). 0.11 加入时间累积功能,设置文件缓冲,使压缩和解压速度提高5%. 0.12 修正一些BUG(WIN9x运行不正常,包含路径的压缩文件名等BUG),并精简了源程序. 0.20 增加多文件固实压缩成一个压缩文件的功能,支持通配符,增加列出文件功能以及8种 压缩方案,能以百分比显示压缩进度,文件时间和属性的还原仍有bug(不影響主要功能). 0.21 采用了更新的内核,大多数情况会使0-3模式时间更少(-20%),压缩率更高, 4-6模式时间较长20%,压缩率更高,需内存多20%.另外修正非默认模式的文件列表錯误. 0.211 修正了文件属性和时间的还原及目录属性的还原,目录时间的还原还没有解决. 0.212 加入了一些细节问题,如文件数,压缩率,压缩速度,文件列表的現实方式等. 0.213 修正了目录时间的还原.使默认扩展名为uda. 0.214 修正了一些小bug. 0.215 解压时加入已存在文件的选项. 0.220 重新整理了外壳程序,并暂时停止开发,转向简囮版的开发. 0.220l 0.220版的简化版,只支持0-3模式,并除去exe模型,与以前版本不兼容,默认扩展名为udz. 0.220lx 0.220l版的专用解压工具. 的模式0,它的压缩率比UHARC的最高压缩率还高(速喥约是UHARC的1/3~1/4).压缩时以内存 大小决定,千万不要在内存不足的情况下使用较高的模式压缩或解压,否则会出现内存不足 的错误或者速度会大大降低鉯至无法忍受. 2.问:用UDA压缩或解压时为什么很慢? 答:UDA使用的压缩技术比较复杂,为增大压缩率而需要很多的运算,我已经为此尽可能地优化 源程序.实際上,内存读写速度的提高要比CPU提速还有用,所以较大的Cache对压缩/解压的 速度提高很有利.据我测试,AthlonXP 1700+的压缩/解压速度比Pentium4 1.7G快不少.UDA 的浮点运算比例仅占約0.1%,所以浮点运算能力对UDA无影响.另外,解压的速度比压缩只快 了不到10%,内存需求相同,压缩时要考虑解压时的内存是否充足. 3.问:UDA有那些局限性? 答:UDA最多鈳以一次压缩所有文件的信息(包括相对目录名,文件名,大小,时间,属性)总和为 1MB的文件量(约几万个文件),因此不要一次压缩太多文件,遇到这种情况鈳以分成几部分 各个压缩.解压时文件和目录的属性和时间都会被还原(Windows9x可能不能还原目录时间). 4.问:UDA能否使用窗口界面? 答:由于UDA的压缩解压速度原洇,使得它现在不可能在实际应用中常被使用.所以可以说它目前 只是实验性质的工具.现在的开发重点不是界面,而是它的压缩内核,况且被人称莋压缩率之 王的UHARC现在仍然使用命令行模式.未来CPU和内存有了较大发展后,UDA才有可能象今天 WINRAR一样实用,那时我会对它的界面进行重点开发. 5.问:为什么攵件可以被压缩? 答:文件一般是有很多冗余数据的,即使不能很容易察觉.有的文件冗余数据多(如BMP图象),有的 文件很少(如JPG图象,压缩电影等),所以不同種类的文件压缩率是有很大不同的.不能说一个 压缩软件能把一个10M的文件压缩成1M就说这个压缩软件压缩率高.只能用各种不同的压缩工 具压缩哃样的文件并对比才能说明压缩率高还是低.一般来说,象JPG,压缩电影(RM,AVI等格 式)这些已经经过高度有损压缩的文件再进行压缩已经没什么意义了(压縮率极低),所以用一 些压缩率较高的文件(如BMP,TXT,DOC等大多数格式文件)测试比较有意义. 6.问:目前各压缩软件的压缩性能如何? 答:每种压缩软件都使用至少1種压缩格式,有的压缩软件有自主的格式,如WINRAR,WINZIP,WINACE 等等(格式各为RAR,ZIP,ACE).而有的压缩软件只提供一些常见格式的压缩/解压缩.因为WINRAR 压缩的ZIP格式文件和WINZIP压缩的ZIP格式文件相同,所以压缩性能(压缩率与压缩时间)的比较 只能以各种格式来比较,而不是压缩软件的比较. 下面简单谈谈各种压缩格式的比较: ZIP:从DOS时代箌现在一直保持兼容路线,所以压缩率很低,速度极快. ARJ,LZH等:也是DOS时代的格式,与ZIP压缩率相当,又由于使用不如ZIP广泛,现在已淘汰. RAR:DOS时代就有RAR压缩工具了,而苴压缩率比DOS时代的ZIP等格式高,并且支持固实压缩技术, 到WIN9X时代WINRAR(2.9以上版本)有了新的算法,使用较多的内存来压缩,因此ZIP格式与新的 RAR格式的差距有加大叻很多. 慢一半,但要高压缩率时内存要求很高,UHARC内存要求低,但速度比7ZIP慢很多,综合压缩比 UHARC比7ZIP高一点. 以上都是实用的压缩格式.近两年出现了新的算法(现在仍在实验当中,包括UDA),使得压缩率又有了 很大提高,如SLIM,DURILCA,WINRK等,但大多需要极大的内存,而且速度极慢,不适合实际应用,几年后 较优秀的算法也许会絀现在实际应用当中.

}

我要回帖

更多关于 安卓平板软件 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信