怎样减少 Android 应用包 60% 的大小

作者&投稿:夹秆 (若有异议请与网页底部的电邮联系)
如何减小android应用的apk文件大小~

一、 工具集介绍
安卓压缩工具集提供了一个极为简洁的方法,能够比安卓原有的Zip提供更高压缩比的存储应用内的so文件 (后期版本还可以支持压缩动态加载的jar包,以及游戏资源文件),同时提供了应用内网络更新下载压缩文件的方法,使得应用可以将部分so存储到云端,减小应用的尺寸。

最高节省50%空间!



在云测平台上测试了158款终端,涵盖2.3到4.4多个系统版本,100%通过


100%通过测试!




8M文件1s内解压


压缩原理: 压缩工具会把所有的so使用LZMA算法压缩到assert目录,应用在第一次启动的时候,会解压到应用的私有目录下

二、 工具集组成
工具集为一个安装程序,建议安装在默认路径下,安装在program files下在win7可能有读写权限的问题导致一些异常

安装后,你可以看见4个目录,此目录内都含有源码。
安装后的四个目录如下

其中 ApkLibComrepss 为java命令行程序的源码,在此目录的bin子目录中,你可以找到ApkCompress.jar ,使用这个文件可以把一个普通的apk文件转换为压缩的apk文件
CompressDemo为一个样例代码,你可以参考这个代码知道如何整合压缩的SDK。
DecRawso是压缩的SDK,你的开发工程需要引用这个SDK,并进行一些源码上的修改,才能整合压缩的功能
RawsoCreator为windows下的转换工具, 这个工具一般无需使用, 仅仅在调试和二次开发压缩SDK的时候使用。
三、 如何整合压缩SDK
打开CompressDemo,我们以这个工程为例子讲解如何整合压缩SDK
1. 首先需要引入DecRawso工程

2. 然后需要在你的工程内最初始的地方调用DecRawso.NewInstance。在此demo工程内,是在MainActivity.java的OnCreate内调用了此方法, 此方法是创建了一个解压的唯一实例。注意:此方法是异步的,所以你可以传入一个handler接受异步解码完成的消息,如果同时传入参数showProgress=true,SDK内会产生一个进度对话框以阻塞主进程。不推荐使用DecRawso.NewInstance(mContext,null,false);的方式,此方式不接受任何消息,且无进度对话框,解压会在后台自动完成,并且在应用第一次load so的时候阻塞直到后台解压完成。所以如果阻塞时间过长,可能会导致应用无响应。
3. 修改load so文件的方法:所有的System.loadlibrary(***)改为 System.load(DecRawso.GetInstance().GetPath(“***"));
新版本, 这步可以省略了,sdk会修改system的libaray加载路径,一般情况下,系统升级不会出问题 (非正规代码,小概率会随android升级修改新的代码),如果方便的话,还是采用System.load(DecRawso.GetInstance().GetPath(“***"))

经过这几个简单的步骤,压缩的SDK已经整合到工程内了。

网上找了一下有两种方法:
1、直接拿到data目录下对应的包,然后用File.length()方法获得。然后会发现和设置里显示的大小不同。
2、通过反射调用设置里源码的方法获得PackageStats类的实例。
两种方法都不想用...
后来自己找到解决办法:
PackageManager类有个getPackageSizeInfo方法如下:
复制代码 代码如下:
public abstract void getPackageSizeInfo(String packageName,
IPackageStatsObserver observer);

只是这个方法是hide的。
自己编译一下的android2.3的Framework框架,把jar包拷出来,只需要把框架导入到library,设置在默认的android的lib之上遍可以优先使用自己编译的框架了,其实也就是让自己应用层能调用框架中的接口。
framework下载:点击此处
下载好后,通过添加lib后把classes.jar添加到此lib中,如图:

然后将自己的lib up到sdk提供的Android2.3.3之上。注意不能直接使用Add External JARs直接导入。

下面就是直接使用方法了。
代码如下:
pm.getPackageSizeInfo(packageInfo.packageName,
new IPackageStatsObserver.Stub() {
public void onGetStatsCompleted(PackageStats stats,
boolean succeeded) {
Log.v("King", stats.codeSize);
Log.v("King", stats.dataSize);
Log.v("King", stats.cacheSize);
}
});

第一个参数是包名,想必大家都能拿到。
第二个参数是实现AIDL生成的JAVA接口的匿名内部类。在回调方法里即可处理程序大小数据。
stats.codeSize:应用程序大小
stats.dataSize:数据大小
stats.cacheSize:缓存大小
一般大家可能都是用listView去显示每个应用的大小,而调用getPackageSizeInfo方法是不能立刻拿到值的,所以要和其他数据异步显示。

可以通过handler讲数据发送出去后,然后调用Adapter的notifyDataSetChanged()方法更新显示应用大小。
也许你还想点击每一项可以可以直接跳转到设置里的应用管理界面,而不自己去写卸载、清除缓存等方法。设置源码的方法如下,可以搬过来照样用:
代码如下:
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS,Uri.fromParts("package",包名 ,null));
// start new activity to display extended information
startActivityForResult(intent, 1);

一、 工具集介绍
安卓压缩工具集提供了一个极为简洁的方法,能够比安卓原有的Zip提供更高压缩比的存储应用内的so文件 (后期版本还可以支持压缩动态加载的jar包,以及游戏资源文件),同时提供了应用内网络更新下载压缩文件的方法,使得应用可以将部分so存储到云端,减小应用的尺寸。

最高节省50%空间!

在云测平台上测试了158款终端,涵盖2.3到4.4多个系统版本,100%通过

100%通过测试!

8M文件1s内解压

压缩原理: 压缩工具会把所有的so使用LZMA算法压缩到assert目录,应用在第一次启动的时候,会解压到应用的私有目录下

二、 工具集组成
工具集为一个安装程序,建议安装在默认路径下,安装在program files下在win7可能有读写权限的问题导致一些异常

安装后,你可以看见4个目录,此目录内都含有源码。
安装后的四个目录如下

其中 ApkLibComrepss 为java命令行程序的源码,在此目录的bin子目录中,你可以找到ApkCompress.jar ,使用这个文件可以把一个普通的apk文件转换为压缩的apk文件
CompressDemo为一个样例代码,你可以参考这个代码知道如何整合压缩的SDK。
DecRawso是压缩的SDK,你的开发工程需要引用这个SDK,并进行一些源码上的修改,才能整合压缩的功能
RawsoCreator为windows下的转换工具, 这个工具一般无需使用, 仅仅在调试和二次开发压缩SDK的时候使用。
三、 如何整合压缩SDK
打开CompressDemo,我们以这个工程为例子讲解如何整合压缩SDK
1. 首先需要引入DecRawso工程

2. 然后需要在你的工程内最初始的地方调用DecRawso.NewInstance。在此demo工程内,是在MainActivity.java的OnCreate内调用了此方法, 此方法是创建了一个解压的唯一实例。注意:此方法是异步的,所以你可以传入一个handler接受异步解码完成的消息,如果同时传入参数showProgress=true,SDK内会产生一个进度对话框以阻塞主进程。不推荐使用DecRawso.NewInstance(mContext,null,false);的方式,此方式不接受任何消息,且无进度对话框,解压会在后台自动完成,并且在应用第一次load so的时候阻塞直到后台解压完成。所以如果阻塞时间过长,可能会导致应用无响应。
3. 修改load so文件的方法:所有的System.loadlibrary(***)改为 System.load(DecRawso.GetInstance().GetPath(“***"));
新版本, 这步可以省略了,sdk会修改system的libaray加载路径,一般情况下,系统升级不会出问题 (非正规代码,小概率会随android升级修改新的代码),如果方便的话,还是采用System.load(DecRawso.GetInstance().GetPath(“***"))

经过这几个简单的步骤,压缩的SDK已经整合到工程内了。


芳村区17847143448: 如何快速删除安卓手机的程序安装包和应用程序 -
氐贩外用: 1. 打开主菜单选择设置2. 在设置中选择应用3. 选择你需要停止的应用4. 点击强行停止,同时可能会弹出一个警告,点确定即可5. 确定完成 就可以彻底停止这个应用运行了6. 点击卸载即可卸载这个应用

芳村区17847143448: 安卓app怎么缩小安装包的体积 -
氐贩外用: 加固重新打包会在一定程度上减少安装包的体积.app开发完后,最好做一下扫描和加固,应用扫描可以通过静态代码分析、动态数据跟踪,定位出风险代码,同时监控敏感数据的异常行为.加固可以在一定程度上保护自己核心代码算法,提高破解/盗版/二次打包的难度,缓解代码注入/动态调试/内存注入攻击等.目前市面上有很多第三方加固的平台, 如果新应用发布前需要扫描或者加固的话,可以先试试免费的,例如腾讯御安全,建议自己先去扫描测试下.

芳村区17847143448: 安卓系统,自带软件安装包怎么删除? -
氐贩外用: 1,装个安卓优化大师,给权限,选择精简系统,把需要删除的系统文件删了就可以2,用re管理器,给权限,re里的r/w 读写权限打开,进去system/app,把要删的apk删了 别删错喔,变砖后果自负~3,用91助手连接电脑,按提示给权限,用91助手删系统文件

芳村区17847143448: 如何一键清除Android内置软件 -
氐贩外用: 你手机里的内置软件有多少?你会用那些软件吗?根据市场调研机构Frost&Sullivan针对手机内置软件的调查发现,将近一半的用户偶尔会用其中的几个,其余的用户则几乎从来不用.超过1/3的用户往往从心理上对内置软件存在抗拒之意,最让...

芳村区17847143448: 如何减小Android APK包体大小方法总结 -
氐贩外用: 去掉图片资源里面不需要的图片,打包进行混淆打包,这样会自动去掉未引用的资源进行打包,特别注意是用不上的so文件,一定要删除,有的so很大会很占资源,更复杂的还有腾讯的做法,资源文件的处理等

芳村区17847143448: 如何让安卓手机禁止安装所有APP -
氐贩外用: 让安卓手机禁止安装所有APP的具体步骤如下: 我们需要准备的材料分别是:手机. 以OPPO R11为例: 1、首先我们打开手机中的文件管理器,下拉点击打开“system文件夹”. 2、然后我们在弹出来的窗口中点击打开APP文件夹中的“packageinstaller.apk”. 3、然后我们长按packageinstaller.apk文件,选择重命名,之后删除该文件的后缀名,点击确定即可.

芳村区17847143448: 如何减小android应用的apk文件大小 -
氐贩外用: 一、 工具集介绍 安卓压缩工具集提供了一个极为简洁的方法,能够比安卓原有的Zip提供更高压缩比的存储应用内的so文件 (后期版本还可以支持压缩动态加载的jar包,以及游戏资源文件),同时提供了应用内网络更新下载压缩文件的方法,...

芳村区17847143448: 手机自带的软件安装包怎么删除的?安卓的手机 -
氐贩外用: 这个在手机上的就是能直接删除的,就是长按,然后会有个小叉啥的,或者就是会抖动啥的,然后直接删了就行了,也比较省事的,自己可以先用手机安装个应用宝,打开手机的USB调试,在应用宝的工具箱里也能直接删除这个的呢,很省事的

芳村区17847143448: 如何给手机内部应用程序再瘦瘦身 -
氐贩外用: 一、清理大型应用程序的缓存数据1、通过清理程序的缓存文件,释放的内存空间会让你喜出望外2、进入手机设置选项,选择 设置>应用程序 >管理应用程序3、按一下Menu键,选择“按大小排序”选项(如果是Android 2.2手机先要选择已...

芳村区17847143448: 怎么禁止安卓手机安装软件?请问删除哪个文件,谢谢! -
氐贩外用: 这不是删文件夹的事情.首先你需要获取root权限,如果没有root权限就没办法了. 有了root权限以后,手机上安装一个link2SD,同意root申请.然后找到一个叫“应用包安装程序”“应用包权限访问工具”这样的系统组件删除即可.不同的手机组件的名字可能不同, 不过我要提醒你的是,这么做有风险的,你最好会刷机,这样的话手机一旦出问题还有救.否则就麻烦了.

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网