不懂电影制作技术 未必做不好电影项目投资_励志网

不懂电影制作技术 未必做不好电影项目投资

2018-06-20 03:53 来源:励志网

在开始讲瘦身技巧之前,先来讲一下APK的构成。

在GradlePlugin2.2.0及以上版本ProGuard的配置文件会自动解压缩到${rootProject.buildDir}/${AndroidProject.FD_INTERMEDIATES}/proguard-files/目录下,proguardFiles会从这个目录来获取ProGuard配置。

这些优化技巧就不展开介绍了。

那么,现在新闻手机App软件开发现状如何?

明智科技认为,目前的新闻手机App软件开发有以下几个模式:

ProguardConfiguration是AAPT工具为Manifest中声明的四大组件以及布局文件中(XMLlayouts)使用的各种Views所生成的ProGuard配置,该文件通常存放在${project.buildDir}/${AndroidProject.FD_INTERMEDIATES}/proguard-rules/${flavorName}/${buildType}/aapt_rules.txt,下面是项目中该文件的截图,红框标记出来的就是对AndroidManifest.xml、XMLLayouts中相关Class的ProGuard配置。

pngcrush工具特别有效:此工具在PNG过滤器和zlib(Deflate)参数上迭代,使用过滤器和参数的每个组合来压缩图像。然后选择产生最小压缩输出的配置。

针对第一种套路,因各个公司的项目的差异,共性的东西较少,需要casebycase的分析,这里不做过多的介绍。

booleanisPNGWebpConvertSupported(){if(!isWebpConvertEnable()){returnfalse选择更优的压缩工具

文件/目录描述lib/ 存放so文件,可能会有armeabi、armeabi-v7a、arm64-v8a、x86、x86_64、mips,大多数情况下只需要支持armabi与x86的架构即可,如果非必需,可以考虑拿掉x86的部分 res/ 存放编译后的资源文件,例如:drawable、layout等等 assets/ 应用程序的资源,应用程序可以使用AssetManager来检索该资源 META-INF/ 该文件夹一般存放于已经签名的APK中,它包含了APK中所有文件的签名摘要等信息 classes(n).dex classes文件是JavaClass,被DEX编译后可供Dalvik/ART虚拟机所理解的文件格式 resources.arsc 编译后的二进制资源文件 AndroidManifest.xml Android的清单文件,格式为AXML,用于描述应用程序的名称、版本、所需权限、注册的四大组件 当然还会有一些其它的文件,例如上图中的org/、src/、push_version等文件或文件夹。这些资源是JavaResources,感兴趣的可以结合编译工作流中的流程图以及MergeJavaResourcesTransform的源码看看被打入APK包中的资源都有哪些,这里不做过多介绍。

如果想在Android6.0上开启android:extractNativeLibs=”false”的话,.so文件也不能被压缩,android:extractNativeLibs的使用姿势看这里:AppManifest---application。

点击图片查看大图

每次执行完ProGuard之后,ProGuard都会在${project.buildDir}/outputs/mapping/${flavorDir}/生成以下文件:

随着业务的快速迭代增长,最大本地生活服务公司美团App里不断引入新的业务逻辑代码、图片资源和第三方SDK,直接导致APK体积不断增长。包体积增长带来的问题越来越多,如CDN流量费用增加、用户安装成功率降低,甚至可能会影响用户的留存率。APK的瘦身已经是不得不考虑的事情。在尝试瘦身的过程中,美团借鉴了很多业界其他公司提供的方案,同时也针对自身特点,发现了一些新的技巧。本文将对其中的一些做详细介绍。

android{除了minifyEnabled属性外,还有用于定义ProGuard规则的proguardFiles属性:

请注意,代码压缩会拖慢构建速度,因此应该尽可能避免在调试构建中使用。不过一定要为用于测试的最终APK启用代码压缩,如果不能充分地自定义要保留的代码,可能会引入错误。

如果想知道哪些资源是无用的,可以通过资源压缩工具的输出日志文件${project.buildDir}/outputs/mapping/release/resources.txt来查看。如下图所示res/layout/abc_activity_chooser_viewer.xml就是无用的,然后被预定义的版本TINY_XML所替换:

资源的优化图片优化

APK的构成可以用Zip工具打开APK查看。比如,美团App7.8.6的线上版本的格式是这样的:

通过pmdcpd来检查重复的代码从而进行代码优化;

/*theseformatsarealreadycompressed,ordon'tcompresswell*/staticconstchar*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",".webm",".mkv"};可以看出AAPT在资源处理时对这些文件后缀类型的资源是不做压缩的,那是不是可以修改它们的压缩方式从而达到瘦身的效果呢?

资源压缩工具的详细使用可以参考ShrinkYourCodeandResources。资源压缩工具默认是采用安全压缩模式来运行,可以通过开启严格压缩模式来达到更好的瘦身效果。

3、入驻模式开发所谓入驻,便是需要借助现成的手机App平台,实现开发、发展自己的App.这种做法的优点就是快,无论是开发还是接下来的市场发展,速度都会比前两种效率要高。但是更容易出现同质化的问题,毕竟新闻App在内容上的竞争不多,更多的竞争是来自于App的架构设计以及UI设计。

Android的编译工具链中提供了一款资源压缩的工具,可以通过该工具来压缩资源,如果要启用资源压缩,可以在build.gradle文件中将shrinkResourcestrue。例如:

文件名描述dump.txt APK中所有类文件的内部结构 mapping.txt 提供原始与混淆过的类、方法和字段名称之间的转换,可以通过proguard.obfuscate.MappingReader来解析 seeds.txt 列出未进行混淆的类和成员 usage.txt 列出从APK移除的代码 可以通过在usage.txt文件中看到哪些代码被删除了,如下图中所示android.support.multidex.MultiDex已经被删除了:

在Android构建流程中AAPT会使用内置的压缩算法来优化res/drawable/目录下的PNG图片,但也可能会导致本来已经优化过的图片体积变大,可以通过在build.gradle中设置cruncherEnabled来禁止AAPT来优化PNG图片。

如果App的minSdkVersion高于14(Android4.0+)的话,可以选用WebP格式,因为WebP在同画质下体积更小(WebP支持透明度,压缩比比JPEG更高但显示效果却不输于JPEG,官方评测quality参数等于75均衡最佳),可以通过PNG到WebP转换工具来进行转换。当然Android从4.0才开始WebP的原生支持,但是不支持包含透明度,直到Android4.2.1+才支持显示含透明度的WebP,在笔者使用中是判断当前App的minSdkVersion以及图片文件的类型(是否为透明)来选用是否适用WebP。见下面的代码片段:

classes.dex的优化如何优化classes.dex的大小呢?大体有如下套路:

android{需要注意的是目前资源压缩器目前不会移除values/文件夹中定义的资源(例如字符串、尺寸、样式和颜色),有关详情,请参阅问题70869。

减少ENUM的使用(详情可以参考:RemoveEnumerations),每减少一个ENUM可以减少大约1.0到1.4KB的大小;

resources.arsc文件最好不要压缩存储,如果压缩会影响一定的性能(尤其是冷启动时间)。

appPlugin.variantManager.variantDataList.each{variantData->当然也可以在其它构建步骤中采用更高压缩率的方式来达到瘦身效果,例如采用7Zip压缩等等。

可以使用矢量图形来创建独立于分辨率的图标和其他可伸缩图片。使用矢量图片能够有效的减少App中图片所占用的大小,矢量图形在Android中表示为VectorDrawable对象。使用VectorDrawable对象,100字节的文件可以生成屏幕大小的清晰图像,但系统渲染每个VectorDrawable对象需要大量的时间,较大的图像需要更长的时间才能出现在屏幕上。因此只有在显示小图像时才考虑使用矢量图形。有关使用VectorDrawable的更多信息,请参阅WorkingwithDrawables。

然而,无论以哪种方式在做新闻App,都或多或少地出现共同的问题。新闻行业App以及实现了全天候的新闻及时更新,以丰富的资讯,个性化的订阅来取得用户的喜爱。大型的新闻App开发成功案例,如今日头条,腾讯新闻,一点资讯等,消息传播快速,也非常丰富。人们手机里有几个新闻的应用,国内外的时事基本也都掌握。但移动端的新闻大多是照搬电脑端,容易审美疲劳。以手机显示屏看适合电脑的编排,页面挤压的感觉很不好。

2、微信公众账号社交应用也是新闻App可倚靠的一个开发模式。例如微信,随着微信功能的不断开发以及手机用户的增长,现在已经有2.5亿的活跃用户,庞大的市场正在逐渐变得更加庞大。因此,新闻媒体可以通过搭建媒体公众号,实现新闻消息的推送。这个模式的有点便是制作成本是非常低,收效却比较高。缺点便是需要遵循公众号的游戏规则,有可能会降低了作为媒体该有的创新水平。

互联网让新闻消息不胫而走,但也只是在比较大的,吸引眼球的那些新闻。很多都是第二天便“消失”,而且也没有什么用户评论,更不说是转发或是有深入的跟踪了。新闻行业App的设计上,还是需要以用户体验为主。如使用简单的设计实现阅览新闻的需求,或是能在离线的状态下也能查看,为用户节省流量等。

#p#分页标题#e#CompiledResources是一个Zip格式的文件,这个文件的路径通常为${project.buildDir}/${AndroidProject.FD_INTERMEDIATES}/res/resources-${flavorName}-${buildType}-stripped.ap_。通过下面经过Zip解压后的截图,可以看出这个文件包含了res、AndroidManifest.xml和resources.arsc的文件或文件夹。结合BuildWorkflow中的描述,可以看出这个文件(resources-${flavorName}-${buildType}-stripped.ap_)会被apkbuilder打包到APK包中,它其实就是APK的“资源包”(res、AndroidManifest.xml和resources.arsc)。

在介绍怎么做之前,先来大概介绍一下App的资源是怎么被打进APK包里的。Android构建工具链使用AAPT工具来对资源进行处理,来看下图(图片来源于BuildWorkflow):

通过上图可以看出一个大概图片格式选择的方法。如果能用VectorDrawable来表示的话优先使用VectorDrawable,如果支持WebP则优先用WebP,而PNG主要用在展示透明或者简单的图片,而其它场景可以使用JPG格式。针对每种图片格式也有各类的优化手段和优化工具。

如果音视频资源被压缩存放在APK中的话,在使用一些音频、视频API时尤其要注意,需要做好充分的测试。

通过上图可以看到Manifest、Resources、Assets的资源经过AAPT处理后生成R.java、ProguardConfiguration、CompiledResources。其中R.java大家都比较熟悉,这里就不过多介绍了。我们来重点看看ProguardConfiguration、CompiledResources都是做什么的呢?

可以使用pngcrush、pngquant或zopflipng等压缩工具来减少PNG文件大小,而不会丢失图像质量。所有这些工具都可以减少PNG文件大小,同时保持图像质量。

开启ProGuard来进行代码压缩,通过使用ProGuard来对代码进行混淆、优化、压缩等工作。

aaptOptions{开启资源压缩

笔者在自己的项目中是通过在package${flavorName} Task(感兴趣的同学可以查看源码)之前进行这个操作的。

Android构建工具是通过ResourceUsageAnalyzer来检查哪些资源是无用的,当检查到无用的资源时会把该资源替换成预定义的版本。详看下面代码片段(摘自com.android.build.gradle.tasks.ResourceUsageAnalyzer):

通过上图可以看到APK中很多资源是以Stored来存储的,根据Zip的文件格式中对压缩方式的描述Compression_methods可以看出这些文件是没有压缩的,那为什么它们没有被压缩呢?从AAPT的源码中找到以下描述:

    移动互联网信息平台是目前基于移动互联网的最重要的信息平台,通过吸附各类开发者,服务商资源来吸引用户,以智能手机和个人电脑为平台的APP的开发和普及应用,正在为用户人们进入各种媒体内容设立了一个统一的入口(如,微博,微信,网易新闻),并在不同平台上实现了内容的有效对接,达成了某种一致性,媒体类APP呈现出强大的生命力。APP已成为了“媒介机信息”的最佳注脚。

移除掉所有无用或者功能重复的依赖库。

时刻保持良好的编程习惯和对包体积敏锐的嗅觉,去除重复或者不用的代码,慎用第三方库,选用体积小的第三方SDK等等。

getDefaultProguardFile(‘proguard-android.txt')是从AndroidSDKtools/proguard/文件夹获取默认ProGuard设置。

针对代码的瘦身还有很多优化的技巧,例如:

我们就是通过这个文件来修改不同后缀文件资源的压缩方式来达到瘦身效果的,而在后面“resources.arsc的优化”一节中也是操作的这个文件。

本技巧的使用需要注意以下问题:

下面是部分代码片段:

Zip格式优化前面介绍了APK的文件格式以及主要组成部分,通过aaptl-vxxx.apk或unzip-lxxx.apk来查看APK文件时会得到以下信息,见下面截图:

目前国内的新闻传播主要有三种模式,一是由媒体自身设计、定制开发App.只是把原先的pc端内容移到移动端中,实现手机应用的转化。可以个性化设置和更多功能的添加,独立App也容易增加成本。二是借用他人的平台来发展自己。这种新闻App寄人篱下,风险比较大。虽然传播有所提高,但缺乏自身的自由。三是设置自己的微信公众号,自媒体运营传播新闻资讯。只要做得好,就能聚拢粉丝,粘性高且成本低。尽管依赖的是微信这个通讯社交App,但比第二种模式自由很多。

可以看到APK由以下主要部分组成:

在充分了解了APK各个组成部分以及它们的作用后,我们针对自身特点进行了分析和优化。下面将从Zip文件格式、classes.dex、资源文件、resources.arsc等方面来介绍下我们发现的部分优化技巧。

提示:要想做进一步的代码压缩,可尝试使用位于同一位置的proguard-android-optimize.txt文件。它包括相同的ProGuard规则,但还包括其他在字节码一级(方法内和方法间)执行分析的优化,以进一步减小APK大小和帮助提高其运行速度。

1、独立模式开发这个模式应该很容易理解。所谓的独立,指的是这个新闻App应用由媒体经营方自主开发以及运营。新闻App帮助媒体运营商,将以往传统模式的内容以及品牌迁移到移动端,然后借助新闻手机客户端实现媒体自身的移动化的转型。独立模式开发的App的优点比较明显,媒体可以根据自己的需求,设计更加个性化的功能和页面交互的方式。在优点突出的同时,缺点也比较明显,就是这样开发的App的成本较高,以及拉升了市场的入门门槛高度。

ctBehaviors.each{CtBehaviorctBehavior->if(!ctBehavior.isEmpty()){try{其它优化手段

#p#分页标题#e#除了对项目代码优化和开启代码压缩之外,笔者在《美团AndroidDEX自动拆包及动态加载简介》这篇文章中提到了通过内联RField来解决RField过多导致MultiDex65536的问题,而这一步骤对代码瘦身能够起到明显的效果。下面是笔者通过字节码工具在构建流程中内联RField的代码片段(字节码的修改可以使用Javassist或者ASM,该步骤笔者采用的是Javassist)。

资源压缩工具只是把无用资源替换成预定义较小的版本,那我们如何删除这些无用资源呢?通常的做法是结合资源压缩工具的输出日志,找到这些资源并把它们进行删除。但在笔者的项目中很多无用资源是被其它组件或第三方SDK所引入的,如果采用这种优化方式会带来这些SDK后期维护成本的增加,针对这种情况笔者是通过采用在resources.arsc中做优化来解决的,详情看下面“resources.arsc的优化”一节的介绍。

可以通过开启ProGuard来实现代码压缩,可以在build.gradle文件相应的构建类型中添加minifyEnabledtrue。

例如,下面这段来自build.gradle文件的代码用于为发布构建启用代码压缩:

为了支持Android设备DPI的多样化([l|m|tv|h|x|xx|xxx]dpi)以及用户对高质量UI的期待,美团App中使用了大量的图片,在Android下支持很多格式的图片,例如:PNG、JPG、WebP,那我们该怎么选择不同类型的图片格式呢?在GoogleI/O2016中提到了针对图片格式的选择,来看下图(图片来源于ImagecompressionforAndroiddevelopers):

对于JPEG文件,你可以使用packJPG或guetzli等工具将JPEG文件压缩的更小,这些工具能够在保持图片质量不变的情况下,把图片文件压缩的更小。guetzli工具更是能够在图片质量不变的情况下,将文件大小降低35%。

广州App开发专家表示,随着人们开始重视对时间碎片的利用,手机App的价值得到了有效的提升。每个人都需要了解、学习更多的知识,并通过各种渠道认识这个社会、这个世界。新闻App软件的出现,恰恰是抓住了人们的利用时间碎片学习的习惯,通过新闻手机App可以展现各种各样的新闻资讯。 

proguard-rules.pro文件用于添加自定义ProGuard规则。默认情况下,该文件位于模块根目录(build.gradle文件旁)。

publicclassResourceUsageAnalyzer{#p#分页标题#e#上面截图中3个byte数组的定义就是资源压缩工具为无用资源提供的预定义版本,可以看出对.png提供了TINY_PNG,对.9.png提供了TINY_9PNG以及对.xml提供了TINY_XML的预定义版本。

责编: