小编Ali*_*lix的帖子

在整个应用程序中处理多个实验注释

我有一个应用程序大量使用 Jetpack Compose 的实验功能,因此我必须在可组合项上声明一堆注释。由于这些注释要求调用者也声明它们,所以我最终遇到了以下情况:我有一个包含以下代码的活动:

\n
import androidx.appcompat.app.AppCompatActivity\n\nimport androidx.compose.material.ExperimentalMaterialApi\nimport androidx.compose.ui.ExperimentalComposeUiApi\n\nimport com.google.accompanist.navigation.material.ExperimentalMaterialNavigationApi\nimport com.google.accompanist.pager.ExperimentalPagerApi\nimport com.google.accompanist.permissions.ExperimentalPermissionsApi\n\xe2\x80\xa6\n\nclass MainActivity : AppCompatActivity() {\n\n    @ExperimentalPermissionsApi\n    @ExperimentalComposeUiApi\n    @ExperimentalPagerApi\n    @ExperimentalMaterialNavigationApi\n    @ExperimentalMaterialApi\n    override fun onCreate(savedInstanceState: Bundle?) {\n        // \xe2\x80\xa6 wiring up compose code (which propagates the experimental annotations)\n
Run Code Online (Sandbox Code Playgroud)\n

避免这种情况的另一种方法是使用@OptIn,但由于每个声明只允许使用一个,因此它不适用于我的具有多个实验功能的情况。

\n

无论如何\xe2\x80\xa6 这在 Kotlin 1.5 中 \xe2\x80\x94 工作得很好。

\n

使用 Kotlin 1.6 我收到编译错误:

\n
\n

覆盖上的选择加入要求标记注释需要基本声明上的相同标记

\n
\n

但基本声明位于标准 API 中,我无法更改。\n如何进行编译(并像以前一样工作)?

\n

android kotlin-experimental android-jetpack-compose

19
推荐指数
4
解决办法
1万
查看次数

在Android项目中使用'compileOnly'范围?

我在我的项目中使用Gradle 2.12(或更新版本)和适当版本的Android Gradle插件.Gradle 2.12引入了  compileOnly配置,为什么我尝试使用它时会出现错误?

无法为参数找到方法compileOnly()

gradle android-gradle-plugin

10
推荐指数
2
解决办法
3923
查看次数

如何将 Robolectric 和 AndroidX 与 Jetpack Compose 结合起来构建单元测试?

假设

  • Robolectric 控制要模拟哪个 Android 版本,所以我需要这个
  • AndroidX 有 Jetpack Compose 的测试 API,所以我也需要这个

背景

在运行完整的测试套件时,我经历了很多AppNotIdleException,但大多数情况下它们都是单独成功运行的(相关: https: //github.com/robolectric/robolectric/issues/7055)。我想确切地了解这两个 API 应如何组合以避免出现问题。

对于初学者来说,Robolectric 中有一个称为“Looper 模式”的配置,它基本上定义了何时执行不同的线程。从 Robolectric 4.5 开始,默认值是“PAUSED”,这意味着开发人员应该控制线程的执行时间。

此外,AndroidX 提供了createComposeRule(),这使得使用单个可组合项构建最小的单元测试成为可能 - 非常好。 此“撰写规则”附带一个“mainClock”,其默认行为为“自动前进”

问题

给出一个带有按钮的简单可组合项。我的测试的推荐设置(注释、时钟配置等)是什么?假设我希望测试针对 Android P (API=28) 运行。欢迎任何反馈。我想尽可能保持测试整洁。

代码

这就是我今天编写测试的方式:

@Config(sdk = [Build.VERSION_CODES.P])
@RunWith(AndroidJUnit4::class)
@LooperMode(LooperMode.Mode.PAUSED)
class MyComposablesKtTest {

    @get:Rule
    val composeTestRule = createComposeRule()

    private val buttonNode get() = composeTestRule.onNodeWithContentDescription("My Button")

    @Before
    fun setUp() {
        composeTestRule.mainClock.autoAdvance = false
    }

    @Test
    fun `MyComposable - …
Run Code Online (Sandbox Code Playgroud)

robolectric kotlin androidx-test android-jetpack-compose

8
推荐指数
0
解决办法
845
查看次数

Gradle 5中工件的分类?

问题:发布 gradle 项目的 javadoc 和源代码。以下代码运行良好,即使在 Gradle 5.1.1 上也是如此:

task sourcesJar(type: Jar) {
    from android.sourceSets.main.java.srcDirs
    classifier = 'sources'
}

task javadoc(type: Javadoc) {
    source = android.sourceSets.main.java.srcDirs
    classpath += project.files(android.getBootClasspath().join(File.pathSeparator))
}

task javadocJar(type: Jar, dependsOn: javadoc) {
    classifier = 'javadoc'
    from javadoc.destinationDir
}

artifacts {
    archives javadocJar
    archives sourcesJar
}
Run Code Online (Sandbox Code Playgroud)

但是,在 Gradle 5.1.1 中,不推荐使用以下语句:

classifier = 'sources'

...

classifier = 'javadoc'
Run Code Online (Sandbox Code Playgroud)

查看评估方法名称的 javadoc 显示:

已弃用。使用 getArchiveClassifier()

来源:https : //docs.gradle.org/current/javadoc/org/gradle/api/tasks/bundling/AbstractArchiveTask.html#setClassifier-java.lang.String-

这对我来说没有意义。

我的代码需要进行哪些更改才能继续工作而不被弃用?

android gradle

7
推荐指数
1
解决办法
2419
查看次数

在 Android 10 上进行后台扫描时的限制?

Android 上的蓝牙扫描似乎有很多“隐藏功能”。对于初学者来说,有一个“30 秒限制”(Android 7.0 ble scan no result)。然后你必须在后台模式下设置一个 ScanFilter 否则你不会得到任何结果(找不到这个的参考)。

最近我发现,当我在 Android 10 上使用以下扫描模式启用扫描并关闭屏幕(大约 30 秒后)时,我没有得到任何扫描结果(我在 Google Pixel 3 和 Google Pixel 4 上观察到了这种行为) ,它在较旧的 Android 上运行良好):

/**
 * Perform Bluetooth LE scan in balanced power mode. Scan results are returned at a rate that
 * provides a good trade-off between scan frequency and power consumption.
 */
public static final int SCAN_MODE_BALANCED = 1;
Run Code Online (Sandbox Code Playgroud)

还有另一种扫描模式(我还没有尝试过):

/**
 * Perform Bluetooth LE scan in low power mode. This is the …
Run Code Online (Sandbox Code Playgroud)

android android-ble google-pixel android-10.0

7
推荐指数
1
解决办法
1275
查看次数

如何测试AlertDialog的onDismissRequest属性?

最简单的形式是这样的对话框:


@Composable
fun MyDialog(
    showDialogState: MutableState<Boolean>
) {
    if (showDialogState.value) {
        AlertDialog(onDismissRequest = { showDialogState.value = false },
            // Other irrelevant attributes have been omitted
        )
    }
}
Run Code Online (Sandbox Code Playgroud)

如何在 Robolectric 中的此可组合项上触发“onDismissRequest”?

这通常是我构建可组合测试的方式:

@Config(sdk = [Build.VERSION_CODES.O_MR1])
@RunWith(AndroidJUnit4::class)
@LooperMode(LooperMode.Mode.PAUSED)
class MyDialogTest {

    @get:Rule
    val composeTestRule = createComposeRule()

    @Test
    fun `MyDialog - when showing state and dismissed - changes showing state`() {
        val state = mutableStateOf(true)
        composeTestRule.setContent {
            MyDialog(
                showDialogState = state
            )
        }

        // TODO: How do I trigger dismiss!?
        
        assertFalse(state.value)
    } …
Run Code Online (Sandbox Code Playgroud)

robolectric android-alertdialog android-jetpack-compose

7
推荐指数
1
解决办法
1331
查看次数

Robolectric 2.4中的android.content.res.Resources $ NotFoundException

从命令行运行单元测试时,我无法加载资源.它在IntelliJ中工作正常.

我正在使用:

  • com.android.tools.build:gradle:1.1.3
  • org.robolectric:robolectric-gradle这个-插件:1.0.1
  • org.robolectric:robolectric:2.4

我有以下项目结构(多模块):

+---module1
|   |   build.gradle
    |   \---src
    |       +---main
    |       |   |   AndroidManifest.xml
    |       |   |   
    |       |   +---res
    |       |   |   \---values
    |       |   |           strings.xml
    |       \---test
    |           \---java
    |               \---example
    |                    |   FooTest.java
+---module2
etc
Run Code Online (Sandbox Code Playgroud)

我的测试(简化)看起来像这样:

@Config(emulateSdk = 18, reportSdk = 18, manifest = "./src/main/AndroidManifest.xml")
@RunWith(RobolectricTestRunner.class)
public class FooTest {

    @Test
    public void test() {
        String result = Robolectric.application.getString(R.string.error_message);

         assertThat(result, notNullValue());
    }
 }
Run Code Online (Sandbox Code Playgroud)

我得到这个堆栈跟踪:

android.content.res.Resources$NotFoundException: unknown resource 2131361826
at org.robolectric.shadows.ShadowAssetManager.getAndResolve(ShadowAssetManager.java:311)
at org.robolectric.shadows.ShadowAssetManager.getResourceText(ShadowAssetManager.java:69) …
Run Code Online (Sandbox Code Playgroud)

android robolectric robolectric-gradle-plugin

6
推荐指数
1
解决办法
1531
查看次数

在现代Gradle Android项目中正确配置"sonar.libraries"

我想要实现的目标:

在声纳中,可以通过设置属性"sonar.libraries"来跟踪整个Projects中使用的第三方依赖项,并且可能还有更多好处(例如检测哪些违规是由外部库引起的?)

我试图做的:

我将值设置为build/intermediates/pre-dexed/debug/*.jar但这似乎没什么影响.

题:

由于不再需要将"libs"文件夹用于第三方依赖项,因此对于名为"sonar.libraries"的属性的建议是什么?

android android-gradle-plugin sonarqube

6
推荐指数
1
解决办法
4345
查看次数

质量配置文件的多重继承

我发现质量配置文件需要多重继承,以避免在升级时进行不必要的手动操作.

例如,我们希望继承"Sonar Way"和"Android Lint"中的所有规则,并在每次升级后恢复内置配置文件,确保我们始终保持最新状态.

这个功能是否计划好了?

sonarqube

5
推荐指数
1
解决办法
586
查看次数

为什么 squid:S1166 仅在记录捕获的异常时才接受异常消息?

引自规则描述(SonarQube 4.5.5):

// Noncompliant - exception is lost (only message is preserved)   
try { /* ... */ } 
catch (Exception e) { LOGGER.info(e.getMessage()); }
Run Code Online (Sandbox Code Playgroud)

通过向记录器提供异常类,将堆栈跟踪写入日志。

我们代码库中的问题是这样的:通过遵循Tell, don't ask原则,我们使用检查异常作为我们考虑的正常执行路径的一部分,我们不希望它们导致不合理的大日志消息.

几个例子:服务器响应错误代码,数据库语句执行失败,乐观锁定(并发用户)......

我的建议:将这个案例一分为二。

// Noncompliant - exception is lost (only message is preserved)
try { /* ... */ } 
catch (Exception e) { LOGGER.info(e.getMessage()); } 
Run Code Online (Sandbox Code Playgroud)

// Compliant - exception is lost (only message is preserved) but there is business logic handling the situation      

try { 
/* ... */  
} catch …
Run Code Online (Sandbox Code Playgroud)

java sonarqube sonarqube-4.5

5
推荐指数
1
解决办法
2821
查看次数