标签: android-multidex

使用 MultiDexApplication 会导致 applicationContext 变为 null

我已按照此链接中的说明将我的应用程序切换到 MultiDexApplication - https://developer.android.com/studio/build/multidex.html

应用程序现在安装正确,但我的应用程序上下文为空。你们有没有经历过这样的事情?

如果您需要代码示例,请告诉我,但由于应用程序因无法获取应用程序上下文而崩溃,因此我想不出任何可以解释该问题的代码。

获取我的应用程序上下文如下:

TrackerApplication.getContext();


public class TrackerApplication extends MultiDexApplication {

private static Context context;

public TrackerApplication() {
    super();
    context = this;
}

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

@Override
public void onCreate() {
    super.onCreate();
    Fabric.with(this, new Crashlytics());
}

public static Context getContext() {
    return context;
}
}
Run Code Online (Sandbox Code Playgroud)

然后当我打电话时:

TrackerApplication.getContext().getSharedPreferences("MySettings",
            Context.MODE_PRIVATE);
Run Code Online (Sandbox Code Playgroud)

我得到一个空指针。我的应用程序上下文为空。

添加了一个测试来解释这个问题。在我的 Launch 活动中,我添加了以下代码:

if (TrackerApplication.getContext() == null) {
        Log.i("TEST", "Context is null");
    } else {
        Log.i("TEST", "What is the issue?");
    } …
Run Code Online (Sandbox Code Playgroud)

android android-multidex

6
推荐指数
1
解决办法
1382
查看次数

我怎样才能检查android中的dex数?

我项目的gradle文件如下.

android {
    compileSdkVersion 23
    buildToolsVersion "25.0.1"

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt')
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在Android Studio中"Generate Signed APK"时,我可以看到DexIndexOverflowException.

Error:Execution failed for task ':MyProject:transformClassesWithDexForRelease'.
> com.android.build.api.transform.TransformException: 
com.android.ide.common.process.ProcessException: 
java.util.concurrent.ExecutionException: 
com.android.dex.DexIndexOverflowException: method ID not in [0, 0xffff]: 65536
Run Code Online (Sandbox Code Playgroud)

我已经知道这个错误并阅读了文档(https://developer.android.com/studio/build/multidex.html).
我想查看已经超过了多少dex.

例如:

trouble writing output:
Too many field references: 99999; max is 65536.
You may try using --multi-dex option.
Run Code Online (Sandbox Code Playgroud)

请找一个解决方案.
谢谢

android dex android-studio android-multidex

6
推荐指数
2
解决办法
6158
查看次数

错误:com.android.dex.DexException:多个dex文件定义Landroid/support/design/widget/CoordinatorLayout $ HierarchyChangeListener

我尝试过这些解决方案 - 解决方案1 ,解决方案2

这是我的gradle依赖项.

dependencies {
    implementation fileTree(include: ['*.jar'], dir: 'libs')
    //noinspection GradleCompatible
    implementation 'com.android.support:appcompat-v7:27.0.2'
    implementation 'com.android.support.constraint:constraint-layout:1.0.2'
    implementation 'com.android.support:support-v4:27.0.2'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.1'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'
    //Recycleview
    implementation 'com.android.support:recyclerview-v7:27.0.2'
    //Butterknife
    implementation 'com.jakewharton:butterknife:8.8.1'
    annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'
    //SDP
    implementation 'com.intuit.sdp:sdp-android:1.0.5'
    //OkHttp
    implementation 'com.squareup.okhttp3:logging-interceptor:3.9.1'
    //RxJava and RxAndroid
    implementation 'io.reactivex.rxjava2:rxjava:2.0.6'
    implementation 'io.reactivex.rxjava2:rxandroid:2.0.1'
    implementation 'io.ashdavies.rx:rx-firebase:1.3.3'
    //RxBinding
    implementation 'com.jakewharton.rxbinding:rxbinding-design:0.4.0'
    //Retrofit
    implementation 'com.squareup.retrofit2:retrofit:2.3.0'
    implementation 'com.squareup.retrofit2:adapter-rxjava:2.3.0'
    //Glide
    implementation 'com.github.bumptech.glide:glide:4.6.1'
    annotationProcessor 'com.github.bumptech.glide:compiler:4.6.1'
    //GSON
    implementation 'com.google.code.gson:gson:2.2.4'
    //Image Crop Library
    implementation 'com.theartofdev.edmodo:android-image-cropper:2.6.+'
    //Dagger Android
    implementation 'com.google.dagger:dagger:2.13'
    annotationProcessor 'com.google.dagger:dagger-compiler:2.13'
    annotationProcessor 'com.google.dagger:dagger-android-processor:2.13'
    implementation 'com.google.dagger:dagger-android-support:2.13' …
Run Code Online (Sandbox Code Playgroud)

android android-multidex android-coordinatorlayout rx-binding

6
推荐指数
1
解决办法
2712
查看次数

在 Android 4 上的路径:DexPathList 上找不到类“com.example.android.App”

我有使用 Dagger 2 进行 DI 的 Kotlin MultiDex 应用程序。一切几乎都很好,但我的设备具有 API 17 (Android 4.2.2),有时应用程序在启动后立即崩溃,但有异常

java.lang.RuntimeException:无法实例化应用程序 com.example.android.App:java.lang.ClassNotFoundException:在路径上找不到类“com.example.android.App”:DexPathList[[zip 文件“/data/” app/com.example.android-1.apk"],nativeLibraryDirectories=[/data/app-lib/com.example.android-1, /vendor/lib, /system/lib]]

通常,这种情况发生在“构建”->“项目”之后以及“文件”->“无效缓存/重新启动”之后,但并非总是如此。通常重建项目会有所帮助,但我想彻底解决这些情况。

请告诉我可能是什么问题?

我的 build.gradle (不完整):

apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
apply plugin: 'io.fabric'
apply plugin: 'io.sentry.android.gradle'
apply plugin: 'kotlin-kapt'

android {
    compileSdkVersion 27
    defaultConfig {
        applicationId "com.example.android"
        minSdkVersion 16
        targetSdkVersion 27
        versionCode 58
        versionName "1.0"
        vectorDrawables.useSupportLibrary = true
        multiDexEnabled true
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    applicationVariants.all { variant …
Run Code Online (Sandbox Code Playgroud)

android kotlin android-gradle-plugin android-multidex dagger-2

6
推荐指数
0
解决办法
356
查看次数

在Android工作室中优化构建时间的提示?

我从Android工作室一直有可怕的构建时间,我想知道你是否有任何优化提示.以下是我目前正在开发的应用程序的一些细节:

  • 65k功能限制问题,使用支持pkg的最新multidex修复
  • 使用大约10-15个库
  • 使用1-2个本机库(.so)
  • 尝试使用pre-dex技巧,结果会有所不同.
  • 整合twitter fabric~1m30sec 之前建立时间
  • 整合twitter fabric 4m30sec - 14m30sec 后的构建时间

硬件/软件规格:

  • i7 4240
  • 16GB RAM
  • 250GB SSD

任何提示,评论都欢迎:)

编辑1

添加了分析结果:

<div class="tab" id="tab0">
<h2>Summary</h2>
<table>
<thead>
<tr>
<th>Description</th>
<th class="numeric">Duration</th>
</tr>
</thead>
<tr>
<td>Total Build Time</td>
<td class="numeric">8m44.29s</td>
</tr>
<tr>
<td>Startup</td>
<td class="numeric">1.813s</td>
</tr>
<tr>
<td>Settings and BuildSrc</td>
<td class="numeric">0.038s</td>
</tr>
<tr>
<td>Loading Projects</td>
<td class="numeric">0.009s</td>
</tr>
<tr>
<td>Configuring Projects</td>
<td class="numeric">5.889s</td>
</tr>
Run Code Online (Sandbox Code Playgroud)

http://jsfiddle.net/gp6o04dL/

android android-gradle-plugin android-multidex twitter-fabric

5
推荐指数
1
解决办法
481
查看次数

实现MultiDex会导致编译这么长时间,最后导致堆空间错误

我有一个很大的Android项目,我得到了无法执行dex:方法ID不在[0,0xffff]:65536错误; 我相信你们中的一些人之前肯定经历过这个问题.由于应用程序中引用的方法太多,这是一个错误.

我在网上寻找了不同的资源,发现可能是最好的解决方案.

我做了以下事情:

  1. 添加multiDexEnabled = truedefaultConfig的build.gradle.
  2. 添加了以下依赖项:

    dependencies {
      compile 'com.android.support:multidex:1.0.0'
    }
    
    Run Code Online (Sandbox Code Playgroud)
  3. 覆盖了我的App类中的以下代码.

    @Override
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
        MultiDex.install(this);
    }
    
    Run Code Online (Sandbox Code Playgroud)

现在,错误消失了,但我遇到了一个新问题.当我运行应用程序时,编译器需要超过3分钟来编译和运行应用程序,最后给我这个错误:

UNEXPECTED TOP-LEVEL ERROR:
java.lang.OutOfMemoryError: Java heap space
Run Code Online (Sandbox Code Playgroud)

我理解这个错误是由于大量内存使用而发生的,但我不知道如何解决它.我使用的是Android Studio 1.0.2和Android API 21.

谢谢!

编辑:

我已经在MonoDevelop中编译MonoDroid应用程序时检查了如何修复"OutOfMemoryError:java堆空间",但是这并没有解决问题的原因,而且我没有使用Xamarin Studio.

编辑2:

确切的症状是这样的:
当我编译代码时,gradle控制台向我展示了数百个警告,说"忽略匿名内部类的InnerClasses属性"(其他一些stackoverflow答案表明这不是严重的警告),然后显示什么但闪烁的光标暂时一段时间,大约一分钟后,它给了我错误.

android android-multidex

5
推荐指数
1
解决办法
2771
查看次数

版本1.6.0的VM没有multidex支持:无法找到应用程序Mono.Android.Platform.ApiLevel_23或Xamarin.Android.Platform

我创建了一个小应用程序.当我尝试在genymotion模拟器上运行应用程序时,它会弹出" 不幸的是我的应用已停止 "


应用输出:

Forwarding debugger port 8834
Detecting existing process
[MultiDex] VM with version 1.6.0 does not have multidex support
[MultiDex] install
[MultiDex] MultiDexExtractor.load(/data/app/purposecolor.purposecolor-2.apk, false)
[MultiDex] Detected that extraction must be performed.
[MultiDex] load found 0 secondary dex files
[MultiDex] install done
[AndroidRuntime] Shutting down VM
[AndroidRuntime] FATAL EXCEPTION: main
[AndroidRuntime] java.lang.RuntimeException: Unable to get provider mono.MonoRuntimeProvider: java.lang.RuntimeException: Unable to find application Mono.Android.Platform.ApiLevel_23 or Xamarin.Android.Platform!
[AndroidRuntime]    at android.app.ActivityThread.installProvider(ActivityThread.java:4563)
[AndroidRuntime]    at android.app.ActivityThread.installContentProviders(ActivityThread.java:4190)
[AndroidRuntime]    at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4132)
[AndroidRuntime]    at android.app.ActivityThread.access$1300(ActivityThread.java:130)
[AndroidRuntime]    at …
Run Code Online (Sandbox Code Playgroud)

android xamarin.android xamarin android-multidex

5
推荐指数
1
解决办法
4531
查看次数

当其中一个模块使用Multidex时,在两个模块的运行配置之间切换而不使用Clean

在我的Android Studio项目中,我有几个模块,其中只有两个是应用程序模块(让我们称之为AB),其他模块是库模块,有些模块由AB使用.
对于模块A,启用multidex,而对于B,则不启用.

我遇到的问题是,当从一个配置(运行按钮旁边的下拉列表)切换,并运行另一个配置时,我总是会遇到一些错误.使其工作的唯一方法是完整的项目清洁.

当从A切换到B而没有干净时,我收到以下错误:

    UNEXPECTED TOP-LEVEL EXCEPTION:
java.util.zip.ZipException: error in opening zip file
    at java.util.zip.ZipFile.open(Native Method)
    at java.util.zip.ZipFile.<init>(ZipFile.java:215)
    at java.util.zip.ZipFile.<init>(ZipFile.java:145)
    at java.util.zip.ZipFile.<init>(ZipFile.java:159)
    at com.android.dx.cf.direct.ClassPathOpener.processArchive(ClassPathOpener.java:244)
    at com.android.dx.cf.direct.ClassPathOpener.processOne(ClassPathOpener.java:166)
    at com.android.dx.cf.direct.ClassPathOpener.process(ClassPathOpener.java:144)
    at com.android.dx.command.dexer.Main.processOne(Main.java:672)
    at com.android.dx.command.dexer.Main.processAllFiles(Main.java:574)
    at com.android.dx.command.dexer.Main.runMonoDex(Main.java:311)
    at com.android.dx.command.dexer.Main.run(Main.java:277)
    at com.android.dx.command.dexer.Main.main(Main.java:245)
    at com.android.dx.command.Main.main(Main.java:106)
8 errors; aborting (all are similar to the one above, so I omitted them)
Error:Execution failed for task ':Bapp'.
> com.android.ide.common.process.ProcessException: …
Run Code Online (Sandbox Code Playgroud)

android android-studio android-multidex

5
推荐指数
1
解决办法
118
查看次数

dalvik.system.BaseDexClassLoader的ClassNotFoundException

对此进行了一些研究,发现了一些有关在应用程序中面临相同问题的人员的帖子。我也在我的应用程序的Google控制台中面临崩溃,并遵循了我发现的帖子(java.lang.ClassNotFoundException dalvik.system.BaseDexClassLoader.findClass)和类似的帖子。所有这些建议建议遵循链接https://developer.android.com/studio/build/multidex.html上提到的步骤。

遵循页面上提到的所有解决方法,但仍然遇到相同的问题。我的应用程序的MinSdkVersion为15,因此添加了所有解决方法来消除此问题,但到目前为止还没有运气。

正如我在文档中提到的,我可以选择将sdk的最低版本更改为21,但这会影响我很多时间。*

我仅在Android 5.1和更低版本上遇到此问题。

java.lang.RuntimeException: 
  at android.app.LoadedApk.makeApplication (LoadedApk.java:563)
  at android.app.ActivityThread.handleBindApplication   (ActivityThread.java:4540)
  at android.app.ActivityThread.access$1500 (ActivityThread.java:151)
  at android.app.ActivityThread$H.handleMessage (ActivityThread.java:1371)
  at android.os.Handler.dispatchMessage (Handler.java:102)
  at android.os.Looper.loop (Looper.java:135)
  at android.app.ActivityThread.main (ActivityThread.java:5268)
  at java.lang.reflect.Method.invoke (Method.java)
  at java.lang.reflect.Method.invoke (Method.java:372)
  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run (ZygoteInit.java:902)
  at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:697)
Caused by: java.lang.ClassNotFoundException: 
  at dalvik.system.BaseDexClassLoader.findClass (BaseDexClassLoader.java:56)
  at java.lang.ClassLoader.loadClass (ClassLoader.java:511)
  at java.lang.ClassLoader.loadClass (ClassLoader.java:469)
  at android.app.Instrumentation.newApplication (Instrumentation.java:980)
  at android.app.LoadedApk.makeApplication (LoadedApk.java:558)
Run Code Online (Sandbox Code Playgroud)

dalvik android-multidex android-5.1.1-lollipop

5
推荐指数
1
解决办法
1756
查看次数

构建失败:程序类型已存在:com.facebook.ads.Ad

我尝试在Android Studio中构建一个模块。它似乎可以在设备上运行,但是当我尝试构建APK时出现错误:

Program type already present: com.facebook.ads.Ad
Run Code Online (Sandbox Code Playgroud)

这是完整的日志:

org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':NewApp:transformClassesWithMultidexlistForDevDebug'.
    at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:100)
    at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:70)
    at org.gradle.api.internal.tasks.execution.OutputDirectoryCreatingTaskExecuter.execute(OutputDirectoryCreatingTaskExecuter.java:51)
    at org.gradle.api.internal.tasks.execution.SkipUpToDateTaskExecuter.execute(SkipUpToDateTaskExecuter.java:62)
    at org.gradle.api.internal.tasks.execution.ResolveTaskOutputCachingStateExecuter.execute(ResolveTaskOutputCachingStateExecuter.java:54)
    at org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter.execute(ValidatingTaskExecuter.java:60)
    at org.gradle.api.internal.tasks.execution.SkipEmptySourceFilesTaskExecuter.execute(SkipEmptySourceFilesTaskExecuter.java:97)
    at org.gradle.api.internal.tasks.execution.CleanupStaleOutputsExecuter.execute(CleanupStaleOutputsExecuter.java:87)
    at org.gradle.api.internal.tasks.execution.ResolveTaskArtifactStateTaskExecuter.execute(ResolveTaskArtifactStateTaskExecuter.java:52)
    at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:52)
    at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:54)
    at org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter.execute(ExecuteAtMostOnceTaskExecuter.java:43)
    at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:34)
    at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker$1.run(DefaultTaskGraphExecuter.java:248)
    at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:336)
    at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:328)
    at org.gradle.internal.progress.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:199)
    at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:110)
    at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker.execute(DefaultTaskGraphExecuter.java:241)
    at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker.execute(DefaultTaskGraphExecuter.java:230)
    at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker.processTask(DefaultTaskPlanExecutor.java:123)
    at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker.access$200(DefaultTaskPlanExecutor.java:79)
    at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker$1.execute(DefaultTaskPlanExecutor.java:104)
    at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker$1.execute(DefaultTaskPlanExecutor.java:98)
    at org.gradle.execution.taskgraph.DefaultTaskExecutionPlan.execute(DefaultTaskExecutionPlan.java:626)
    at org.gradle.execution.taskgraph.DefaultTaskExecutionPlan.executeWithTask(DefaultTaskExecutionPlan.java:581)
    at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker.run(DefaultTaskPlanExecutor.java:98)
    at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:63)
    at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:46)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:55)
    at java.lang.Thread.run(Thread.java:748) …
Run Code Online (Sandbox Code Playgroud)

java android build.gradle android-gradle-plugin android-multidex

5
推荐指数
1
解决办法
1796
查看次数