我已按照此链接中的说明将我的应用程序切换到 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) 我项目的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)
请找一个解决方案.
谢谢
这是我的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
我有使用 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
我从Android工作室一直有可怕的构建时间,我想知道你是否有任何优化提示.以下是我目前正在开发的应用程序的一些细节:
硬件/软件规格:
任何提示,评论都欢迎:)
编辑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)
android android-gradle-plugin android-multidex twitter-fabric
我有一个很大的Android项目,我得到了无法执行dex:方法ID不在[0,0xffff]:65536错误; 我相信你们中的一些人之前肯定经历过这个问题.由于应用程序中引用的方法太多,这是一个错误.
我在网上寻找了不同的资源,发现这可能是最好的解决方案.
我做了以下事情:
multiDexEnabled = true在defaultConfig块的build.gradle.添加了以下依赖项:
dependencies {
compile 'com.android.support:multidex:1.0.0'
}
Run Code Online (Sandbox Code Playgroud)覆盖了我的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答案表明这不是严重的警告),然后显示什么但闪烁的光标暂时一段时间,大约一分钟后,它给了我错误.
我创建了一个小应用程序.当我尝试在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 Studio项目中,我有几个模块,其中只有两个是应用程序模块(让我们称之为A和B),其他模块是库模块,有些模块由A和B使用.
对于模块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) 对此进行了一些研究,发现了一些有关在应用程序中面临相同问题的人员的帖子。我也在我的应用程序的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) 我尝试在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
android-multidex ×10
android ×9
build.gradle ×1
dagger-2 ×1
dalvik ×1
dex ×1
java ×1
kotlin ×1
rx-binding ×1
xamarin ×1