小编nho*_*ass的帖子

迁移到AndroidX时无法解析变量'$ {animal.sniffer.version}'

我正在使用Android Studio 3.2 Beta5将我的项目迁移到AndroidX.当我重建我的应用程序时,我遇到了这些错误:

错误:[TAG]无法解析变量'$ {animal.sniffer.version}'

错误:[TAG]无法解析变量'$ {junit.version}'

完全清洁和重建不起作用!有人知道怎么修这个东西吗?请帮我.

gradle.properties

android.enableJetifier=true
android.useAndroidX=true
Run Code Online (Sandbox Code Playgroud)

的build.gradle

buildscript {
    repositories {
        google()
        jcenter()
        mavenCentral()
        maven { url 'https://maven.fabric.io/public' }
        maven { url "https://oss.sonatype.org/content/repositories/snapshots" }
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.2.0-beta05'

        classpath 'com.google.gms:google-services:4.0.1'
        classpath "io.realm:realm-gradle-plugin:5.3.1"
        classpath 'io.fabric.tools:gradle:1.25.4'
        classpath 'com.google.firebase:firebase-plugins:1.1.5'
    }
}

allprojects {
    repositories {
        google()
        jcenter()
        mavenCentral()
        maven { url "https://oss.sonatype.org/content/repositories/snapshots" }
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}
Run Code Online (Sandbox Code Playgroud)

应用程序/的build.gradle

apply plugin: 'com.android.application'
apply plugin: 'realm-android'
apply plugin: 'io.fabric' …
Run Code Online (Sandbox Code Playgroud)

android android-studio android-studio-3.0 android-studio-3.2 androidx

125
推荐指数
6
解决办法
5万
查看次数

不支持的方法:AndroidProject.getVariantNames()

我刚刚更新到Android Studio 3.4 Canary 5.然后我打开我现有的项目(在Android Studio 3.3 beta上完美运行)并收到此错误:

ERROR: Unsupported method: AndroidProject.getVariantNames().
The version of Gradle you connect to does not support that method.
To resolve the problem you can change/upgrade the target version of Gradle you connect to.
Alternatively, you can ignore this exception and read other information from the model.
Run Code Online (Sandbox Code Playgroud)

完全清理和重建,无效缓存和重新启动,重新导入项目不起作用.

gradle-wrapper.properties:

distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-4.4-all.zip
Run Code Online (Sandbox Code Playgroud)

build.gradle(项目级别):

dependencies {
        classpath 'com.android.tools.build:gradle:3.1.3'
}
Run Code Online (Sandbox Code Playgroud)

关于Android Studio

Android Studio 3.4 Canary 5
Build #AI-183.4284.36.34.5141831, built on …
Run Code Online (Sandbox Code Playgroud)

android android-gradle-plugin

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

IOException:升级到Android Studio 3.1时无法找到字节代码

昨天,谷歌宣布Android Studio 3.1现在可以在稳定发布渠道下载.所以我决定尝试一下.

在此之前,我的项目已成功构建,但在我将AS升级到com.android.tools.build:gradle:3.1.0gradle构建工具并com.android.tools.build:gradle:3.1.0(它强制升级gradle包装器4.4)后,它失败并出现以下异常:

java.lang.RuntimeException: com.android.build.api.transform.TransformException: java.lang.RuntimeException: java.lang.RuntimeException: java.io.IOException: Failed to find byte code for android/hardware/camera2/CameraManager$TorchCallback
    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 sun.reflect.GeneratedMethodAccessor309.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    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)
    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 …
Run Code Online (Sandbox Code Playgroud)

android android-studio android-gradle-plugin android-studio-3.1

35
推荐指数
3
解决办法
2万
查看次数

Kotlin的实用工具课程

在Java中,我们可以创建一个这样的utils类:

final class Utils {
    public static boolean foo() {
        return false;
    }
}
Run Code Online (Sandbox Code Playgroud)

但是如何在Kotlin做到这一点?

我尝试过使用里面的函数object:

object Utils {
    fun foo(): Boolean {
        return false
    }
}
Run Code Online (Sandbox Code Playgroud)

但是当从Java代码调用此方法时,需要添加INSTANCE.例如:Utils.INSTANCE.foo().

然后我改为将其声明为顶级函数(不带classobject):

@file:JvmName("Utils")
@file:JvmMultifileClass

fun foo(): Boolean {
    return true
}
Run Code Online (Sandbox Code Playgroud)

然后我可以Utils.foo()从Java代码调用.但是从Kotlin代码我得到了Unresolved reference编译器错误.它只允许foo()直接使用功能(没有Utils).

那么在Kotlin中声明utils类的最佳方法是什么?请帮我!

kotlin

17
推荐指数
2
解决办法
6823
查看次数

React Native 重新加载页面

所以我有一个带有活动的应用程序。该应用程序会在开始时检查 Internet 连接。如果没有 Internet 连接,它将显示一个带有刷新页面按钮的屏幕。问题是我的 API 调用 (Axios) 位于componentDidMount()第一次渲染后仅调用一次的位置。有什么办法可以重新加载页面,以便它调用componentDidMount再次?

我的意思是完全刷新。顺便说一句,我正在使用 EXPO。任何帮助表示赞赏。抱歉,没有示例,如果可能的话,我只是想了解一下

react-native react-native-android react-native-ios expo

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

在Android Studio 3.4中启用R8 Shrinker时,超出了GC开销限制

我正在使用Android Studio 3.4(金丝雀9),当我构建应用程序时,它失败并出现以下错误

任务:app:transformClassesAndResourcesWithR8ForDebug

R8是一项实验功能。如果您遇到任何问题,请使用“收缩器(R8)”作为组件名称,通过https://issuetracker.google.com提交错误。您可以通过使用'android.enableR8 = false'更新gradle.properties来禁用R8。

AGPBI:{“种类”:“警告”,“文本”:“缺少类:java.lang.instrument.ClassFileTransformer”,“源”:[{}],“工具”:“ D8”}

任务:app:transformClassesAndResourcesWithR8ForDebug失败

失败:构建失败,发生异常。

  • 出了什么问题:任务':app:transformClassesAndResourcesWithR8ForDebug'的执行失败。

超出了GC开销限制

当我通过把禁用R8 android.enableR8=falsegradle.properties。一切正常。

那么如何在不禁用R8 Shrinker的情况下解决此错误呢?因为我真的很想测试R8的功能。

android android-studio r8 android-studio-3.4

13
推荐指数
1
解决办法
3168
查看次数

升级到expo 24.0.0时调度不支持的顶级事件类型"topTouchStart"

我正在创建一个react-native项目作为我的博客的示例,但是当我升级24.0.0到sdk版本时意外遇到错误react-native v50.0.

在此输入图像描述

app.json:

{
  "name": "TipCalculator",
  "displayName": "rn_tip_calculator",
  "expo": {
      "name": "TipCalculator",
      "slug": "rn-tip-calculator",
      "sdkVersion": "24.0.0"
    }
}
Run Code Online (Sandbox Code Playgroud)

package.json:

{
  "name": "rn_tip_calculator",
  "version": "0.0.1",
  "private": true,
  "author": "GeniusDoan <nhoxbypass@gmail.com> (https://github.com/nhoxbypass)",
  "repository": "https://github.com/HCMUS-IceTeaViet-SE/rn_tip_calculator",
  "scripts": {
    "start": "node node_modules/react-native/local-cli/cli.js start",
    "test": "jest"
  },
  "dependencies": {
    "expo": "^24.0.0",
    "react": "^16.0.0",
    "react-native": "https://github.com/expo/react-native/archive/sdk-24.0.0.tar.gz",
    "react-native-deprecated-custom-components": "^0.1.0",
    "react-native-i18n": "^1.0.0",
    "react-native-segmented-control-tab": "^3.0.1"
  },
  "devDependencies": {
    "babel-jest": "19.0.0",
    "babel-preset-react-native": "1.9.1",
    "jest": "19.0.2",
    "react-test-renderer": "16.0.0"
  },
  "jest": {
    "preset": "react-native"
  }
}
Run Code Online (Sandbox Code Playgroud)

这个问题在2017年11月是众所周知的,我已经阅读了很多关于Github的问题,它发生在react-native …

react-native react-native-android

8
推荐指数
1
解决办法
4667
查看次数

Android会在更新时清理应用缓存吗?

在本文档中,Google表示:

当用户卸载您的应用程序时,系统会从内部存储中删除所有应用程序的文件.

但是在更新应用程序版本时(例如从v1.0到v1.1),它是否会自动清除应用程序缓存(或内部存储中的任何其他数据)?

因为当我监控我公司的应用程序时,/cache每次我们发布和用户更新到新的应用程序版本时,该文件夹都会下降趋势.

我在手机上进行了测试,看到应用缓存确实减小了尺寸.但我不确定所有设备也是一样的.

android caching

8
推荐指数
1
解决办法
2737
查看次数

尝试模拟 java.lang.System 时发生 MockitoException

我有一个模拟类的静态方法的测试用例java.lang.System

@Test
fun `getLocalTime()`() {
    // Arrange
    val staticMock = Mockito.mockStatic(System::class.java)
    Mockito.`when`(System.currentTimeMillis()).thenReturn(1000L)

    // Action
    val res = deviceTimeProvider.getLocalTime()

    // Assert
    Truth.assertThat(res).isEqualTo(1000L)

    staticMock.close()
}
Run Code Online (Sandbox Code Playgroud)

但是当我运行测试时,我得到了这个错误:

org.mockito.exceptions.base.MockitoException:不可能模拟 java.lang.System 的静态方法以避免干扰类加载,从而导致无限循环

为什么会出现这种情况?我如何模拟java.lang.System类的方法?

java android unit-testing mocking mockito

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

使用一般的固定标头创建JPEG缩略图图像

我想为我的照片(如Facebook的预览照片)创建预览缩略图。我的计划:

  • 发件人:从原始照片中生成一个缩放的拇指(最大尺寸为30px),去掉所有固定的标题以发送。
  • 接收者:从“最小化”字节数组中,添加固定的标头(客户端代码中的硬编码)。然后将其转换Bitmap为显示。

最后,我提出了基于Q42.ImagePreview的解决方案。

我将这些部分拆分为固定标题:

  • 图像开始(0xFFD8
  • App0(以开头0xFFE0
  • 定义量化表
  • 定义霍夫曼表

动态部分是:

  • 帧开始(以开头0xFFC0):因为它包含宽度/高度字节。
  • 开始扫描(以开始0xFFDA)。
  • 压缩图像数据。
  • 图片结尾(0xFFD9

但是它只能在我的其中1台设备上使用,而不能在其他设备上使用。

那么,如何生成可在Android和iOS设备上使用的固定的,通用的和标准的JPEG标头

谢谢。


更多详情:

生成缩小的数据流:

  • 使用BitmapFactory&从原始图像创建缩放的位图(最大尺寸为30px,保持宽高比)Matrix

  • 压缩缩放位图质量64使用Bitmap#compress()并储存byte[] thumbData

  • thumbData上面的子数组从头到尾排列0xFFDA。(SOS,图像数据和EOI)并存储在中byte[] body

  • 以代表宽度和高度的4个字节为前缀body,转换为Base64字符串并发送。

在正常工作的设备中,其大小thumbData比其他不工作的设备长。霍夫曼表,SOS和图像数据部分则有所不同,请参见: 在2张图像照片之间进行差异检查

java android jpeg image image-processing

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