gradle 如何通过导入正确的库来避免DEX 64K LIMIT

jogvjijk  于 2022-11-14  发布在  其他
关注(0)|答案(6)|浏览(103)

我遇到了这个问题,在编译我使用的所有库时,我在Dalvik中溢出了64 k方法限制。我在导入支持库时开始遇到这个问题,因为一些库已经包含在其他库中,它最终溢出了限制。

是否有方法验证某个库在当前项目中是否未使用,或者是否已通过另一个库依赖项导入?

目前,我排除了那些我知道肯定,但似乎很奇怪,必须这样做的手。

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:multidex:1.0.1'
    compile "com.android.support:percent:${supportLibVersion}"
    compile("com.android.support:design:${supportLibVersion}") {
        exclude module: 'support-v4'
    }
    compile("com.android.support:cardview-v7:${supportLibVersion}") {
        exclude module: 'support-v4'
    }

    compile('com.github.nkzawa:socket.io-client:0.4.1') {
        exclude group: 'org.json', module: 'json'
    }
    compile('com.astuetz:pagerslidingtabstrip:1.0.1') {
        exclude module: 'support-v4'
    }
//...
}

目前的解决方案:

1.使用Gradle插件-我们不久前编写了一个非常易于使用的Gradle插件,它按包列出了方法的数量沿着总数。您可以在此处找到有关它的更多信息。
1.www.methodscount.com-想知道一个特定的库会给你的应用程序增加多少个方法吗?只要在这个网站上输入“compile”语句,它就会告诉你它的方法计数、依赖关系、JAR大小和DEX大小。
1.Android Studio插件-这款出色的插件可显示Android Studio中每个依赖项的方法计数。
1.使用MultiDex支持库如果您使用的是Android Studio,那么这个过程非常简单。如果您不是,我强烈建议您进行迁移,因为Google可能很快就会放弃对Eclipse ADT插件和旧的基于Ant的构建系统的支持。

步骤1

在您的构建版本中添加MultiDex支持库的依赖项。gradle

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

步骤2

通过在gradle配置的buildType或productFlavor部分中设置multiDexEnabled标志来启用多索引。

defaultConfig { 
   ... 
multiDexEnabled true 
... 
}

现在,根据您的项目,您有3个选项:

如果尚未创建自己的Application类,只需在AndroidManifest.xml中将android.support.multidex.MultiDexApplication声明为应用程序类

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

如果您已经有自己的Application类,请将其扩展为android.support.multidex.MultiDexApplication,而不是android.app.Application
如果您的Application类正在扩展某个其他类,而您不想或无法更改它,请按如下所示覆盖attachBaseContext():

public class MyApplication extends FooApplication { 
   @Override 
   protected void attachBaseContext(Context base) { 
      super.attachBaseContext(base); 
      MultiDex.install(this); 
   } 
}
z5btuh9x

z5btuh9x1#

您可以打开终端并运行命令gradlew app:dependencies来测试哪些依赖项已经作为项目的可传递依赖项包含在其他依赖项中,沿着每个依赖项的相应版本。
例如,我得到了我的一个项目的依赖关系图,该项目是com.android.support我使用的www.example.com:design库:

+--- com.android.support:design:23.3.0
|    +--- com.android.support:appcompat-v7:23.3.0
|    |    +--- com.android.support:support-vector-drawable:23.3.0
|    |    |    \--- com.android.support:support-v4:23.3.0
|    |    |         \--- com.android.support:support-annotations:23.3.0
|    |    +--- com.android.support:animated-vector-drawable:23.3.0
|    |    |    \--- com.android.support:support-vector-drawable:23.3.0 (*)
|    |    \--- com.android.support:support-v4:23.3.0 (*)
|    +--- com.android.support:support-v4:23.3.0 (*)
|    \--- com.android.support:recyclerview-v7:23.3.0
|         +--- com.android.support:support-v4:23.3.0 (*)
|         \--- com.android.support:support-annotations:23.3.0
sq1bmfud

sq1bmfud2#

嘿,你可以试试我魔术,也许对你有用
1.首先,你应该避免使用外部库。比如,库有相同的依赖项。所以,尝试将库与Android应用程序代码合并。这样可以为方法保存很多空间。
1.使用有用的依赖项和库,如如果你想要Google Play服务,然后只包括有用的服务,而不是所有.

compile "com.google.android.gms:play-services-location:9.4.0"
compile "com.google.android.gms:play-services-maps:9.4.0"

避免这种情况

compile 'com.google.android.gms:play-services:9.4.0'

1.删除不需要的依赖项。在代码中使用可选择的依赖项。
1.如果所有的东西都不是很好用,那么在你的代码中使用multidex。但是它会创建多个dex文件。所以,你的代码会花很多时间编译。
谢谢,希望这对你有帮助。

7ajki6be

7ajki6be3#

defaultConfig
 {    
     multiDexEnabled true 
 }

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

并将此方法添加到应用程序类中

@Override
protected void attachBaseContext(Context newBase) {

    super.attachBaseContext(newBase);

    MultiDex.install(this);
}
6gpjuf90

6gpjuf904#

单击文件然后单击项目结构单击弹出窗口左下方的应用程序。您将看到多个选项卡单击依赖项选项卡然后单击加上右上方的选择 * 库依赖项**搜索您想要的库,它将显示IDE中可用的那些库

r8xiu3jd

r8xiu3jd5#

虽然使用Multidex支持库解决了这个问题,但它并不完美。首先要做的是确定你的应用目前有多少个方法,以及每个依赖项添加了多少个方法。以前你必须手动完成这项工作,但现在有一堆工具可用:
1.使用Gradle插件-This是一个非常容易使用的Gradle插件,它按软件包列出了方法的数量沿着总数。您可以在here中找到有关它的更多信息。

  1. www.methodscount.com-只要在这个网站上输入‘compile’语句,它就会告诉你它的方法计数、依赖关系、JAR大小和DEX大小。
  2. Android Studio插件-这个优秀的plugin显示了Android Studio中每个依赖项的方法计数。
    无论您最终使用的工具是什么,都可以使用它提供的信息来审核应用的依赖项。您应该查找未使用的库,或者可以最小化甚至可以用您自己的更简单的解决方案替换的库。如果您没有使用Proguard来删除未使用的代码,请先启用它,然后查看它是否能解决问题使用Proguard很好......不是很有趣,但是一旦你设法使它正常工作,它将显著减少方法计数。如果所有其他方法都失败,你将不得不使用MultiDex支持库。
    查看gradle任务以剥离Google Play服务库中未使用的软件包。

结论

虽然Multidex Support Library在大多数情况下修复了DEX 64 K问题,但它应被视为最后的手段。在尝试使用它之前,您应该审核项目是否存在不需要的依赖项,并使用ProGuard删除尽可能多的未使用代码。如果您确实要使用它,请确保在旧设备上测试您的应用。
希望这对你有帮助。

ycggw6v2

ycggw6v26#

2022年是否有新的方法可以轻松计算方法/管理proguard规则?
Gradle dexinfo plugin ==〉自2016年以来无变更
Android studio plugin ==〉自2016年以来无变化
==〉离线:返回一个带有"呃,假设那里没有任何关于开发的内容“的网页**[Forbidden to -18]**

相关问题