A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

1黑马币
1. 关于65535限制通常一个APK文件中包含一个Dex文件,而一个Dex文件允许的最大方法数是65535。当APK很大,方法数很多时,可以将一个APK文件拆分为多个Dex的方式。 #### 2. 如何避免65535问题及MultiDex限制条件  
(1)使用MultiDex方式
Android5.0之前的机制是Dalvik运行时(Dalvik Runtime),依赖库multidex support library作为主Dex的一部分用于管理从Dex
Android5.0及以后的机制是ART运行时(ART Runtime),ART运行时在程序安装阶段进行预编译,将所有Dex文件预编译为.oat文件
MultiDex使用方法如下:
在build.gradle中进行如下配置
  1. android {
  2. compileSdkVersion 21
  3. buildToolsVersion "21.1.0"

  4. defaultConfig {
  5. ...
  6. minSdkVersion 14
  7. targetSdkVersion 21
  8. ...

  9. // Enabling multidex support.
  10. multiDexEnabled true
  11. }
  12. ...
  13. }
  14. dependencies {
  15. compile 'com.android.support:multidex:1.0.0'
  16. }
复制代码

然后配置Application
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  3.     package="com.example.android.multidex.myapplication">
  4.     <application
  5.         ...
  6.         android:name="android.support.multidex.MultiDexApplication">
  7.         ...
  8.     </application>
  9. </manifest>
复制代码

或者extends MultiDexApplication,并在attachBaseContext() 方法中添加MultiDex.install(this)
(2)动态加载(后续研究)
限制条件:multi support library在某些情况下可能存在问题,如:
  • 当从Dex过大时,在某些设备上安装时会引起ANR
  • 在Android4.0之前的设备上可能无法启动程序,必须减少方法数
  • 在Android5.0之前如果存在过大内存分配的case,根据Dalvik线性内存分配限制,会导致crash
  • 关于主Dex应包含哪些类会有复杂的需求
3. 开发小技巧通常MultiDex都是很耗时的,因为构建系统会花较多时间来决定哪些类放在主Dex,哪些类放在从Dex。平常开发过程中,可以充分利用Android5.0的ART运行时方式进行开发,不过需要用5.0以上的设备。
ART运行时只进行如下操作:
  • 预分包阶段,将每个module构建成一个Dex文件
  • 将所有Dex文件按原样封装到APK
  • 不需要花时间重新决定哪些放到主Dex,哪些放到从Dex这一过程,因此节约很多时间
配置过程如下,平常构建dev即可,发布时使用prod:


  1. android {
  2. productFlavors {
  3. // Define separate dev and prod product flavors.
  4. dev {
  5. // dev utilizes minSDKVersion = 21 to allow the Android gradle plugin
  6. // to pre-dex each module and produce an APK that can be tested on
  7. // Android Lollipop without time consuming dex merging processes.
  8. minSdkVersion 21
  9. }
  10. prod {
  11. // The actual minSdkVersion for the application.
  12. minSdkVersion 14
  13. }
  14. }
  15. ...
  16. buildTypes {
  17. release {
  18. runProguard true
  19. proguardFiles getDefaultProguardFile('proguard-android.txt'),
  20. 'proguard-rules.pro'
  21. }
  22. }
  23. }
  24. dependencies {
  25. compile 'com.android.support:multidex:1.0.0'
  26. }
复制代码

IDE中可以先Sync一下工程,再在Build Variant选择特定的包进行构建:


4. 测试使用MultiDexTestRunner进行测试(在Gradle1.1之前,需要添加下面的dependencies),先进行配置:
  1. android {
  2.   defaultConfig {
  3.       ...
  4.       testInstrumentationRunner "com.android.test.runner.MultiDexTestRunner"
  5.   }
  6. }

  7. dependencies {
  8.     androidTestCompile('com.android.support:multidex-instrumentation:1.0.1') {
  9.         exclude group: 'com.android.support', module: 'multidex'
  10.     }
  11. }
复制代码

再在MultiDexTestRunner的onCreate方法中添加如下代码:
  1. public void onCreate(Bundle arguments) {
  2.     MultiDex.install(getTargetContext());
  3.     super.onCreate(arguments);
  4.     ...
  5. }
复制代码




0 个回复

您需要登录后才可以回帖 登录 | 加入黑马