Android支持multidex库实现

时间:2014-11-14 07:47:33

标签: android android-gradle android-library dex

我已达到魔法dex限制,因为我的应用程序使用了大量的jar(驱动器api,greendao,文本到pdf,支持..)。

我目前的解决方案是,我真的创建了第二个apk,仅用于谷歌驱动器,我从主apk调用。但现在我发现android最终支持这个库。我的问题只是我不知道如何实现它(最好没有gradle)。我找不到任何好的教程。

Okey我正在试图实现这一点而失去理智......我发现了这个: http://blog.osom.info/2014/10/multi-dex-to-rescue-from-infamous-65536.html

我补充道:

 android:name="android.support.multidex.MultiDexApplication"

到我的清单文件和

protected void attachBaseContext(Context base) {
     super.attachBaseContext(base);
     MultiDex.install(this);
}

到我的mainactivity.java

还为eclipse安装了gradle插件,导出gradle以获取build.gradle文件,我改为:

apply plugin: 'android'

dependencies {
    compile fileTree(dir: 'libs', include: '*.jar')
    compile project(':android-support-v7-appcompat')
    compile project(':Sync')
    compile project(':gdrive:google-play-services_lib')
}


android {
    compileSdkVersion 14
    buildToolsVersion "21.1.1"


    sourceSets {
        main {
            manifest.srcFile 'AndroidManifest.xml'
            java.srcDirs = ['src-gen','src']
            resources.srcDirs = ['src-gen','src']
            aidl.srcDirs = ['src-gen','src']
            renderscript.srcDirs = ['src-gen','src']
            res.srcDirs = ['res']
            assets.srcDirs = ['assets']
        }

        // Move the tests to tests/java, tests/res, etc...
        instrumentTest.setRoot('tests')

        // Move the build types to build-types/<type>
        // For instance, build-types/debug/java, build-types/debug/AndroidManifest.xml, ...
        // This moves them out of them default location under src/<type>/... which would
        // conflict with src/ being used by the main source set.
        // Adding new build types or product flavors should be accompanied
        // by a similar customization.
        debug.setRoot('build-types/debug')
        release.setRoot('build-types/release')
    }

    dexOptions {
      preDexLibraries = false
   }
}

afterEvaluate {
   tasks.matching {
      it.name.startsWith('dex')
   }.each { dx ->
      if (dx.additionalParameters == null) {
         dx.additionalParameters = ['--multi-dex']
      } else {
         dx.additionalParameters += '--multi-dex'
      }
   }
}

但错误仍然相同:(

4 个答案:

答案 0 :(得分:19)

博客是旧解决方案。

使用Android Studio 0.9.2&amp; Gradle Plugin 0.14.1,你只需要:

  1. 添加到AndroidManifest.xml:

  2. android:name="android.support.multidex.MultiDexApplication" 
    

    添加

    MultiDex.install(this);
    

    在自定义应用程序的attachBaseContext方法

    或您的自定义应用扩展MultiDexApplication

    1. 在build.gradle中添加multiDexEnabled = true
    2. android {
          defaultConfig {
              ...
              multiDexEnabled = true
          }
      }
      

      完成。

      抱歉我的英语不好

      相关资源:

      http://developer.android.com/tools/building/multidex.html

      https://plus.google.com/+XavierDucrohet/posts/1FnzwdcBnyC

答案 1 :(得分:16)

你需要做的一些事情,

1-在您的gradle中,您需要指定multidex并添加支持库:

android {
    defaultConfig {
        ...
        multiDexEnabled true
        ...
    }
}

dependencies {
  ...
  compile 'com.android.support:multidex:1.0.0'
  ...
}

2-在您的清单中,您必须将应用程序设置为multidex应用程序:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.package.name">
    <application
        ...
        android:name="com.package.name.my_application">
        ...
    </application>
</manifest>

3.1-在您的应用程序类中,您必须扩展MultiDexApplication

public class my_application extends MultiDexApplication
{
    ...
}

3.2-或覆盖attachBaseContext()方法:

public class my_application extends Application
{
    protected void attachBaseContext(Context base)
    {
        super.attachBaseContext(base);
        MultiDex.install(this);
    }
}
  

multidex支持库的限制

     

multidex支持库有一些已知的限制,您应该注意并测试它们何时将其合并到您的应用程序构建配置中:

     
      
  • 在启动时将.dex文件安装到设备的数据分区上很复杂,如果辅助dex文件很大,可能会导致应用程序无响应(ANR)错误。在这种情况下,您应该使用ProGuard的代码缩小技术来最小化dex文件的大小并删除未使用的代码部分。
  •   
  • 由于Dalvik linearAlloc错误(问题22586),使用multidex的应用程序可能无法在运行早于Android 4.0(API级别14)的平台版本的设备上启动。如果您的目标API级别低于14,请确保使用这些版本的平台执行测试,因为您的应用程序在启动时或加载了特定的类组时可能会出现问题。代码缩减可以减少或可能消除这些潜在问题。
  •   
  • 由于Dalvik linearAlloc限制(问题78035),使用进行大量内存分配请求的multidex配置的应用程序可能会在运行时崩溃。 Android 4.0(API级别14)的分配限制有所增加,但在Android 5.0(API级别21)之前的Android版本上,应用可能仍会遇到此限制。
  •   
  • 在Dalvik运行时执行时,主要dex文件中需要哪些类有复杂的要求。 Android构建工具更新处理Android需求,但其他包含的库可能还有其他依赖性要求,包括使用内省或从本机代码调用Java方法。在更新multidex构建工具之前,某些库可能无法使用,以允许您指定必须包含在主dex文件中的类。
  •   

资源:http://developer.android.com/tools/building/multidex.html

答案 2 :(得分:2)

根据https://developer.android.com/studio/build/multidex.html#avoid

的文件
  

如果您的minSdkVersion是21岁及以上,您需要做的只是

android {
    defaultConfig {
        ...
        minSdkVersion 21 
        targetSdkVersion 25
        multiDexEnabled true
    }
    ...
}
  

如果你的minSdkVersion是20或更低,你需要使用支持   文库

android {
    defaultConfig {
        ...
        minSdkVersion 15 
        targetSdkVersion 25
        multiDexEnabled true
    }
    ...
}

dependencies {
  compile 'com.android.support:multidex:1.0.1'
}

同时

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.myapp">
    <application
            android:name="android.support.multidex.MultiDexApplication" >
        ...
    </application>
</manifest>

答案 3 :(得分:1)

更新:

如果您使用的是androidX,则可以使用以下代码:

implementation 'androidx.multidex:multidex:2.0.1'

所有Google Maven的引用,您可以在其中搜索Google的工件:
https://maven.google.com/web/index.html