Multidexing android 应用程序的缺点
Disadvantages in Multidexing the android application
最近读到有关Dalvik 65K 方法限制的内容。我了解到方法调用列表只能调用前 65536 个方法引用。
为了解决这个问题,我们有许多解决方案。其中之一是多索引,我们使用 android 的支持库将 .dex 文件拆分为 类 [classes.dex、classes1.dex ...] 的数量。
我未能理解的是,android 应用程序由于这种多重索引而遭受什么缺点,为什么我们应该付出很多努力来尽量减少引用方法的数量。
基本上在我的理解中,为了减少方法数,我必须减少模块化,这让我的代码可读性稍差,除了剥离第三方库代码所花费的时间。减少方法数 值得吗??
主要缺点是 dex/apk 尺寸较大。 Dex 文件具有在该 dex 文件中的所有 类 之间共享的常量池。当 类 被拆分成多个 dex 文件时,这些共享常量必须在每个使用它们的 dex 文件中复制。
您对 multidex 想得太多了,您应该通过分析您的应用程序来观察并确定您的应用程序是否存在任何性能问题。
多索引几乎不会增加任何代码大小,主要的大小和性能问题与 animation/image/audio/video 资源有关,它们会增加大小并降低性能。
包括许多第三方库最终将超过 64k 限制,今天几乎所有应用程序都是多索引的,用户今天需要多功能应用程序,这需要与许多第三方库集成。
只有当你进行 animation/game 编程时,速度最重要,更多的方法调用可能是有害的,但这与 multidexing 无关,即使是写得不好的小型非 multidexing 应用程序也会在任何设备。
启动时间会影响多索引,但肯定可以通过更改您的应用程序逻辑以延迟加载其他昂贵的库和资源来改善。
Is reducing the method count worth it??
否
理想情况下,您应该使用更多方法并将代码模块化,因为移动应用程序发布后测试和更改是巨大的挑战。调试和消除错误比 multidex 大小及其对性能的影响成本更高。由于小屏幕、不同品牌、不同 UI,与计算机相比,用户对 phone 上的应用程序更生气。如果将代码分成多个单独的测试库,那么满足用户需求将变得更加容易。
Multidexing 本身是一个不良术语,如果应用程序是 multidex,则意味着执行应用程序的 android 内部进程有负担。
每个 android 应用程序都在一个进程(任务)中运行,当它是 multidexed 时,这意味着该进程被分成多个部分,这将在小型 android 处理器上产生性能问题,无论你是怎么写代码的。
我同意 aakash kava 的观点,几乎所有的应用程序都是多索引的,因为现在 android 处理器的性能非常好并且 android RAM 非常好,但这并不意味着我们应该忽略多索引。
一般来说,multidex 的缺点是:增加 APK 大小,可能会降低应用程序启动速度和增加内存占用。
原因是有些数据(例如StringData)不能共享,因此需要同时部分存储在多个DEX文件中。 StringData 由从代码加载的字符串文字以及 class、方法和字段名称组成,通常占整个 DEX 文件的 20%。
但是实际的缺点(除 APK 大小外)在很大程度上取决于 Android 您使用的 运行 应用程序的版本。
Google 优化了 Android 运行时 (ART) 以消除这些缺点。 AndroidO(API26)引入了VDEX容器来存储预验证的DEX文件。 With Android P Google 进一步优化了预编译器(代号 CompactDex),并在 VDEX 容器中添加了共享数据部分,以对多个 DEX 文件中使用的数据进行去重。因此,在 Android P 运行时 运行 多索引应用程序时几乎没有 none 缺点。
最近读到有关Dalvik 65K 方法限制的内容。我了解到方法调用列表只能调用前 65536 个方法引用。 为了解决这个问题,我们有许多解决方案。其中之一是多索引,我们使用 android 的支持库将 .dex 文件拆分为 类 [classes.dex、classes1.dex ...] 的数量。
我未能理解的是,android 应用程序由于这种多重索引而遭受什么缺点,为什么我们应该付出很多努力来尽量减少引用方法的数量。
基本上在我的理解中,为了减少方法数,我必须减少模块化,这让我的代码可读性稍差,除了剥离第三方库代码所花费的时间。减少方法数 值得吗??
主要缺点是 dex/apk 尺寸较大。 Dex 文件具有在该 dex 文件中的所有 类 之间共享的常量池。当 类 被拆分成多个 dex 文件时,这些共享常量必须在每个使用它们的 dex 文件中复制。
您对 multidex 想得太多了,您应该通过分析您的应用程序来观察并确定您的应用程序是否存在任何性能问题。
多索引几乎不会增加任何代码大小,主要的大小和性能问题与 animation/image/audio/video 资源有关,它们会增加大小并降低性能。
包括许多第三方库最终将超过 64k 限制,今天几乎所有应用程序都是多索引的,用户今天需要多功能应用程序,这需要与许多第三方库集成。
只有当你进行 animation/game 编程时,速度最重要,更多的方法调用可能是有害的,但这与 multidexing 无关,即使是写得不好的小型非 multidexing 应用程序也会在任何设备。
启动时间会影响多索引,但肯定可以通过更改您的应用程序逻辑以延迟加载其他昂贵的库和资源来改善。
Is reducing the method count worth it??
否
理想情况下,您应该使用更多方法并将代码模块化,因为移动应用程序发布后测试和更改是巨大的挑战。调试和消除错误比 multidex 大小及其对性能的影响成本更高。由于小屏幕、不同品牌、不同 UI,与计算机相比,用户对 phone 上的应用程序更生气。如果将代码分成多个单独的测试库,那么满足用户需求将变得更加容易。
Multidexing 本身是一个不良术语,如果应用程序是 multidex,则意味着执行应用程序的 android 内部进程有负担。
每个 android 应用程序都在一个进程(任务)中运行,当它是 multidexed 时,这意味着该进程被分成多个部分,这将在小型 android 处理器上产生性能问题,无论你是怎么写代码的。
我同意 aakash kava 的观点,几乎所有的应用程序都是多索引的,因为现在 android 处理器的性能非常好并且 android RAM 非常好,但这并不意味着我们应该忽略多索引。
一般来说,multidex 的缺点是:增加 APK 大小,可能会降低应用程序启动速度和增加内存占用。
原因是有些数据(例如StringData)不能共享,因此需要同时部分存储在多个DEX文件中。 StringData 由从代码加载的字符串文字以及 class、方法和字段名称组成,通常占整个 DEX 文件的 20%。
但是实际的缺点(除 APK 大小外)在很大程度上取决于 Android 您使用的 运行 应用程序的版本。
Google 优化了 Android 运行时 (ART) 以消除这些缺点。 AndroidO(API26)引入了VDEX容器来存储预验证的DEX文件。 With Android P Google 进一步优化了预编译器(代号 CompactDex),并在 VDEX 容器中添加了共享数据部分,以对多个 DEX 文件中使用的数据进行去重。因此,在 Android P 运行时 运行 多索引应用程序时几乎没有 none 缺点。