Step 1. Add the JitPack repository to your build file
Add it in your root settings.gradle at the end of repositories:
dependencyResolutionManagement {
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
repositories {
mavenCentral()
maven { url 'https://jitpack.io' }
}
}
Add it in your settings.gradle.kts at the end of repositories:
dependencyResolutionManagement {
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
repositories {
mavenCentral()
maven { url = uri("https://jitpack.io") }
}
}
Add to pom.xml
<repositories>
<repository>
<id>jitpack.io</id>
<url>https://jitpack.io</url>
</repository>
</repositories>
Add it in your build.sbt at the end of resolvers:
resolvers += "jitpack" at "https://jitpack.io"
Add it in your project.clj at the end of repositories:
:repositories [["jitpack" "https://jitpack.io"]]
Step 2. Add the dependency
dependencies {
implementation 'com.github.ceabie:DexKnifePlugin:'
}
dependencies {
implementation("com.github.ceabie:DexKnifePlugin:")
}
<dependency>
<groupId>com.github.ceabie</groupId>
<artifactId>DexKnifePlugin</artifactId>
<version></version>
</dependency>
libraryDependencies += "com.github.ceabie" % "DexKnifePlugin" % ""
:dependencies [[com.github.ceabie/DexKnifePlugin ""]]
A simple android gradle plugin to use the patterns of package to smart split the specified classes to multi dex. Also supports android gradle plugin 2.2.0 multidex. Solve android studio enable the native multidex feature, but there will be too many classes in main dex. (See Features 7)
1.6.1: Compatible with android gradle plugin 2.3.0, auto disable when build with ART-Runtime (See Features 8).
1.6.0: Modify: When only -keep is configured, only keep the specified classes.
1.5.9: Compatible with some ancient version of gradle and android gradle plugin.
1.5.8: Compatible with gradle 3.2, fixed use of only support-split and support-keep resulting in an extra large number of classes.
1.5.7: fixed support-split and support-keep are not work. (修复support-split/support-keep无效的bug)
1.5.6: Experimentally compatible with java 1.7, fix nothing is selected when only -keep. (实验性的支持java 1.7,修复但只有keep选项时没有类被选中)
1.5.5: support individual filter for suggest maindexlist. (单独的maindexlist过滤设置)
1.5.5.alpha: Experimentally compatible with android gradle plugin on 2.2.0. (实验性的支持 2.2.0 plugin)
1.5.4: auto disabled when instant run mode.(instant run 模式时自动禁用DexKnife)
1.5.3: add some track logs and skip DexKnife when jarMerging is null.(增加跟踪日志,并在jarMerging为null跳过处理)
1.5.2: fixed the include and exclude path, and supports filtering single class.(修复include和exclude, 并支持过滤单个类)
1.5.1.exp: Experimentally compatible with android gradle plugin on 2.1.0 (实验性的支持 2.1.0 plugin)
1.5.1: fixed the proguard mode
DexKnife can only explicitly specify the classes of main dex, can not specify the classes of after the second dex (limitation of dex's param maindexlist). If you need to completely configure the main dex manually, use: -donot-use-suggest<br /> -split ** <br /> -keep android.support.multidex.** # keep multidex lib <br /> -keep # wildcards of other keeping classes, and the count of idx don't overflow 65535 <br />
DexKnife does not have dependency detection and requires you to configure it manually because DexKnife does not know your project requirements.
1.In your project's build.gradle, buildscript.
buildscript {
....
dependencies {
....
classpath 'com.android.tools.build:gradle:2.3.0' // or other
classpath 'com.ceabie.dextools:gradle-dexknife-plugin:1.6.1'
}
}
please make sure gradle version is compatible with the android gradle plugin, otherwise it can causes some sync error, such as:<br /> Gradle sync failed: Unable to load class 'com.android.builder.core.EvaluationErrorReporter'.
2.Create a 'dexknife.txt' in your App's module, and config the patterns of classes path that wants to put into sencond dex.<br /> (The rest of any classes that is not marked split will be in miandexlist)
Patterns may include:
'*' to match any number of characters
'?' to match any single character
'**' to match any number of directories or files
Either '.' or '/' may be used in a pattern to separate directories.
Patterns ending with '.' or '/' will have '**' automatically appended.
Also see: https://docs.gradle.org/current/javadoc/org/gradle/api/tasks/util/PatternFilterable.html <br />
Other config key:
'#' is the comment, config is disabled when '#' adds on line start.
# Global filter, don't apply with suggest maindexlist if -filter-suggest is DISABLE.
# this path will to be split to second dex.
android.support.v?.**
# if you want to keep some classes in main dex, use '-keep'.
-keep android.support.v4.view.**
# you can keep single class in main dex, end with '.class', use '-keep'.
-keep android.support.v7.app.AppCompatDialogFragment.class
# do not use suggest of the maindexlist that android gradle plugin generate.
-donot-use-suggest
# the global filter apply with maindexlist, if -donot-use-suggest is DISABLE.
-filter-suggest
# Notes: Split dex until the dex's id > 65536. --minimal-main-dex is default.
-auto-maindex # default is not used.
# dex additional parameters, such as --set-max-idx-number=50000
# if number is too small, it will cause DexException: Too many classes in --main-dex-list, main dex capacity exceeded
-dex-param --set-max-idx-number=50000
# log the main dex classes.
-log-mainlist
# log the filter classes of suggest maindexlist, if -filter-suggest is enabled..
-log-filter-suggest
#the filter log。Recommend;Global;true;false
-log-filter
# if you only filter the suggest maindexlist, use -suggest-split and -suggest-keep.
# Global filter will merge into them if -filter-suggest is ENABLE at same time.
-suggest-split **.MainActivity2.class
-suggest-keep android.support.multidex.**
Note: if you want to filter the inner classes, use $*, such as: SomeClass$*.class <br />
3.add to your app's build.gradle, add this line:
apply plugin: 'com.ceabie.dexnkife'
and then, set your app
multiDexEnabled true
4.run your app
一个简单的将指定使用通配符包名分包到第二个dex中gradle插件。(使用疑问查看 特性) 同时支持 android gradle plugin 2.2.0 multidex. 可以解决 android studio 使用 multidex,但还会出现dex类太多的问题。(参见 特性 7)
1.6.1: 兼容 Android gradle plugin 2.3.0,在 ART-Runtime编译模式下自动禁用,增加相关提示。(参见 特性 8)
1.6.0: 修改:当只有keep时,只保留keep指定的类
1.5.9: 兼容一些古老的 gradle 和 android gradle plugin版本
1.5.8: 兼容gradle 3.2,修复当只使用support-split/support-keep时出现大量的额外类
1.5.7: 修复support-split/support-keep无效的bug
1.5.6: 实验性的支持java 1.7,修复但只有keep选项时没有类被选中
1.5.5: 增加单独的maindexlist过滤设置
1.5.5.alpha: 实验性的支持 2.2.0 plugin
1.5.4: instant run 模式时自动禁用DexKnife
1.5.3: 增加跟踪日志,并在jarMerging为null时跳过处理
1.5.2: 修复include和exclude, 并支持过滤单个类
1.5.1.exp: 实验性的支持 2.1.0 plugin
1.5.1: 修复 proguard mode
DexKnife只能明确指定第一个dex中的类,不能明确指定第二个dex以后的类(dex的maindexlist限制)。如果需要完全手动配置第一个dex,使用<br /> -donot-use-suggest<br /> -split ** <br /> -keep android.support.multidex.** # 保证 multidex 或者你自己开发的multidex <br /> -keep # 配置你的keep类的通配符,但数量不能超界 <br />
DexKnife不带有依赖检测,需要你手动配置,因为DexKnife并不知道你的项目需求。
1.在你的工程的 build.gradle 中 buildscript:
buildscript {
....
dependencies {
....
classpath 'com.android.tools.build:gradle:2.3.0' // or other
classpath 'com.ceabie.dextools:gradle-dexknife-plugin:1.6.1'
}
}
注意,请确保使用的gradle版本和android gradle plugin兼容,否则会出现同步错误,例如:<br /> Gradle sync failed: Unable to load class 'com.android.builder.core.EvaluationErrorReporter'.
2.在App模块下创建 dexknife.txt,并填写要放到第二个dex中的包名路径的通配符.(注意,其余任何未被注明split的类都会在miandexlist)
Patterns may include:
'*' to match any number of characters
'?' to match any single character
'**' to match any number of directories or files
Either '.' or '/' may be used in a pattern to separate directories.
Patterns ending with '.' or '/' will have '**' automatically appended.
更多参见: https://docs.gradle.org/current/javadoc/org/gradle/api/tasks/util/PatternFilterable.html <br />
其他配置:
使用 # 进行注释, 当行起始加上 #, 这行配置被禁用.
# 全局过滤, 如果没设置 -filter-suggest 并不会应用到 建议的maindexlist.
# 如果你想要某个已被排除的包路径在maindex中,则使用 -keep 选项,即使他已经在分包的路径中.
# 注意,没有split只用keep时,miandexlist将仅包含keep指定的类。
-keep android.support.v4.view.**
# 这条配置可以指定这个包下类在第二dex中.(注意,未指定的类会在被认为在maindexlist中)
android.support.v?.**
# 使用.class后缀,代表单个类.
-keep android.support.v7.app.AppCompatDialogFragment.class
# 不包含Android gradle 插件自动生成的miandex列表.
-donot-use-suggest
# 将 全局过滤配置应用到 建议的maindexlist中, 但 -donot-use-suggest 要关闭.
-filter-suggest
# 不进行dex分包, 直到 dex 的id数量超过 65536.
-auto-maindex
# dex 扩展参数, 例如 --set-max-idx-number=50000
# 如果出现 DexException: Too many classes in --main-dex-list, main dex capacity exceeded,则需要调大数值
-dex-param --set-max-idx-number=50000
# 显示miandex的日志.
-log-mainlist
#过滤日志。Recommend:在maindexlist中(由推荐列表确定);Global:在maindexlist中,由全局过滤确定;true,前两者都成立的;false,不在maindexlist中
-log-filter
# 如果你只想过滤 建议的maindexlist, 使用 -suggest-split 和 -suggest-keep.
# 如果同时启用 -filter-suggest, 全局过滤会合并到它们中.
-suggest-split **.MainActivity2.class
-suggest-keep android.support.multidex.**
注意: 1. 过滤的类路径使用非混淆的。 2. 使用全局split(或不加,也当做排除的),仅仅只有指定了split的类才会被移出maindex,未标注的剩余类都会保留在maindex中。如果只使用keep,那只有被keep的类会在maindexlist。配置不当会,会出现未指定过的类。 3. suggest-split与suggest-keep规则如同 第2条。 4. 如果使用了全局过滤,又使用了suggest-xxx,那么只要其中一个结果成立,那么这个类都会maindexlist中。建议仅使用suggest-split对ADT推荐的列表进行再过滤。 5. 如果你要过滤内部类, 使用$*,例如: SomeClass$*.class。
3.在你的App模块的build.gradle 增加:
apply plugin: 'com.ceabie.dexnkife'
最后,在app工程中设置:
multiDexEnabled true
4.编译你的应用
在Terminal中运行 gradleDebug。具体参见:http://blog.csdn.net/ceabie/article/details/55271161
Copyright (C) 2017 ceabie (http://blog.csdn.net/ceabie)
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.