note8怎么ipad同时连接鼠标键盘盘

Android最佳实践 —— 详细谈谈如何减小APK体积
这是我们项目组安卓主力总结的如何减小APK体积的文章,很详细,有很多大家平时不注意的技巧,分享下转载请注明出处: /soaringEveryday/p/5254520.html 随着Android移动开发的需求越来越复杂,我们不可避免的遇到发布出去的apk体积越来越大的问题,目前超过10MB、20MB的apk已经是很常见的事情了,但是依然能够看到一些apk的体积控制的很小。apk体积增大源于:新需求不断的提出需要支持高分辨率的屏幕而加入了高分图片依赖了更多的第三方库本文将从我自己的经历项目中探讨如何有效减小apk的体积。减小Apk体积是一件很有用处的android优化手段,降低了用户需要下载的比特数,同时也降低了分发安装时失败的概率。 将apk解压后发现,体积占大头的分辨是lib文件夹、res文件夹和dex文件。所以我们的降低apk体积的策略也应当从如何缩减so文件、资源图片、控制代码质量上来入手。 使用Progruard Proguard是Android很早就使用的代码混淆工具,除了用于混淆代码提高安全性以外,他在代码编译的时候也会通过遍历代码的方式来发现没有被调用的代码,从而将其在打包成apk时剔除,最终一定程度上降低了apk的大小。但是Proguard使用时候是要注意的,因为代码中利用反射机制的地方会被Proguard工具破坏,所以要慎重的编写混淆例外文件,同时对于混淆后打包出来的apk要重新充分回归测试下。 使用Android Lint Proguard提供了代码的缩减方式,而Lint对于res下面的资源进行了充分的优化,他会提供一份报告给你,从而通知你哪些资源没有被用到,显然剔除这些资源是可以减少apk体积的。这些资源包括res文件夹下所有的内容,比如图片、字串、尺寸等等。现在Android Lint已经集成到了Android Studio中,用法很简单。进入Android Studio的菜单中选择Analyze-&Inspecting Code即可 分析完毕后在Inspection选项卡中会有一份详细的报告,找到Android Lint项目 拉到下面Unused resource这一栏打开,即是未被使用的资源列表,用户可以参照来手动删除资源 清理Assert文件夹Assert文件夹经常会放置一些不被编译的资源,时间久了,里面可能一些文件或者资源已经不用了,然而这个文件夹也是会被打包到apk里面的。所以定期清理这个里面的内容也是减小apk体积的重要一步。 用代码代替图片开发的时候有些地方能用代码做出来的就尽量不用图片来渲染,这样子可以减少图片资源的数量从而减少体积,这里举几个例子。用shape代替背景图用RotateDrawable代替仅仅是方向不同的“内容相同”的图片用layer-list来制作多层图片从而达到复用使用属性动画而不是多图片连续播放的帧动画用shape代替背景图很多背景图比如按钮的背景、纯色背景都是可以用shape来制作的,这样子仅用xml代码就代替了png资源。比如这么要给按钮背景图(纯色背景、带边框、圆角)可以用shape而不是Png图片来制作&?xml version="1.0" encoding="utf-8"?&&selector xmlns:android="/apk/res/android"& &item&&shape& &stroke android:width="0.5dp" android:color="@color/white"/& &gradient android:startColor="#ffffff" android:endColor="#ffffff" android:angle="0.0" /& &corners android:topLeftRadius="4dp" android:topRightRadius="0dp" android:bottomLeftRadius="4dp" android:bottomRightRadius="0dp" /&&/shape& &/item&&/selector& 用RotateDrawable代替仅仅是方向不同的“内容相同”的图片这里两个图片是两个按钮箭头,但是仅仅方向不同而已,其实可以只用其中一个图片即可,而另一个用RotateDrawable来让其“调转”180度&?xml version="1.0" encoding="utf-8"?&&rotate xmlns:android="/apk/res/android" android:drawable="@drawable/ic_arrow_left" android:fromDegrees="180" android:pivotX="50%" android:pivotY="50%" android:toDegrees="180" /& 用layer-list来制作多层图片从而达到复用有些需求中需要一种图片,但是明显这个图片是其他几个图片简单叠加而已,那么可以使用layer-list来达到目的&?xml version="1.0" encoding="utf-8"?&&layer-list xmlns:android="/apk/res/android"& &item&&!-- 最底层的图片,以x,y轴坐标为中心进行旋转--&&rotate android:pivotX="0" android:pivotY="0"android:fromDegrees="-10" android:toDegrees="-10"& &bitmap android:src="@drawable/chatting_bg_default_thumb"/& &/rotate& &/item& &!-- 第二层的图片,以x,y轴坐标为中心进行旋转--& &item&&rotate android:pivotX="0" android:pivotY="0"android:fromDegrees="15" android:toDegrees="15"& &bitmap android:src="@drawable/chatting_bg_purecolor_thumb"/&&/rotate& &/item& &!-- 最上层的图片,以x,y轴坐标为中心进行旋转--& &item&&rotate android:pivotX="0" android:pivotY="0"android:fromDegrees="35" android:toDegrees="55"& &bitmap android:src="@drawable/mark"/&&/rotate& &/item&&/layer-list& 使用属性动画而不是多图片连续播放的帧动画这里就不过多解释了,比如你做一个图片的旋转,通过属性动画即可用代码搞定。如果你要用多张图片“连续播放”的话,那要用很多张预备图片才行,无疑加大了apk的体积 放弃一些图片资源我们知道Android是支持多分辨率的,提供了多套图片适配的机制,我们根据不同尺寸的屏幕来放入多套的图片,比如ldpi、mdpi、hdpi、xhdpi等。但是实际上有些图片你可能是不需要放置的。对于ldpi,系统会自动的将hdpi的图片缩放到达到目的,所以你就不需要把ldpi的图片拷贝到你的res文件夹下了有些分辨率的图片你可能是用不到的,比如ldpi和xxxhdpi。前者的手机目前很少了,而后者是针对2k屏幕的,目前还没有普及开。所以对于这点,你可以考虑下是否需要放入这两套图片资源此外,我们所引入的第三方包中可能也引用了资源图片,但是其中的某些我们可能是不想要的,比如ldpi和xxxhdpi,那么是否可以设置什么东西来让打包的时候剔除他们呢?是可以的,可以配置下build.gradledefaultConfig { // ... resConfigs "en", "de", "fr", "it" resConfigs "hdpi", "xhdpi", "xxhdpi"}defaultConfig提供了resConfig这个flavor来指定打包出只打包某些资源,比如字串、图片等等 压缩图片图片从美工那边拿到的时候是比较漂亮的,但是代价是size通常也高居不下,我们可以用一些工具来“近乎无损”的缩小图片资源,同时不降低图片效果。这里推荐pngquant这个工具,可以参考我的上篇博客/soaringEveryday/p/5148881.html so的优化我们在接入百度地图的时候,发现需要引入很多很多so这些so文件占了很多大体积,如果你不加控制,所有的so都会打包到你的apk了,最后发现这些so文件尽然占了我们apk的近乎三分之一的体积。然而考虑下我们的用户,基本都是跑在手机上的(没有人跑在模拟器上),所以明显x86和x86_64的so是不需要支持,那么我们可以通过配置gradle来制定只打包某些so,依然是在defualtConfig中:defaultConfig {... ...ndk { //设置支持的SO库架构 abiFilters 'arm64-v8a', 'armeabi' //, 'x86', , 'x86_64', 'arm64-v8a'} }最后打包出来的apk真的是减少了好几个MB,这是太好了 当然如果有一些so是你们自己开发的,那么可以参考这个文章来参考如果用ndk开发的时候减少so本身的体积,这里就不过多介绍了/android-ndk-how-to-reduce-libs-size/ 对第三方库进行重新定制(重新打jar包) 开发中引入大量的第三方开发库也是一个增加apk体积的重要原因,因为你把人家的代码和资源全给包含进来了。但是想想人家的代码,并不一定全要的,是否可以只引入人家的一部分代码,而不是在build.gradle中仅仅添加一行“compile”来全部依赖呢?答案是可以得!这里举一个例子我们开发中有一个需求是将数据通过图标的方式显示出来,这里我们站在巨人的肩膀上,使用了MPAndroidChart这个优秀的开源项目(/PhilJay/MPAndroidChart),但是发现他们的东西太多了,我们仅仅需要使用其中一种chart。如果在build.gradle里面加一句:dependencies { compile 'com.github.PhilJay:MPAndroidChart:v2.2.3'}这要把他们的库全给引用过来了。想到他们是开源的,代码有,所以我们仅仅把他们的我们所用到的代码给剥离出来,单独打包了一个jar包引入到我们的项目里面,就OK了,减少了大量的无用依赖代码! 动态加载技术(插件化)现在大型互联网移动App很多都采用了动态加载的技术,因为他们的业务需求太大,通过动态加载技术可以将一部分业务模块独立出来,以插件的方式分割出去,这样子主apk的体积就大大减小。当用户安装主apk后,静默的在后台下载插件apk,当用户点击使用到相关的子模块项目时候,动态的加载插件apk。 动态加载技术无疑从根本上减少了apk的体积,但是引入这个技术是有代价的,增加了项目的维护难度和开发难度。所以该技术适用于大型的移动应用,当你的业务大到不分开模块难以高效率开发维护的时候,再考虑动态加载技术吧,否则如果小规模应用,还是老老实实考虑传统的android官方推荐的开发方式。这里推荐几个比较好的动态加载开源框架项目供大家研究dynamic-load-apk360DroidPlugin
分享给朋友:
您可能感兴趣的文章:
随机阅读: 上传我的文档
 下载
 收藏
该文档贡献者很忙,什么也没留下。
 下载此文档
正在努力加载中...
Android Package和签名详解(PPT)
下载积分:750
内容提示:Android Package和签名详解(PPT)
文档格式:PPT|
浏览次数:11|
上传日期: 01:56:43|
文档星级:
全文阅读已结束,如果下载本文需要使用
 750 积分
下载此文档
该用户还上传了这些文档
Android Package和签名详解(PPT)
官方公共微信android studio 怎么没有assert目录?
大文件要放哪- - ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 网友回复:
android studio 怎么没有assert目录?
【android studio 怎么没有assert目录?】
请将本文分享给你的朋友:
android studio 怎么没有assert目录? 的相关文章
------分隔线----------------------------
北京联盟郑重声明:本文仅代表作者个人观点,与北京联盟无关。其原创性及文中陈述内容未经本站证实,北京联盟对本文及其中全部或者部分内容的真实性、完整性、及时性不作任何保证和承诺,请网友自行核实相关内容。&&& 前阵子,在研究如何将exe文件打包到apk文件中,然后当apk升级时将exe文件复制粘贴到其他目录下。但是在粘贴exe文件时,抛出异常Data exceeds UNCOMPRESS_DATA_MAX。查找相关文献后,发现android对资源文件的大小有限制(有些文献说只有android2.3之前的版本才有文件大小的限制?),不超过1M,否则将抛出异常。
&&& 解决的办法有三种:
1.将你的资源文件后缀改成下面列出的后缀。
  /* these formats are already compressed, or don't compress well */
  static const char* kNoCompressExt[] = {
  ".jpg", ".jpeg", ".png", ".gif",
  ".wav", ".mp2", ".mp3", ".ogg", ".aac",
  ".mpg", ".mpeg", ".mid", ".midi", ".smf", ".jet",
  ".rtttl", ".imy", ".xmf", ".mp4", ".m4a",
  ".m4v", ".3gp", ".3gpp", ".3g2", ".3gpp2",
  ".amr", ".awb", ".wma", ".wmv"
2.在命令行上使用-0参数来指定不需要压缩的文件后缀。但是如果你是使用Eclipse,目前还不知道有什么方法可以传递-0参数给aapt。
3.将你的资源文件分割成UNCOMPRESS_DATA_MAX(1M)以下的文件.
&&& 在windows下要下载一个文件分割器,linux下就比较简单
&&& 用split 命令即可
Linux命令:split
功能说明:切割文件。&&
语 法:split [--help][--version][-&行数&][-b &字节&][-C &字节&][-l &行数&][要切割的文件][输出文件名]
补充说明:split可将文件切成较小的文件,预设每1000行会切成一个小文件。
参 数:-&行数&或-l&行数& 指定每多少行就要切成一个小文件。 -b&字节& 指定每多少字就要切成一个小文件。 -C&字节& 与-b参数类似,但切割时尽量维持每行的完整性。 --help 显示帮助。 --version 显示版本信息。 [输出文件名] 设置切割後文件的前置文件名,split会自动在前置文件名後再加上编号。
&&& 例如:split -b 640k& id.db&&&&& 执行后产生两个文件,xxa,xxb
&&& 如果使用分割文件的办法,可能还需要考虑小文件再合成大文件~
参考文献:
&&&&&&&&&&&&& &
阅读(...) 评论()温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
1.开发安卓环境的搭建2.关于安卓开发3.Unity调用安卓的各种问题&1. 安卓开发环境的搭建,在这里随便装了个Eclipse和ADK那些杂七杂八的,这个是真的很简单,网上的资料非常多,这里我可以很负责任地略过,随便参照网上的一个环境搭建,跑一个安卓的 Hello World,就OK了,下面随便给出两篇作为参考&&&2. 看了一下安卓开发的入门资料,对安卓的开发有一个大概的了解,理解了几个简单的概念,Activity,Intent,R.java,AndroidManifest.xml&Activity 是活动,相当于一个窗口,配置为MAIN的Activity也相当于main函数&Intent 表示意图,例如我希望从这个Activity切换到另外一个Activity,这就是一个意图,这里简单理解为窗口切换的一个中介吧&R.java 是Eclipse自动生成的一个类,用来索引资源,在res目录下的添加任何资源都会在这里生成一个索引,它的好处是不容易写错资源名字,导致找不到资源,这个类也经常出问题,后面会提及&AndroidManifest.xml 是安卓应用程序的配置文件,配置了程序有哪些Activity,哪个是入口,需要哪些权限等等&3.进入主题了!&在开始调用任何安卓代码之前,确保你可以把你的程序编译成安卓的apk,在安装完安卓环境之后,Unity需要进行一些设置才可以编译,第一次编译需要设置ADK的目录,打开Preferences设置&&如果你运气够好的话,在编译的时候就可以发现第一个错误,我的Unity是3.5的,它要求Android4.0的ADK,下载4.0的ADK后可以编译,这里经过验证,打包出来的apk是可以在安卓2.0上面运行的,关于目标机器的最低安卓版本,可以在PlayerSettings-&Minnimum API Level设置&&点击OK然后在弹出的窗口中选择ADK的路径即可,我的路径是下图,Unity会在platforms下面找相关的文件&&打开File-&Build Settings-&Android-&Build会生成apk文件,将apk安装到手机或者虚拟机,然后可以运行查看效果。不要直接点右三角来运行你的程序了,调用安卓的代码是执行不了的(听说有一个插件可以直接在PC上面调试,但未曾用过)&好了,现在可以开始编写安卓代码了,以宣雨松的那个demo为例子&&步骤如下:1.创建Android 项目&2.导入Unity的classes.jar(这里他只说了mac下的方法,win下我的目录是&Unity\Editor\Data\PlaybackEngines\androidplayer\bin)&3.编写代码和相关的XML(这一点他把代码都贴出来了,可以直接复制)&4.Build安卓项目,在bin/classes目录下打包所有class成jar 在该目录下执行&jar&-cvf&class.jar&*5.将打包好的class.jar 放到Assert目录下的 Plugins/Android 下,可以是任意名字和目录,Unity会在这里查找所有的jar作为插件,另外将安卓项目的res文件夹以及AndroidManifest.xml拷贝到Plugins/Android目录下&6.编写调用Java的测试脚本,并拖到场景中的对象上(直接拖到摄像机上面就可以了)&7.设置好程序的PlayerSettings,Identification Bundle Identifier*,设置为你的包名(我猜想,不设置这里,在AndroidManifest设置Activity的android:name,在类名前加上完整的包名应该是可以的)&8.Build编译成apk,然后安装到手机或者虚拟机上,运行,查看Log cat&中间遇到了N个问题:&1.项目出现红色的叉叉,代码资源都没错误Problems窗口出现一个错误&Unparsed aapt error(s)! Check the console for output.&&更新ADT后问题解决,因为更新了ADK,导致ADK和ADT的版本冲突&&2.项目出现红色感叹号,源码和资源都没有问题,经过排查得出是引用的jar包的问题,重新配置一下jar包,clean一下,红色感叹号消失&&&3.R.java文件丢失的问题,此问题比较常见,引入的第三方库有问题(不存在,重复引用等),res资源文件出错等等,会导致R.java丢失,修复问题后Clean一下项目会重新生成R.java&4.运行时闪退的问题,这一般是java的运行时错误导致,在Log cat可以看到错误信息 Unable to start activity ComponentInfo ...... 这一行是错误的原因,这里的原因是空指针&&5.引用到了其他jar包,在打包成apk之前需要把引用到的jar包一起放到Unity工程的Android目录下,不然会找不到&关于代码的理解:1. currentActivity 在Unity代码中我们通过&AndroidJavaObject jo = jc.GetStatic&AndroidJavaObject&("currentActivity");来获取当前的活动,这里的"currentActivity"表示当前的活动&2. setContentView 这个函数会传入一个布局的ID,这个一般对应一个layout.xml配置文件,当调用这个函数的时候,会根据布局配置文件来初始化界面3.关于classes.jar 这里的classes.jar是封装了class文件一个包,类似于win下的dll,linux下的so,这里包的名字是随意的,但包的位置一定要在Andorid目录下
阅读(2605)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
在LOFTER的更多文章
loftPermalink:'',
id:'fks_',
blogTitle:'u3d_调用android java',
blogAbstract:'转&
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}}

我要回帖

更多关于 ipad连接蓝牙鼠标键盘 的文章

更多推荐

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

点击添加站长微信