2016-03-04 64 views
6

我將較舊的Android應用程序遷移到Android-Studio/Gradle。測試需要uiautomator-v18,這需要minSdkVersion=18。不過,我想將minSdkVersion設置爲15或16.Android:如何使用低於庫中聲明的minSdkVersion(uiautomator-v18)

在同樣的事情上有很多問題,但我只是無法解決這個問題。

Exerpt的AndroidManifest.xml:

<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    package="com.example.searcher" 
    android:versionCode="1" 
    android:versionName="0.0.1" > 

    <uses-sdk 
     tools:overrideLibrary="android.support.test.uiautomator.v18"/> 

    <!-- ... --> 

</manifest> 

的的build.gradle:

apply plugin: 'com.android.application' 

android { 
    compileSdkVersion 23 
    buildToolsVersion "23.0.2" 

    defaultConfig { 
     applicationId "com.example.searcher" 
     minSdkVersion 15 
     targetSdkVersion 23 
     testApplicationId "com.example.searcher.test" 
     testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" 
    } 
} 

dependencies { 
    compile 'com.android.support:appcompat-v7:23.2.0' 
    compile 'com.google.android.gms:play-services-analytics:8.4.0' 
    compile files('libs/dagger-1.2.1.jar') 
    compile files('libs/dagger-compiler-1.2.1.jar') 
    compile files('libs/javawriter-2.1.2.jar') 
    compile files('libs/javax.inject.jar') 

    androidTestCompile(
     'com.android.support:support-annotations:23.2.0', 
     'com.android.support.test:runner:0.4.1', 
     'com.android.support.test:rules:0.4.1', 
     'com.android.support.test.uiautomator:uiautomator-v18:2.1.1', 
     'org.hamcrest:hamcrest-library:1.3', 
     'org.mockito:mockito-core:1.10.5', 
     'junit:junit:4.12', 
     'com.google.dexmaker:dexmaker:1.1', 
     'com.google.dexmaker:dexmaker-mockito:1.1' 
    ) 
} 

上面給出了錯誤:

Error:Execution failed for task ':app:processDebugAndroidTestManifest'. 
> java.lang.RuntimeException: Manifest merger failed : uses-sdk:minSdkVersion 15 cannot be smaller than version 18 declared in library [com.android.support.test.uiautomator:uiautomator-v18:2.1.1] /mypath/app/build/intermediates/exploded-aar/com.android.support.test.uiautomator/uiautomator-v18/2.1.1/AndroidManifest.xml 
    Suggestion: use tools:overrideLibrary="android.support.test.uiautomator.v18" to force usage 

但我已經在使用overrideLibrary

如果這是不可能的,是否有可能有不同的minSdkVersion「main」和「androidTest」?

編輯: 添加香精後,我能夠運行使用建變種tstDebug測試。但是,使用prdDebug構建它會以androidTest中存在未知內容的錯誤結束(例如:package org.hamcrest does not exist)。的build.gradle修改後的摘錄:

defaultConfig { 
    applicationId "com.example.searcher" 
    targetSdkVersion 23 
    versionCode 6 
    versionName "0.5.0" 
} 

productFlavors { 
    prd { 
     minSdkVersion 15 
    } 
    tst { 
     minSdkVersion 18 
     testApplicationId "com.example.searcher.test" 
     testInstrumentationRunner "android.test.InstrumentationTestRunner" 
    } 
} 

// And instead of "androidTestCompile" use "tstCompile" 

是沒可能告訴「機器人工作室」,它應該構建應用程序,而不androidTest

+0

你嘗試過在你的overrideLibrary的AndroidManifest改變的版本? – Sree

+0

@Sree:是的,同樣的問題。 – tokosh

+0

我終於可以使它與「味道」運行:我沒有正確地命名風味測試。所以,對於味道「開發」測試文件夾應該是「androidTestDev」。我在這找到[answer](http://stackoverflow.com/a/28092437/3045181) – tokosh

回答

5

一個選項是爲您的測試產品的味道:

android { 
    productFlavors { 
     production { 
      minSdkVersion 15 
     } 
     uiTest { 
      minSdkVersion 18 
     } 
    } 
... 
} 

,然後在uiTest味道構建運行測試。

+0

對不起,遲到了。最後,我使用更低的'minSdkVersion'運行測試。我錯過的是在「Android Studio」中設置構建變體。沒有它,測試不能運行。我更喜歡用'overrideLibrary'來實現這一點(因爲在我看來這是它的目的)。但是,花了足夠的時間。 – tokosh

+0

如果不是產品味道,您需要增加buildType中的minSdkVersion,只需使用defaultConfig包裝minSdkVersion,如下所示:'espresso {0}默認配置{ minSdkVersion 18 }} –

8

你把<uses-sdk tools:overrideLibrary ...>src/main/AndroidManifest.xml

如果是這樣,請將其從src/main/AndroidManifest.xml中刪除,並嘗試將以下xml放入src/androidTest/AndroidManifest.xml

(不要忘記android:minSdkVersion="18"

<?xml version="1.0" encoding="utf-8"?> 
<manifest 
    package="YOUR PACKAGE NAME" 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools"> 

    <uses-sdk 
     android:minSdkVersion="18" 
     tools:overrideLibrary="android.support.test.uiautomator.v18" 
     /> 
</manifest> 
+0

感謝您的答覆。src/androidTest /中的'AndroidManifest.xml'是自動生成的。如果我在gradle.build中使用'minSdkVersion',它將在build /中使用gradle.build中的值創建一個'AndroidManifest.xml'。如果我未定義'minSdkVersion',它將默認使用版本'1',這也會導致錯誤。 – tokosh

+0

@tokosh更確切地說,你的'build.gradle'和'src/androidTest/AndroidManifest.xml'中的'minSdkVersion'被合併到'build/intermediates/manifest/androidTest/debug/AndroidManifest.xml'中。因此,存儲'src/androidTest/AndroidManifest.xml'非常重要。 我證實,它在以下環境: - 安卓1.5.1工作室 - Android的搖籃插件1.5.0 - 'minSdkVersion'在'應用程序/ build.gradle':16 – sumio

+0

除了以前的評論中,合併的AndroidManifest.xml仍然有'android:minSdkVersion =「16」'。那沒問題。聲明'tools:overrideLibrary'將防止清單合併失敗編譯。 – sumio