【问题标题】:Android Studio code depending on SDKAndroid Studio 代码取决于 SDK
【发布时间】:2016-12-21 09:49:01
【问题描述】:

我正在使用 Android Studio 开发一个 Android 应用程序,它将使用带有条形码扫描仪的工业设备。 其中一些(来自不同公司的不同型号)使用特殊的 SDK(我必须使用特殊的 SDK 进行编译,而不仅仅是 API 23)。

我的问题是,当我切换到其他设备并且必须使用其他 SDK(或仅使用 API 23)进行编译时,我的一些代码不再起作用:导入不存在所以我用于特定设备的对象和方法也不是。

我的代码如下所示:

if(Build.MANUFACTURER.equals(COMPANY_NAME)){
    // do some stuff that won't compile with an other sdk
}else if (Build.MANUFACTURER.equals(COMPANY_NAME)){
    // do some other stuff that compile with a specific sdk too...
}else if (...){
    ...
}

我不想删除代码或将其放在注释中,因为它只会在特定设备上执行(而且我不想每次想为特定 SDK 编译时取消注释某些代码) .

我怎样才能保留我的代码(并且不必将其放在注释中)而不显示其他 SDK 的错误?

到目前为止我发现了什么:

  • compileSdkVersion 似乎无法在product flavors 中设置
  • 我们可以根据这样的条件放置 compileSdkVersion:

    如果(条件){

     compileSdkVersion 23
    

    } 否则 {

    compileSdkVersion 'Datalogic:Datalogic SDK v1:23'
    

    }

但条件不能来自产品风味,因为它是在那之后执行的。一个“解决方案”是将条件放在 gradle.properties 中,如提到的here 但每次我手动编译时都必须更改它,并且不能解决我的问题,因为处理一些无法在特定 SDK 版本上编译的代码。

【问题讨论】:

    标签: android sdk android-gradle-plugin


    【解决方案1】:

    如果你的代码依赖于特殊设备,你应该使用不同的风格。

    productFlavors {
        normal {
            resValue "string", "someApiKey", "1111"
        }
    
        samsung {
            applicationId 'com.example.special' // change the package name
    
            resValue "string", "someApiKey", "2222"
        }
        instantTest {
            minSdkVersion 21
        }
    }
    

    然后您可以将您的特殊代码存储在src/samsung/java 而不是src/main/java。上面的someApiKey可以通过BuildConfig.someApiKey访问。

    您的依赖项将获得一个特殊的前缀,而不是

    compile 'something:general:0.0'
    

    使用

    samsungCompile 'something:forSamsung:0.0'
    

    关于 API 级别,您应该始终使用最新版本作为目标,并通过运行时检查该方法是否可用,并在这种情况下添加一些后备:

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        // ...
    }
    

    关于不同的构建依赖集的问题,你可以试试这个:

    buildscript {
      dependencies {
        if(!this.properties['target'].equals('datalogic')) {
          compile '...'
        } else {
          // ...
        }
      }
    }
    

    您可以通过-Ptarget=datalogic 指定“目标”,例如试试这个命令:./gradlew -Ptarget=datalogic assambleRelease

    【讨论】:

    • 看起来很有趣,但不是我想要的,或者我误解了。我可以用这个指定 compileSdkVersion 吗?
    • 理论上可以,但不应该。针对旧版 SDK 进行编译是没有意义的。您可以确保在您的代码中不使用已弃用的代码。
    • 我添加了一个我在开发时使用的小示例,以加快即时应用程序的构建。在那里我增加了minSdkVersion
    • 我有一个 SDK 不是由 Google 提供,而是由其他 OEM 提供,其中包含标准 SDK 中不存在的特定代码(例如,与棒棒糖无关)。看起来像这样:compileSdkVersion 'Company:Company SDK v1:23'
    • 这是一个非常有趣的案例,我以前从未遇到过。请问您使用的是哪个SDK?但是我认为这应该可以正常工作。由于对非现有代码的引用将具有不同的风格,因此您看不到或获得无法解决的引用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-08
    • 2019-12-13
    • 1970-01-01
    • 1970-01-01
    • 2021-03-04
    • 1970-01-01
    相关资源
    最近更新 更多