简体   繁体   English

Android Gradle的几个模块:transformDexArchiveWithDexMergerForDebug任务失败

[英]Android Gradle several modules :transformDexArchiveWithDexMergerForDebug task fail

Not so long ago I wrote a library for my app which contains 2 modules: samples and the library itself. 不久前,我为我的应用程序编写了一个库,其中包含2个模块:样本和库本身。

As always, library module is included in samples module's build.gradle, though they're both on the same level in the hierarchy, just after the root: 与往常一样,库模块包含在samples模块的build.gradle中,尽管它们在层次结构中位于同一级别,就在根目录之后:

----root
    ---samples
    ---tinyarbrowser

After the first release I used project without problems for about few weeks. 在第一次发布之后,我使用了几周没有问题的项目。

Last night I tried to build & run it before minor update. 昨晚我尝试在轻微更新之前构建并运行它。 So... the whole night is spent trying to figure it out :) The main problem is: 所以......整个晚上都花在试图弄明白:)主要问题是:

:samples:transformDexArchiveWithDexMergerForDebug FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':samples:transformDexArchiveWithDexMergerForDebug'.
> com.android.build.api.transform.TransformException: java.lang.RuntimeException: java.lang.RuntimeException: 
    com.android.builder.dexing.DexArchiveMergerException: Error while merging dex archives: 
        D:\AndroidStudioProjects\TinyARBrowser\samples\build\intermediates\transforms\dexBuilder\debug\17, 
        D:\AndroidStudioProjects\TinyARBrowser\samples\build\intermediates\transforms\dexBuilder\debug\18, 
        D:\AndroidStudioProjects\TinyARBrowser\samples\build\intermediates\transforms\externalLibsDexMerger\debug\0, 
        D:\AndroidStudioProjects\TinyARBrowser\samples\build\intermediates\transforms\dexBuilder\debug\16.jar
//...

It happens each time when i hopefully try to clean-build project with minor changes, none of wich helps at the moment. 每当我希望尝试通过微小的改变来清理构建项目时,它就会发生,目前没有任何帮助。

Current gradle files look as follows: 当前的gradle文件如下所示:

Root build.gradle : Root build.gradle

buildscript {
    ext.kotlinVersion = '1.2.30'
    ext.ankoVersion = '0.10.2'
    repositories {
        jcenter()
        google()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.1.1'
        classpath 'com.github.dcendents:android-maven-gradle-plugin:1.5'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion"
    }
}

allprojects {
    repositories {
        jcenter()
        google()
    }
}

ext {
    compileSdkVersion = 27
    buildToolsVersion = '27.0.3'
    minSdkVersion = 15
    targetSdkVersion = compileSdkVersion

    supportLibVersion = '27.0.2'

    supportDependencies = [
            design           :         "com.android.support:design:${supportLibVersion}",
            appCompat        :         "com.android.support:appcompat-v7:${supportLibVersion}",
    ]

    versionCode = 13
    versionName = '1.3'
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

Sample's samples module build.gradle : Sample的samples模块build.gradle

apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
apply plugin: 'project-report'

android {
    compileSdkVersion rootProject.ext.compileSdkVersion

    defaultConfig {
        applicationId "com.kkaun.tinyarbrowser"
        minSdkVersion rootProject.ext.minSdkVersion
        targetSdkVersion rootProject.ext.targetSdkVersion
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    androidTestImplementation 'com.android.support.test:runner:1.0.1'
    androidTestImplementation('com.android.support.test.espresso:espresso-core:3.0.1', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    testImplementation 'junit:junit:4.12'

    //Including project lib module here
    api (project(':tinyarbrowser')) {
        exclude group: 'com.android.support', module: 'design'
        exclude group: 'com.android.support', module: 'appcompat-v7'
        exclude group: 'com.android.support', module: 'appcompat-v4'
        exclude group: 'org.jetbrains.kotlin', module: 'kotlin-stdlib-jre8'
        exclude group: 'org.jetbrains.anko', module: 'anko'
    }

    implementation ('com.android.support:appcompat-v7:27.0.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })

    implementation 'com.android.support.constraint:constraint-layout:1.0.2'

    implementation"org.jetbrains.kotlin:kotlin-stdlib-jre8:$kotlinVersion"
}


//tasks.whenTaskAdded {task ->
//    if(task.name.contains("transformDexArchiveWithDexMergerForDebug")) {
//        task.enabled = false
//    }
//}

And lib tinyarbrowser module build.gradle : 和lib tinyarbrowser模块build.gradle

apply plugin: 'com.android.library'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
apply plugin: 'com.github.dcendents.android-maven'
group = 'com.github.kkaun'
version = rootProject.ext.versionName

android {
    compileSdkVersion rootProject.ext.compileSdkVersion

    defaultConfig {
        minSdkVersion rootProject.ext.minSdkVersion
        targetSdkVersion rootProject.ext.targetSdkVersion
        versionCode rootProject.ext.versionCode
        versionName rootProject.ext.versionName

        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])

    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'

    implementation supportDependencies.design
    implementation supportDependencies.appCompat

    implementation "org.jetbrains.kotlin:kotlin-stdlib-jre8:$kotlinVersion"
    implementation "org.jetbrains.anko:anko:$ankoVersion"
}

As i'm currently stuck with samples module, here is samples dependency tree output, lightweighted as more as possible: 由于我目前停留在样本模块,这里是samples依赖树输出,尽可能轻量化:

+--- project :tinyarbrowser
+--- com.android.support:appcompat-v7:27.0.2
|    +--- com.android.support:support-core-utils:27.0.2
|    |    \--- com.android.support:support-compat:27.0.2
|    |         \--- android.arch.lifecycle:runtime:1.0.3
|    |              +--- android.arch.lifecycle:common:1.0.3
|    |              \--- android.arch.core:common:1.0.0
|    +--- com.android.support:support-fragment:27.0.2
|    |    +--- com.android.support:support-compat:27.0.2 (*)
|    |    +--- com.android.support:support-core-ui:27.0.2
|    |    |    \--- com.android.support:support-compat:27.0.2 (*)
|    |    \--- com.android.support:support-core-utils:27.0.2 (*)
|    +--- com.android.support:support-vector-drawable:27.0.2
|    |    \--- com.android.support:support-compat:27.0.2 (*)
|    \--- com.android.support:animated-vector-drawable:27.0.2
|         +--- com.android.support:support-vector-drawable:27.0.2 (*)
|         \--- com.android.support:support-core-ui:27.0.2 (*)
+--- com.android.support.constraint:constraint-layout:1.0.2
|    \--- com.android.support.constraint:constraint-layout-solver:1.0.2
\--- org.jetbrains.kotlin:kotlin-stdlib-jre8:1.2.30
     +--- org.jetbrains.kotlin:kotlin-stdlib:1.2.30
     |    \--- org.jetbrains:annotations:13.0
     \--- org.jetbrains.kotlin:kotlin-stdlib-jre7:1.2.30
          \--- org.jetbrains.kotlin:kotlin-stdlib:1.2.30 (*)

What I tried: 我尝试了什么:

  • Clean-build it with dozens of exclusions and minor transitive dependencies changes; 使用许多排除和较小的传递依赖变化来清理构建它;

  • Invalidate cache / restart / clean local cache files; 使缓存/重启/清除本地缓存文件无效;

  • implementation vs api vs compile ; implementation vs api vs compile ;

  • Multidex for tiny lib?:) Tried just to be sure, all the same; Multidex for tiny lib?:)试图确保,一切都一样;

  • Downgrade build version from 3.1 to 3.0 (D8 vs DX compiler): in that case i received UNEXPECTED TOP-LEVEL EXCEPTION: com.android.dex.DexException: Multiple dex files define even with all dependencies except vital Kotlin removed; 将构建版本从3.1降级到3.0(D8与DX编译器):在这种情况下,我收到了UNEXPECTED TOP-LEVEL EXCEPTION: com.android.dex.DexException: Multiple dex files define甚至UNEXPECTED TOP-LEVEL EXCEPTION: com.android.dex.DexException: Multiple dex files define除了重要的Kotlin之外的所有依赖项;

  • See one more below: 请参阅以下内容:

Actually I'm 90% sure that's about Kotlin as its components are widely used in both modules and it's the last thing I cannot afford myself to be without, therefore I tried to exclude everything from samples module except Kotlin std's. 实际上我90%肯定是关于Kotlin的,因为它的组件在两个模块中被广泛使用,这是我不能承受的最后一件事,因此我试图从样本模块中排除一切,除了Kotlin标准。 So I also tried this "dirty trick": 所以我也试过这个“肮脏的把戏”:

tasks.whenTaskAdded {task ->
    if(task.name.contains("transformDexArchiveWithDexMergerForDebug")) {
        task.enabled = false
    }
}

And yep, with that build actually finishes, but then I face another problem each time trying to run it on Xiaomi Redmi 4X: 是的,那个版本实际上已经完成了,但是每次尝试在小米Redmi 4X上运行它时我都面临另一个问题:

Installation failed with message Failed to finalize session : INSTALL_FAILED_INVALID_APK: 
Package couldn't be installed in /data/app/com.kkaun.tinyarbrowser-1: Package /data/app/com.kkaun.tinyarbrowser-1/base.apk code is missing.
It is possible that this issue is resolved by uninstalling an existing version of the apk if it is present, and then re-installing.

As for this issue, I tried to disable/re-enable Instant Run, turn off MIUI-specific dev features, reboot etc. - it's still the same. 至于这个问题,我试图禁用/重新启用Instant Run,关闭MIUI特定的开发功能,重新启动等等 - 它仍然是相同的。

Out of options, for real. 出于选择,真实。 However, changing project structure for single lib module to be functioning is not an option at the moment. 但是,单个lib模块的项目结构改变才能正常运行。

Any constructive thoughts will be appreciated. 任何建设性的想法将不胜感激。

EDIT : 编辑:

Full stack trace of the key issue provided below: 下面提供的关键问题的完整堆栈跟踪:

> Task :samples:transformDexArchiveWithDexMergerForDebug FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':samples:transformDexArchiveWithDexMergerForDebug'.
> com.android.build.api.transform.TransformException: java.lang.RuntimeException: java.lang.RuntimeException: com.android.builder.dexing.DexArchiveMergerException: Error while merging dex archives: D:\AndroidStudioPr
ojects\TinyARBrowser\samples\build\intermediates\transforms\dexBuilder\debug\17, D:\AndroidStudioProjects\TinyARBrowser\samples\build\intermediates\transforms\dexBuilder\debug\18, D:\AndroidStudioProjects\TinyARBrows
er\samples\build\intermediates\transforms\externalLibsDexMerger\debug\0, D:\AndroidStudioProjects\TinyARBrowser\samples\build\intermediates\transforms\dexBuilder\debug\16.jar

* Try:
Run with --info or --debug option to get more log output. Run with --scan to get full insights.

* Exception is:
org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':samples:transformDexArchiveWithDexMergerForDebug'.
        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 org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:55)
Caused by: java.lang.RuntimeException: com.android.build.api.transform.TransformException: java.lang.RuntimeException: java.lang.RuntimeException: com.android.builder.dexing.DexArchiveMergerException: Error while mer
ging dex archives: D:\AndroidStudioProjects\TinyARBrowser\samples\build\intermediates\transforms\dexBuilder\debug\17, D:\AndroidStudioProjects\TinyARBrowser\samples\build\intermediates\transforms\dexBuilder\debug\18,
 D:\AndroidStudioProjects\TinyARBrowser\samples\build\intermediates\transforms\externalLibsDexMerger\debug\0, D:\AndroidStudioProjects\TinyARBrowser\samples\build\intermediates\transforms\dexBuilder\debug\16.jar
        at com.android.builder.profile.Recorder$Block.handleException(Recorder.java:55)
        at com.android.builder.profile.ThreadRecorder.record(ThreadRecorder.java:104)
        at com.android.build.gradle.internal.pipeline.TransformTask.transform(TransformTask.java:212)
        at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:73)
        at org.gradle.api.internal.project.taskfactory.IncrementalTaskAction.doExecute(IncrementalTaskAction.java:46)
        at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:39)
        at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:26)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$1.run(ExecuteActionsTaskExecuter.java:121)
        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.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:110)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:92)
        ... 29 more
Caused by: com.android.build.api.transform.TransformException: java.lang.RuntimeException: java.lang.RuntimeException: com.android.builder.dexing.DexArchiveMergerException: Error while merging dex archives: D:\Androi
dStudioProjects\TinyARBrowser\samples\build\intermediates\transforms\dexBuilder\debug\17, D:\AndroidStudioProjects\TinyARBrowser\samples\build\intermediates\transforms\dexBuilder\debug\18, D:\AndroidStudioProjects\Ti
nyARBrowser\samples\build\intermediates\transforms\externalLibsDexMerger\debug\0, D:\AndroidStudioProjects\TinyARBrowser\samples\build\intermediates\transforms\dexBuilder\debug\16.jar
        at com.android.build.gradle.internal.transforms.DexMergerTransform.transform(DexMergerTransform.java:225)
        at com.android.build.gradle.internal.pipeline.TransformTask$2.call(TransformTask.java:221)
        at com.android.build.gradle.internal.pipeline.TransformTask$2.call(TransformTask.java:217)
        at com.android.builder.profile.ThreadRecorder.record(ThreadRecorder.java:102)
        ... 41 more
Caused by: java.lang.RuntimeException: java.lang.RuntimeException: com.android.builder.dexing.DexArchiveMergerException: Error while merging dex archives: D:\AndroidStudioProjects\TinyARBrowser\samples\build\intermed
iates\transforms\dexBuilder\debug\17, D:\AndroidStudioProjects\TinyARBrowser\samples\build\intermediates\transforms\dexBuilder\debug\18, D:\AndroidStudioProjects\TinyARBrowser\samples\build\intermediates\transforms\e
xternalLibsDexMerger\debug\0, D:\AndroidStudioProjects\TinyARBrowser\samples\build\intermediates\transforms\dexBuilder\debug\16.jar
        at com.google.common.collect.ImmutableList.forEach(ImmutableList.java:397)
        at com.android.build.gradle.internal.transforms.DexMergerTransform.transform(DexMergerTransform.java:221)
        ... 44 more
Caused by: java.lang.RuntimeException: com.android.builder.dexing.DexArchiveMergerException: Error while merging dex archives: D:\AndroidStudioProjects\TinyARBrowser\samples\build\intermediates\transforms\dexBuilder\
debug\17, D:\AndroidStudioProjects\TinyARBrowser\samples\build\intermediates\transforms\dexBuilder\debug\18, D:\AndroidStudioProjects\TinyARBrowser\samples\build\intermediates\transforms\externalLibsDexMerger\debug\0
, D:\AndroidStudioProjects\TinyARBrowser\samples\build\intermediates\transforms\dexBuilder\debug\16.jar
Caused by: com.android.builder.dexing.DexArchiveMergerException: Error while merging dex archives: D:\AndroidStudioProjects\TinyARBrowser\samples\build\intermediates\transforms\dexBuilder\debug\17, D:\AndroidStudioPr
ojects\TinyARBrowser\samples\build\intermediates\transforms\dexBuilder\debug\18, D:\AndroidStudioProjects\TinyARBrowser\samples\build\intermediates\transforms\externalLibsDexMerger\debug\0, D:\AndroidStudioProjects\T
inyARBrowser\samples\build\intermediates\transforms\dexBuilder\debug\16.jar
        at com.android.builder.dexing.D8DexArchiveMerger.getExceptionToRethrow(D8DexArchiveMerger.java:124)
        at com.android.builder.dexing.D8DexArchiveMerger.mergeDexArchives(D8DexArchiveMerger.java:109)
        at com.android.build.gradle.internal.transforms.DexMergerTransformCallable.call(DexMergerTransformCallable.java:101)
        at com.android.build.gradle.internal.transforms.DexMergerTransformCallable.call(DexMergerTransformCallable.java:36)
Caused by: com.android.tools.r8.CompilationFailedException: Compilation failed to complete
        at com.android.tools.r8.utils.ExceptionUtils.withCompilationHandler(ExceptionUtils.java:76)
        at com.android.tools.r8.utils.ExceptionUtils.withD8CompilationHandler(ExceptionUtils.java:45)
        at com.android.tools.r8.D8.run(D8.java:88)
        at com.android.builder.dexing.D8DexArchiveMerger.mergeDexArchives(D8DexArchiveMerger.java:107)
        ... 2 more
Caused by: com.android.tools.r8.utils.AbortException
        at com.android.tools.r8.utils.Reporter.failIfPendingErrors(Reporter.java:77)
        at com.android.tools.r8.utils.Reporter.fatalError(Reporter.java:58)
        at com.android.tools.r8.utils.ExceptionUtils.withCompilationHandler(ExceptionUtils.java:67)
        ... 5 more

BUILD FAILED in 35s

For this project, the build tools end up creating two different BuildConfig.java files - one in the samples module and one in the tinyarbrowser module. 对于这个项目,构建工具最终会创建两个不同的BuildConfig.java文件 - 一个在samples模块中,另一个在tinyarbrowser模块中。 They both have the same package of com.kkaun.tinyarbrowser . 它们都有相同的com.kkaun.tinyarbrowser包。 Because they're both in the same package, the build tools fail during merge. 因为它们都在同一个包中,所以构建工具在合并期间会失败。

The AndroidManifest.xml file in each of these modules dictates where the corresponding BuildConfig class will go, so we need to change the package in one of the modules so that they won't collide. 每个模块中的AndroidManifest.xml文件都指示相应的BuildConfig类的位置,因此我们需要更改其中一个模块中的包,以便它们不会发生冲突。

For example, you can update the manifest file in the samples directory from this: 例如,您可以从以下位置更新samples目录中的清单文件:

<manifest 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.kkaun.tinyarbrowser">

to this: 对此:

<manifest 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.kkaun.tinyarbrowser.samples">

This also means that you'll need to shuffle a few classes around. 这也意味着你需要改变几个类。 The classes in the samples module that are currently under com.kkaun.tinyarbrowser will need to move into com.kkaun.tinyarbrowser.samples . 当前在com.kkaun.tinyarbrowser下的samples模块中的类将需要移动到com.kkaun.tinyarbrowser.samples

Also, references to resources would also need to move. 此外,还需要移动对资源的引用。 So for example, if you're doing this: 例如,如果你这样做:

import com.kkaun.tinyarbrowser.R

Then it'd need to get updated to this 然后它需要更新到这个

import com.kkaun.tinyarbrowser.samples.R

There could be a few other small references that would need to be updated, but this should get you most of the way there. 可能还有一些其他需要更新的小参考,但这应该可以让你大部分时间都在那里。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM