3

When I try to run my app on phisical device I got the error path may not be null or empty string. path='null' in build phase of the project but the build run nice if i try to run the app on the emulator.

I made some experiment and I found out that this behavior is due to minifyEnabled = true but I have not found a way to understand which path is null and why.

Is there somebody who has already solved any problem like this one?

This is my build.gradle file

buildscript {
    repositories {
        maven { url 'https://maven.fabric.io/public' }
    }

    dependencies {
        classpath 'io.fabric.tools:gradle:1.+'
    }
}

repositories {
    maven { url 'https://maven.fabric.io/public' }
}

import com.android.build.OutputFile;

apply plugin: 'com.android.application'
apply plugin: 'realm-android'
apply plugin: 'io.fabric'
apply plugin: 'let'
apply plugin: "org.sonarqube"

Properties localProperties = new Properties()
try {
    localProperties.load(project.rootProject.file('local.properties').newDataInputStream())
} catch (Exception e) {
    localProperties = null
}

def versionMajor = 0  // Max one digit
def versionMinor = 2  // Max one digit
def versionPatch = 6  // Max one digit
def versionBuild = 6  // Max two digits: bump for dogfood builds, public betas, etc.

android {
    compileSdkVersion 25
    buildToolsVersion "25.0.3"
    defaultConfig {
        minSdkVersion 16
        targetSdkVersion 25
        renderscriptTargetApi 17
        renderscriptSupportModeEnabled true
        versionCode versionMajor * 10000 + versionMinor * 1000 + versionPatch * 100 + versionBuild
        versionName "${versionMajor}.${versionMinor}.${versionPatch}"
        multiDexEnabled true
        dataBinding {
            enabled = true
        }
        vectorDrawables.useSupportLibrary = true
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        testInstrumentationRunnerArguments disableAnalytics: 'true' // Analytics opt-out.
    }
    productFlavors {
        envProd {
            applicationId "xxx"
            buildConfigField("String", "API_KEY", "xxx")

            crashlytics {
                enableNdk true
                androidNdkOut 'build/intermediates/transforms/mergeJniLibs/envProd/release/folders/2000/1f/main/lib/'
                androidNdkLibsOut 'build/intermediates/transforms/stripDebugSymbol/envProd/release/folders/2000/1f/main/lib'
            }

        }
        envTest {
            applicationId "xxx"
            buildConfigField("String", "API_KEY", "xxx")

            crashlytics {
                enableNdk true
                androidNdkOut 'build/intermediates/transforms/mergeJniLibs/envTest/release/folders/2000/1f/main/lib/'
                androidNdkLibsOut 'build/intermediates/transforms/stripDebugSymbol/envTest/release/folders/2000/1f/main/lib'
            }

        }
    }
    signingConfigs {
        release {
            if (localProperties != null) {
                storeFile file(localProperties['store.file'])
                storePassword localProperties['store.password']
                keyAlias localProperties['key.alias']
                keyPassword localProperties['key.password']
            }
        }
    }
    buildTypes {
        all {
            buildConfigField "java.util.Date", "BUILD_DATE", "new java.util.Date(" + System.currentTimeMillis() + "L)"
        }
        debug {
            applicationIdSuffix ".debug"
            ext.enableCrashlytics = false // Disable fabric build ID generation for debug builds
            ndk {
                abiFilters = []
                abiFilters.addAll(['armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64'])
            }
        }
        release {
            signingConfig signingConfigs.release
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'),
                    'proguard-crashlytics.pro',
                    'proguard-rules.pro',
                    'proguard-support-v7-appcompat.pro',
                    'proguard-google-play-services.pro',
                    'proguard-eventbus.pro',
                    'proguard-let.pro',
                    'proguard-gson.pro',
                    'proguard-guava.pro',
                    'proguard-aws.pro',
                    'proguard-calligraphy.pro'
            ndk {
                abiFilters = []
                abiFilters.addAll(['armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64'])
            }
        }
    }
    splits {
        abi {
            enable true
            reset()
            include 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64'
            universalApk false
        }
    }
    packagingOptions {
        pickFirst 'lib/armeabi-v7a/libopencv_imgproc.so'
        pickFirst 'lib/armeabi-v7a/libopencv_core.so'
        pickFirst 'lib/arm64-v8a/libopencv_imgproc.so'
        pickFirst 'lib/arm64-v8a/libopencv_core.so'
        pickFirst 'lib/x86/libopencv_imgproc.so'
        pickFirst 'lib/x86/libopencv_core.so'
        pickFirst 'lib/x86_64/libopencv_imgproc.so'
        pickFirst 'lib/x86_64/libopencv_core.so'
    }
    dataBinding {
        enabled = true
    }
    testOptions.unitTests.all {
        testLogging { // Always show the result of every unit test, even if it passes.
            events 'passed', 'skipped', 'failed', 'standardOut', 'standardError'
        }
    }
}

dependencies {
    compile project('xxx')
    compile project('xxx')
    compile project('xxx')
    envTestCompile project('xxx')
    envProdCompile project('xxx')
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile('com.crashlytics.sdk.android:crashlytics:2.6.6@aar') {
        transitive = true;
    }
    compile('com.crashlytics.sdk.android:crashlytics-ndk:1.1.6@aar') {
        transitive = true;
    }
    // Testing
    androidTestCompile('com.android.support.test:runner:0.5') {
        exclude module: 'support-annotations'
    }
    // Set this dependency to use JUnit 4 rules
    androidTestCompile('com.android.support.test:rules:0.5') {
        exclude module: 'support-annotations'
    }
    // Set this dependency to build and run Espresso tests
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2') {
        exclude module: 'support-annotations'
    }
    // Set this dependency to build and run UI Automator tests
    androidTestCompile('com.android.support.test.uiautomator:uiautomator-v18:2.1.2') {
        exclude module: 'support-annotations'
    }
    compile 'com.android.support:multidex:1.0.1'
    compile 'com.android.support:appcompat-v7:25.3.1'
    compile 'com.android.support:support-v4:25.3.1'
    compile 'com.google.android.gms:play-services-vision:11.0.4'
    compile 'com.google.android.gms:play-services-location:11.0.4'
    compile 'com.google.android.gms:play-services-safetynet:11.0.4'
    compile 'com.android.support:cardview-v7:25.3.1'
    compile 'com.github.bumptech.glide:glide:3.8.0'
    compile 'jp.wasabeef:glide-transformations:2.0.2'
    compile 'com.google.guava:guava:19.0'
    compile 'com.googlecode.libphonenumber:libphonenumber:8.3.1'
    compile 'uk.co.chrisjenx:calligraphy:2.2.0'
    compile 'org.greenrobot:eventbus:3.0.0'
    compile 'com.github.paolorotolo:appintro:4.1.0'
    compile 'com.facebook.rebound:rebound:0.3.8'
    compile 'com.android.support.constraint:constraint-layout:1.0.0-beta4'
    compile 'com.android.support:recyclerview-v7:25.3.1'
    compile 'com.android.support:design:25.3.1'
    compile 'com.amazonaws:aws-android-sdk-core:2.6.11'
    compile 'com.amazonaws:aws-android-sdk-s3:2.6.11'
    testCompile 'junit:junit:4.12'
    testCompile 'org.hamcrest:hamcrest-core:1.3'
    androidTestCompile 'org.mockito:mockito-core:1.10.19'
    androidTestCompile 'com.crittercism.dexmaker:dexmaker:1.4'
    androidTestCompile 'com.crittercism.dexmaker:dexmaker-dx:1.4'
    androidTestCompile 'com.crittercism.dexmaker:dexmaker-mockito:1.4'
}


// map for the version code, max 2 digits
project.ext.abiCodes = ['armeabi': 1, 'armeabi-v7a': 2, 'arm64-v8a': 3, 'mips': 5, 'mips64': 6, 'x86': 8, 'x86_64': 9]

android.applicationVariants.all { variant ->
    // assign different version code for each output
    variant.outputs.each { output ->
        output.versionCodeOverride =
                (variant.mergedFlavor.getMinSdkVersion().getApiLevel() * 10000000
                        + project.ext.abiCodes.get(output.getFilter(OutputFile.ABI)) * 100000
                        + variant.mergedFlavor.versionCode)
    }
}

This is the full stacktrace of the error:

java.lang.IllegalArgumentException: path may not be null or empty string. path='null'
    at org.gradle.api.internal.file.BaseDirFileResolver.doResolve(BaseDirFileResolver.java:72)
    at org.gradle.api.internal.file.AbstractFileResolver.resolve(AbstractFileResolver.java:79)
    at org.gradle.api.internal.file.AbstractFileResolver.resolve(AbstractFileResolver.java:61)
    at org.gradle.api.internal.file.collections.DefaultFileCollectionResolveContext$FileCollectionConverter.convertInto(DefaultFileCollectionResolveContext.java:173)
    at org.gradle.api.internal.file.collections.DefaultFileCollectionResolveContext.doResolve(DefaultFileCollectionResolveContext.java:134)
    at org.gradle.api.internal.file.collections.DefaultFileCollectionResolveContext.resolveAsFileCollections(DefaultFileCollectionResolveContext.java:92)
    at org.gradle.api.internal.file.collections.DefaultFileCollectionResolveContext$FileCollectionConverter.convertInto(DefaultFileCollectionResolveContext.java:157)
    at org.gradle.api.internal.file.collections.DefaultFileCollectionResolveContext.doResolve(DefaultFileCollectionResolveContext.java:109)
    at org.gradle.api.internal.file.collections.DefaultFileCollectionResolveContext.resolveAsFileCollections(DefaultFileCollectionResolveContext.java:92)
    at org.gradle.api.internal.file.CompositeFileCollection.getSourceCollections(CompositeFileCollection.java:172)
    at org.gradle.api.internal.file.CompositeFileCollection.visitRootElements(CompositeFileCollection.java:184)
    at org.gradle.api.internal.changedetection.state.AbstractFileCollectionSnapshotter.snapshot(AbstractFileCollectionSnapshotter.java:78)
    at org.gradle.api.internal.changedetection.rules.AbstractNamedFileSnapshotTaskStateChanges.buildSnapshots(AbstractNamedFileSnapshotTaskStateChanges.java:87)
    at org.gradle.api.internal.changedetection.rules.AbstractNamedFileSnapshotTaskStateChanges.<init>(AbstractNamedFileSnapshotTaskStateChanges.java:54)
    at org.gradle.api.internal.changedetection.rules.InputFilesTaskStateChanges.<init>(InputFilesTaskStateChanges.java:28)
    at org.gradle.api.internal.changedetection.rules.TaskUpToDateState.<init>(TaskUpToDateState.java:55)
    at org.gradle.api.internal.changedetection.changes.DefaultTaskArtifactStateRepository$TaskArtifactStateImpl.getStates(DefaultTaskArtifactStateRepository.java:164)
    at org.gradle.api.internal.changedetection.changes.DefaultTaskArtifactStateRepository$TaskArtifactStateImpl.isUpToDate(DefaultTaskArtifactStateRepository.java:79)
    at org.gradle.api.internal.tasks.execution.SkipUpToDateTaskExecuter.execute(SkipUpToDateTaskExecuter.java:51)
    at org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter.execute(ValidatingTaskExecuter.java:58)
    at org.gradle.api.internal.tasks.execution.SkipEmptySourceFilesTaskExecuter.execute(SkipEmptySourceFilesTaskExecuter.java:88)
    at org.gradle.api.internal.tasks.execution.ResolveTaskArtifactStateTaskExecuter.execute(ResolveTaskArtifactStateTaskExecuter.java:46)
    at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:51)
    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.execute(DefaultTaskGraphExecuter.java:236)
    at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker$1.execute(DefaultTaskGraphExecuter.java:228)
    at org.gradle.internal.Transformers$4.transform(Transformers.java:169)
    at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:106)
    at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:61)
    at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker.execute(DefaultTaskGraphExecuter.java:228)
    at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker.execute(DefaultTaskGraphExecuter.java:215)
    at org.gradle.execution.taskgraph.AbstractTaskPlanExecutor$TaskExecutorWorker.processTask(AbstractTaskPlanExecutor.java:77)
    at org.gradle.execution.taskgraph.AbstractTaskPlanExecutor$TaskExecutorWorker.run(AbstractTaskPlanExecutor.java:58)
    at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor.process(DefaultTaskPlanExecutor.java:32)
    at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter.execute(DefaultTaskGraphExecuter.java:113)
    at org.gradle.execution.SelectedTaskExecutionAction.execute(SelectedTaskExecutionAction.java:37)
    at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:37)
    at org.gradle.execution.DefaultBuildExecuter.access$000(DefaultBuildExecuter.java:23)
    at org.gradle.execution.DefaultBuildExecuter$1.proceed(DefaultBuildExecuter.java:43)
    at org.gradle.execution.DryRunBuildExecutionAction.execute(DryRunBuildExecutionAction.java:32)
    at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:37)
    at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:30)
    at org.gradle.initialization.DefaultGradleLauncher$3.execute(DefaultGradleLauncher.java:196)
    at org.gradle.initialization.DefaultGradleLauncher$3.execute(DefaultGradleLauncher.java:193)
    at org.gradle.internal.Transformers$4.transform(Transformers.java:169)
    at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:106)
    at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:56)
    at org.gradle.initialization.DefaultGradleLauncher.doBuildStages(DefaultGradleLauncher.java:193)
    at org.gradle.initialization.DefaultGradleLauncher.doBuild(DefaultGradleLauncher.java:119)
    at org.gradle.initialization.DefaultGradleLauncher.run(DefaultGradleLauncher.java:102)
    at org.gradle.launcher.exec.GradleBuildController.run(GradleBuildController.java:71)
    at org.gradle.tooling.internal.provider.runner.BuildModelActionRunner.run(BuildModelActionRunner.java:50)
    at org.gradle.launcher.exec.ChainingBuildActionRunner.run(ChainingBuildActionRunner.java:35)
    at org.gradle.tooling.internal.provider.runner.RunAsBuildOperationBuildActionRunner$1.execute(RunAsBuildOperationBuildActionRunner.java:43)
    at org.gradle.tooling.internal.provider.runner.RunAsBuildOperationBuildActionRunner$1.execute(RunAsBuildOperationBuildActionRunner.java:40)
    at org.gradle.internal.Transformers$4.transform(Transformers.java:169)
    at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:106)
    at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:56)
    at org.gradle.tooling.internal.provider.runner.RunAsBuildOperationBuildActionRunner.run(RunAsBuildOperationBuildActionRunner.java:40)
    at org.gradle.tooling.internal.provider.runner.SubscribableBuildActionRunner.run(SubscribableBuildActionRunner.java:75)
    at org.gradle.launcher.exec.ChainingBuildActionRunner.run(ChainingBuildActionRunner.java:35)
    at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:41)
    at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:26)
    at org.gradle.tooling.internal.provider.ContinuousBuildActionExecuter.execute(ContinuousBuildActionExecuter.java:75)
    at org.gradle.tooling.internal.provider.ContinuousBuildActionExecuter.execute(ContinuousBuildActionExecuter.java:49)
    at org.gradle.tooling.internal.provider.ServicesSetupBuildActionExecuter.execute(ServicesSetupBuildActionExecuter.java:44)
    at org.gradle.tooling.internal.provider.ServicesSetupBuildActionExecuter.execute(ServicesSetupBuildActionExecuter.java:29)
    at org.gradle.launcher.daemon.server.exec.ExecuteBuild.doBuild(ExecuteBuild.java:67)
    at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36)
    at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
    at org.gradle.launcher.daemon.server.exec.WatchForDisconnection.execute(WatchForDisconnection.java:47)
    at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
    at org.gradle.launcher.daemon.server.exec.ResetDeprecationLogger.execute(ResetDeprecationLogger.java:26)
    at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
    at org.gradle.launcher.daemon.server.exec.RequestStopIfSingleUsedDaemon.execute(RequestStopIfSingleUsedDaemon.java:34)
    at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
    at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.call(ForwardClientInput.java:74)
    at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.call(ForwardClientInput.java:72)
    at org.gradle.util.Swapper.swap(Swapper.java:38)
    at org.gradle.launcher.daemon.server.exec.ForwardClientInput.execute(ForwardClientInput.java:72)
    at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
    at org.gradle.launcher.daemon.server.exec.LogAndCheckHealth.execute(LogAndCheckHealth.java:55)
    at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
    at org.gradle.launcher.daemon.server.exec.LogToClient.doBuild(LogToClient.java:60)
    at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36)
    at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
    at org.gradle.launcher.daemon.server.exec.EstablishBuildEnvironment.doBuild(EstablishBuildEnvironment.java:72)
    at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36)
    at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
    at org.gradle.launcher.daemon.server.exec.StartBuildOrRespondWithBusy$1.run(StartBuildOrRespondWithBusy.java:50)
    at org.gradle.launcher.daemon.server.DaemonStateCoordinator$1.run(DaemonStateCoordinator.java:297)
    at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:54)
    at org.gradle.internal.concurrent.StoppableExecutorImpl$1.run(StoppableExecutorImpl.java:40)
TheOni
  • 810
  • 9
  • 26
  • Which line causes the error? – Code-Apprentice Dec 27 '17 at 13:43
  • If I comment out the line "minifyEnabled true" the build completes successfully also when running on a smartphone – TheOni Dec 27 '17 at 14:48
  • That doesn't answer my question. – Code-Apprentice Dec 27 '17 at 14:51
  • @Code-Apprentice The error is caused by the line "minifyEnabled true".... I got this stacktrace: **java.lang.IllegalArgumentException: path may not be null or empty string. path='null' at org.gradle.api.internal.file.BaseDirFileResolver.doResolve(BaseDirFileResolver.java:72) at org.gradle.api.internal.file.AbstractFileResolver.resolve(AbstractFileResolver.java:79)** – TheOni Dec 27 '17 at 14:57
  • 1
    `minifyEnabled true` does not have any path, so it cannot be the line that causes the error. Which line contains the path that is null? – Code-Apprentice Dec 27 '17 at 15:00
  • I don't know which path is null else I was not asking for help! The only thing that I know is that if I comment out the line with minifyEnabled the builds complete without any error – TheOni Dec 27 '17 at 15:02
  • I understand that removing `minify true` causes the error to go away. However, this is not the true cause of the error. For more help, you should [edit] your question to show the entire stack trace. – Code-Apprentice Dec 27 '17 at 15:04
  • I added the stacktrace – TheOni Dec 27 '17 at 15:45
  • Check out https://stackoverflow.com/questions/45387761/android-proguard-issue-path-may-not-be-null-or-empty-string-path-null which seems to be about the same problem – Code-Apprentice Dec 27 '17 at 16:10
  • Do you have a file named `local.properties`? – Code-Apprentice Dec 27 '17 at 16:11
  • Yes, I have a local.properties file containing the path of the keystore and the passwords. I have already checked the question you reported but it seems to be something different as I have the problem only if i launch a run on a "real" device but it works fine on emulator and I found very strange this behaviour as the build configuration is the same for the 2 environment – TheOni Dec 27 '17 at 18:36
  • 1
    When you launch on an emulator are you building the release or debug configuration? – Code-Apprentice Dec 28 '17 at 00:21
  • I'm building release configuration in both environment – TheOni Dec 28 '17 at 11:34

1 Answers1

-2

Try to remove this:

Properties localProperties = new Properties()
try {
    localProperties.load(project.rootProject.file('local.properties').newDataInputStream())
} catch (Exception e) {
    localProperties = null
}

and this:

signingConfigs {
    release {
        if (localProperties != null) {
            storeFile file(localProperties['store.file'])
            storePassword localProperties['store.password']
            keyAlias localProperties['key.alias']
            keyPassword localProperties['key.password']
        }
    }
}

and try by signing the build manually

AMT
  • 136
  • 5
  • @TheOni have u tried this? I answered this because I could only find this code segment related to the path. – AMT Jan 08 '18 at 13:53
  • this part of code works fine, if I run it in the emulator the build complete without any error. If I remove minifyEnabled it works fine also if I run it on a phisical device – TheOni Jan 08 '18 at 18:14