Android支持多索引库实现
我已经达到了magicdex的极限,因为我的应用程序使用了很多JAR(驱动API、greendao、文本到pdf、支持…) 我目前的解决方案是,我仅仅为google drive创建了第二个apk,我从主apk调用了它。但现在我发现安卓终于通过这个库支持了这一点。我的问题是我不知道如何实现它(最好没有gradle)。我找不到任何好的教程 好吧,我正在失去我的头脑试图实现这个。。。我找到了 我补充说:Android支持多索引库实现,android,android-gradle-plugin,android-library,dex,Android,Android Gradle Plugin,Android Library,Dex,我已经达到了magicdex的极限,因为我的应用程序使用了很多JAR(驱动API、greendao、文本到pdf、支持…) 我目前的解决方案是,我仅仅为google drive创建了第二个apk,我从主apk调用了它。但现在我发现安卓终于通过这个库支持了这一点。我的问题是我不知道如何实现它(最好没有gradle)。我找不到任何好的教程 好吧,我正在失去我的头脑试图实现这个。。。我找到了 我补充说: android:name="android.support.multidex.MultiDexA
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'
}
}
}
apply插件:“安卓”
依赖关系{
编译文件树(目录:“libs”,包括:“*.jar”)
编译项目(':android-support-v7-appcompat')
编译项目(“:Sync”)
编译项目(“:gdrive:google-play-services_lib”)
}
安卓{
编译DK14版
BuildTools版本“21.1.1”
源集{
主要{
manifest.src文件“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']
}
//将测试移动到tests/java、tests/res等。。。
instrumentTest.setRoot('tests'))
//将生成类型移动到生成类型/
//例如,build-types/debug/java、build-types/debug/AndroidManifest.xml。。。
//这会将它们移出src/…下的默认位置,这将
//与主源集正在使用的src/冲突。
//应同时添加新的构建类型或产品风格
//通过类似的定制。
setRoot('build-types/debug')
setRoot('build-types/release')
}
德克斯选项{
preDexLibraries=false
}
}
后评价{
任务.匹配{
it.name.startsWith('dex'))
}.每个{dx->
如果(dx.additionalParameters==null){
dx.additionalParameters=['--multi-dex']
}否则{
dx.additionalParameters+='--多索引'
}
}
}
但是错误仍然是一样的:(博客是旧的解决方案 使用Android Studio 0.9.2和Gradle插件0.14.1,您只需:
attachBaseContext
方法中
或者您的自定义应用程序扩展多索引应用程序
multiDexEnabled=true
有几件事你必须做 1-在gradle中,您需要指定multidex并添加支持库:
android {
defaultConfig {
...
multiDexEnabled true
...
}
}
dependencies {
...
compile 'com.android.support:multidex:1.0.0'
...
}
2-在清单中,您必须将应用程序设置为多索引应用程序:
<?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.2-或超出attachBaseContext()
方法:
public class my_application extends Application
{
protected void attachBaseContext(Context base)
{
super.attachBaseContext(base);
MultiDex.install(this);
}
}
多索引支持库的限制
multidex支持库有一些已知的限制,当您将其合并到应用程序构建配置中时,应注意并测试这些限制:
- 启动期间在设备的数据分区上安装.dex文件非常复杂,如果辅助dex文件较大,可能会导致应用程序不响应(ANR)错误。在这种情况下,您应该使用ProGuard应用代码收缩技术,以最小化dex文件的大小并删除未使用的代码部分
- 由于Dalvik Linearloc bug(问题22586),使用multidex的应用程序可能无法在运行早于Android 4.0(API级别14)的平台版本的设备上启动。如果您的目标API级别早于14,请确保使用这些版本的平台执行测试,因为您的应用程序在启动或加载特定类组时可能会出现问题。代码收缩可以减少或可能消除这些潜在问题
- 由于Dalvik Linearloc限制(问题78035),使用多索引配置并发出非常大内存分配请求的应用程序在运行时可能会崩溃。Android 4.0(API级别14)中增加了分配限制,但在Android 5.0(API级别21)之前的安卓版本中,应用程序可能仍会遇到此限制
- 在Dalvik运行时执行时,主dex文件中需要哪些类有复杂的要求。Android构建工具更新处理Android要求,但其他包含的库可能有额外的依赖性要求,包括使用内省或调用Java方法来自本机代码的ds。在更新multidex生成工具以允许您指定必须包含在主dex文件中的类之前,某些库可能无法使用
<?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>
...
更新:
如果您使用的是androidX,则可以使用以下选项:
实现“androidx.multidex:multidex:2.0.1”
参考所有google maven,您可以在其中搜索google的工件:
我可以在eclipse中而不是在android studio中进行此操作吗?目前,不行。eclipse的ADT插件不再处于活动开发中。这可以在eclipse中进行还是仅在android studio中进行?谷歌已经停止支持eclipse ADT。因此,可以在eclipse中进行此操作,但android studio是前进的方向。我真的建议导出您的项目安卓工作室的ect:becau
<?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>
public class my_application extends MultiDexApplication
{
...
}
public class my_application extends Application
{
protected void attachBaseContext(Context base)
{
super.attachBaseContext(base);
MultiDex.install(this);
}
}
android {
defaultConfig {
...
minSdkVersion 21
targetSdkVersion 25
multiDexEnabled true
}
...
}
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>