Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >如何让 HelloWorld.apk 体积最小

如何让 HelloWorld.apk 体积最小

作者头像
mzlogin
发布于 2020-04-16 02:57:06
发布于 2020-04-16 02:57:06
1.3K0
举报
文章被收录于专栏:闷骚的程序员闷骚的程序员

按照最新 ADT 的默认设置(如下图所示)创建一个最简单的 HelloWorld 程序,会发现最后生成的 apk 文件大小就已经达到了惊人的 903KB。如果只是想做一个功能非常简单的 APP,体积也这么大的话那太让人沮丧了,那我们就来探索一下如何让这个 HelloWorld.apk 体积最小。

(注:本文所述方法是以牺牲新的 API 为代价的。)

默认生成的 apk 文件大小(903KB):

移除 appcompat_v7 依赖

创建一个 Minimum Required SDK 低于 API level 11(对应 Android 3.0),Target SDK 高于 API Level 11 的工程,ADT 会自动生成一个名为 appcompat_v7 的库工程并且使你的工程依赖于它。关于 appcompat_v7 的作用,可以参见http://developer.android.com/tools/support-library/features.html#v7,大概就是说有一系列的 v7 xxx 库,比如 v7 appcompat library、v7 cardview library、v7 gridlayout library 等,都是用于为 Android 2.1(API level 7)或者更高的系统提供一些功能,其中 v7 appcompat library 是提供 Action Bar 相关的界面风格的支持,比如它里面包含了 ActionBar、ActionBarActivity 和 ShareActionProvider 等关键类。

所以如果纯出于精简 apk 体积的考虑,那就可以将 appcompat_v7 依赖库移除。

移除步骤如下:

  1. 从 HelloWorld 工程设置中移除库依赖 右键 HelloWorld 工程 –> Properties –> Android 在如下对话框的 Library 部分选中 appcompat_v7,并点击 Remove。
  1. 解决由第 1 步操作带来的各种错误 做完第 1 步以后,Eclipse 会报各种错,根据提示逐一解决即可。 错误提示 ActionBarActivity cannot be resolved to a type 解决方案 默认生成的 MainActivity 继承自 ActionBarActivity,将其改为 Activity,并将 import android.support.v7.app.ActionBarActivity; 移除,添加 import android.app.Activity; 错误提示 R cannot be resolved to a variable 解决方案 出现这个提示一般是 xml 文件里出错导致无法自动生成 R.java 文件,根据 Eclipse 在 Package Explorer 里提示的小红叉,逐一排查修改。 res/values/style.xml 文件里提示 error: Error retrieving parent for item: No resource found that matches the given name 'Theme.AppCompat.Light'. 将 <style name="AppBaseTheme" parent="Theme.AppCompat.Light"> 改为 <style name="AppBaseTheme" parent="android:Theme.Light"> 同理,将 res/values-v11/style.xml 和 res/values-v14/style.xml 里的AppBaseTheme分别改为android:Theme.Holo.Lightandroid:Theme.Holo.Light.DarkActionBar。 res/menu/main.xml 文件里提示 error: No resource identifier found for attribute 'showAsAction' in package 'org.mazhuang.android.helloworld' 将该文件里的 app:showAsAction="never" 删除。 至此,工程应该能重新编译过了。

此时编译生成的 apk 文件大小(380KB):

不导出 android-support-v4.jar

相对一个 HelloWorld 程序而言,380KB 仍然是太大了。

在 Package Explorer 里能看到 Android Private Libraries 里有一个 android-support-v4.jar。这是一个庞大的包,关于它的作用可以参考http://developer.android.com/tools/support-library/features.html#v4。它提供了能用于 Android 1.6(API level 4)及以上系统的许多功能集,比如界面、数据处理和网络连接等。做一个复杂程序的时候它会很有用,但是如果只是一个非常简单功能的 apk,而且暂时并未用到里面的 API,可以不将其打包进 apk 以精简大小,有需要的时候再将其加进来。

不导出方法:

右键 HelloWorld 工程 –> Properties –> Java Build Path –> Order and Export

取消 Android Private Libraries 前面的勾。

然后 Clean 和 Refresh 工程,再看生成的 HelloWorld.apk 的大小(45KB):

这个大小大致可以接受啦!

(注:如果关闭 workspace 后重新打开,这个取消导出会重新被勾选中,如果确定使用不导出方案,那么可在 Package Explorer 视图中该工程下 libs 里找到 android-support-v4.jar,右键删除之。)

影响

当然程序精简带来的影响也是很明显的。

  1. 大小 原始 移除 appcompat_v7 移除 android-support-v4.jar 903KB 380KB 45KB 可不可以只不导出 android-support-v4.jar 而继续依赖 appcompat_v7 呢?答案是不可以,在http://developer.android.com/tools/support-library/features.html#v7的 Note 中显示 v7 appcompat library 是依赖 v4 support library 的。
  2. API 有大量实用的 API 用不了了,比如非常重要的 Fragment,要么将 minSdkVersion 改为 API level 11 以上使用android.app.Fragment,要么需要依赖 android-support-v4.jar 使用android.support.v4.app.Fragment。如果只使用android.support.v4.app.Fragment而不 Export android-support-v4.jar,那么程序在手机上将崩溃,提示 java.lang.NoClassDefFoundError: android.support.v4.app.Fragment
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2014/12/31,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
如何让 HelloWorld.apk 体积最小
按照最新 ADT 的默认设置(如下图所示)创建一个最简单的 HelloWorld 程序,会发现最后生成的 apk 文件大小就已经达到了惊人的 903KB。如果只是想做一个功能非常简单的 APP,体积也这么大的话那太让人沮丧了,那我们就来探索一下如何让这个 HelloWorld.apk 体积最小。
零式的天空
2022/03/28
7390
Android开发笔记(八十二)SDK版本兼容
Android控件很多属性都有默认值,比如文字默认黑色、编辑框默认透明背景等等,但因为android是开源的,各厂商都会自行修修补补,所以很多时候默认值并不靠谱。举例如下: 1、在某些低版本的Android上,如不指定文字颜色textColor,则默认的文字颜色是白色; 2、编辑框有的默认透明背景加一根底线,有的默认白色圆角背景; 3、主题Theme.Holo默认是浅灰背景,但有的品牌手机上改成了深灰背景; 4、调用View的getDrawingCache方法对指定控件截图,默认背景是黑色,而不是我们在UI上看到的透明背景,是不是很惊讶?所以截图前要先设置好背景色。 所以,为了让app在不同设备上都是一样的显示风格,就得自己设置期望的各种属性值,另外也尽量不用系统自带的主题,如有可能自定义主题风格,这样即使设备厂商修改了默认属性值,app也仍然保持统一的风格。
aqi00
2019/01/18
1.1K0
3.Android-ADT之helloworld项目结构介绍
放项目的源代码的。而MainActivity.java文件则对应helloworld界面代码,代码如下所示:
诺谦
2019/12/19
5010
升级Android支持库版本遇到的两个问题
公司项目之前support Library 版本比较混乱,各moudle有好几个版本的v7包和v4包,而且版本还比较低,今天抽时间统一了下支持库以及buildToolsVersion等的版本,但是遇到了两个问题,记录一下。 1. 升级buildToolsVersion至26 最新的buildToolsVersion已经到26了,照之前方式,直接在build文件中将buildToolsVersion后的引用版本改为26.0.2,然后同步,发现编不过去,提示: [failed to find build too
coderZhen
2018/06/28
7020
Android Support Library主要库详细介绍
  网上对Android Support Library中各个依赖包介绍的中文资料太少了,结合官方文档和有限的参考资料做了一次总结,有描述得不对的地方还请指正。
open
2020/03/19
1.3K0
Android Support Library主要库详细介绍
安卓基础(十五)[通俗易懂]
目标人群:没有基础的安卓刚開始学习的人 知识点:在Android Studio中使用support V7包来实现ActionBar的效果 目标:在页面上显示一个ActionBar
全栈程序员站长
2022/07/08
4950
实现Android APK瘦身99.99%
让我们将这一原则应用到 Android App 开发中。我们将玩转一个称为“ApkGolf”的 APK,目的是创建一个尽可能具有最少字节数的 App,并可安装在运行 Oreo 的设备上。
Android技术干货分享
2019/06/13
2K0
Android 沉浸式状态栏的多种样式
和尚我最近正在处理客户端顶部沉浸式展示图片,借此整理了一下和尚自己研究测试的沉浸式状态栏。 沉浸式状态栏大家都很熟悉,即 APP 界面图片延伸到状态栏, 应用本身沉浸于状态栏,即顶部不会默认展示系统的黑条。和尚我技术有限,理解不透彻,仅分享一下自己应用测试中可以呈现的几种样式。
阿策小和尚
2019/08/12
1.5K0
Android 沉浸式状态栏的多种样式
连Action Bar都不会 你能说你学过 Android?
本文原创首发CSDN,链接 https://blog.csdn.net/qq_41464123/article/details/106605555 ,作者博客https://blog.csdn.net/qq_41464123 ,转载请带上本段文字,尤其是脚本之家、码神岛等平台,谢谢配合。
Designer 小郑
2023/08/01
4290
连Action Bar都不会 你能说你学过 Android?
跟我学Android UI高级之十五碎片Fragment
做Demo的问题, android.support.v4.app.Fragment和android.app.Fragment区别 ​1.最低支持版本不同​ ​​Android​​.app.Fragment 兼容的最低版本是android:minSdkVersion="11" 即3.0版 android.support.v4.app.Fragment 兼容的最低版本是android:minSdkVersion="4" 即1.6版 ​2.需要导jar包​ fragment android.support.v4.app.Fragment 需要引入包android-support-v4.jar ​3.在Activity中取的方法不同​ android.app.Fragment使用 (ListFragment)getFragmentManager().findFragmentById(R.id.userList) 获得 ,继承Activity android.support.v4.app.Fragment使用 (ListFragment)getSupportFragmentManager().findFragmentById(R.id.userList) 获得 ,需要继承android.support.v4.app.FragmentActivity. -------------------------------------------------------------------------------------------------------------------------------------------------------- 动态添加碎片的步骤: 1.创建待添加的碎片对象; 2.获取FragmentManager的对象,使用getFragmentManager()方法得到; 3.开启一个事务,通过调用beginTransaction()方法开启. 4.向容器内加入碎片,一般使用replace()方法开启,需要传入容器的id和待添加的碎片对象; 5.提交事务,调用commit()方法来完成。 在碎片中模拟返回栈,注意方法:addToBackStack(null);
张哥编程
2024/12/17
1320
跟我学Android UI高级之十五碎片Fragment
一个优秀的Android应用从建项目开始
1.项目结构 现在的MVP模式越来越流行。就默认采用了。 如果项目比较小的话: app——Application Activity Fragment Presenter等的顶级父类 config——API,常量表等 model——数据层 entities——数据模型 presenter——MVP的P service——服务 ui——MVP的V utils——工具类集合 widget——各个可复用View集合 如果项目比较大,上面的方式一定会造成presenter和view里近百个文件。看瞎眼系列。推荐下列方
非著名程序员
2018/02/02
8840
一个优秀的Android应用从建项目开始
Head First Android Toolbar
上一节我们介绍了ActionBar的使用,这一节我们介绍ActionBar 的替代者——Toolbar,看看它有多大的能耐!
宅男潇涧
2018/08/01
9860
Head First Android Toolbar
1.ActionBar
ActionBar 低版本和高版本用法不同 低版本: 1. 引用v7-appcompat 2. Activity继承ActionBarActivity 3. android:theme="@style/Theme.AppCompat.Light" > 高版本: 1. Activity自带actionBar 2.从Android3.0(APIlever11)开始,所有使用Theme.Holo主题(或者它的子类)的activity都包含了actionbar,当 targetSdkVersion或min
六月的雨
2018/05/14
1K0
【Android 应用开发】 ActionBar 样式详解 -- 样式 主题 简介 Actionbar 的 icon logo 标题 菜单样式修改
转载请著名出处 : http://blog.csdn.net/shulianghan/article/details/39269163
韩曙亮
2023/03/27
3.4K0
【Android 应用开发】 ActionBar 样式详解 -- 样式 主题 简介 Actionbar 的 icon logo 标题 菜单样式修改
Translucent System Bars-4.4新特性
该特性是在Android 4.4 KITKAT版本(API_19)中引入的新特性。
小小工匠
2021/08/16
4710
Head First Android ActionBar
最近在Android Studio中新建项目时发现Activity还是和以前一样,默认继承自ActionBarActivity,但是ActionBarActivity 却被标示为已经过时的API!对于这个问题,StackOverflow上已经有人回答了,请看ActionBarActivity deprecated,然后你会发现自从Android的兼容支持库升级到21版本以后(appcompat-v7-r21.1.0),ActionBarActivity 被 AppCompatActivity 取代了!还有一个变化是建议使用Toolbar,而不要使用原来的ActionBar 了!所以,这两节的内容我打算总结下ActionBar和Toolbar的基本使用,因为Toolbar实际上是ActionBar的扩展,所以这一节还是介绍复杂的ActionBar,下一节再继续介绍Toolbar。
宅男潇涧
2018/08/01
8020
Head First Android ActionBar
首页-底部&顶部Tab导航(菜单栏)的实现:TabLayout+ViewPager+Fragment
Android开发中使用顶部 & 底部Tab导航栏的频次非常高,主要的实现手段有以下:
Carson.Ho
2019/02/22
4.3K0
第14章 使用Kotlin 进行 Android 开发(1)第14章 使用Kotlin 进行 Android 开发(1)
根据Realm Report (2017-Q4,https://realm.io/realm-report/2017-q4 ) ,过去的一年在Android 端的开发:Java 从 95% 降低到 Java 85%, 而 Kotlin 从 5% 涨到 15% ,如下图所示
一个会写诗的程序员
2018/08/17
2.9K0
第14章 使用Kotlin 进行 Android 开发(1)第14章 使用Kotlin 进行 Android 开发(1)
Android开发笔记(一百一十九)工具栏ToolBar
在前面的博文《Android开发笔记(二十)顶部导航栏》中,我们学习了ActionBar的用法,可是ActionBar着实是不怎么好用,比如文字风格不能定制、图标不能定制,而且还存在低版本的兼容性问题,所以实际开发中大家还是不倾向使用ActionBar。为此,Android提供了加强版的工具栏控件即Toolbar,因为Toolbar继承自ViewGroup,而且可在布局文件中像其它布局视图一样使用,所以灵活性大大的提高了。既然Android都与时俱进了,那我们也不能落后,现在就来好好学学Toolbar的用法。
aqi00
2019/01/18
2.1K0
TextInputLayout-Android M新控件
Google I/O 2015 ,谷歌意识到向后兼容是实现material design的重要部分。当然support library,比如appcompat-v4 和 appcompat-v7是解决方案的一部分。
小小工匠
2021/08/16
9570
推荐阅读
相关推荐
如何让 HelloWorld.apk 体积最小
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档