小编And*_*dov的帖子

如何使用 java / kotlin 中的注释处理将方法附加到现有类?

我是注释处理和代码生成的新手。我想知道如何执行这样的操作,比如将新方法附加到现有类。这是我想要做的一个例子:

假设我们有一个带有自定义注释的类,如下所示:

class SourceClass {
    @CustomAnnotation
    fun annotatedFun1(vararg argument: Any) {
        //Do something
    }

    @CustomAnnotation
    fun annotatedFun2(vararg argument: Any) {
        //Do something
    }

    fun someOtherFun() {
        //Do something
    }
}
Run Code Online (Sandbox Code Playgroud)

我想得到的结果 - 该类的扩展副本:

class ResultClass {
    fun hasFunWithName(name: String): Boolean {
        return (name in arrayOf("annotatedFun1", "annotatedFun2"))
    }

    fun callFunByName(name: String, vararg arguments: Any) {
        when (name) {
            "annotatedFun1" -> annotatedFun1(*arguments)
            "annotatedFun2" -> annotatedFun2(*arguments)
        }
    }

    fun annotatedFun1(vararg argument: Any) {
        //Do something
    }

    fun annotatedFun2(vararg argument: Any) {
        //Do something …
Run Code Online (Sandbox Code Playgroud)

java annotations codegen kotlin kapt

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

ConstraintLayout与StackOverflowError崩溃

我上周从不同设备通过Firebase Crashlytics获得了多个奇怪的崩溃报告.他们是:

  • 来自Android 4的100%(4.2 - 4.4)
  • 大部分(98%)来自三星平板电脑

堆栈跟踪是相同的,不包括对我的代码的任何引用,所以我不知道崩溃发生在哪里以及原因.搜索我的例外没有任何结果.所以我希望有人可以帮助我调查这些崩溃事件.据我所知,崩溃发生在ConstraintLayout库中的某个地方(我使用的是1.1.3版本).

崩溃堆栈跟踪:

Fatal Exception: java.lang.StackOverflowError
   at java.util.HashMap$KeySet.<init>(HashMap.java:911)
   at java.util.HashMap$KeySet.<init>(HashMap.java:911)
   at java.util.HashMap.keySet(HashMap.java:696)
   at java.util.HashSet.iterator(HashSet.java:161)
   at android.support.constraint.solver.widgets.ResolutionNode.didResolve(ResolutionNode.java:70)
   at android.support.constraint.solver.widgets.ResolutionAnchor.resolve(ResolutionAnchor.java:140)
   at android.support.constraint.solver.widgets.ResolutionNode.didResolve(ResolutionNode.java:71)
   at android.support.constraint.solver.widgets.ResolutionAnchor.resolve(ResolutionAnchor.java:140)
----A lot of identical lines---- 
   at android.support.constraint.solver.widgets.ResolutionNode.didResolve(ResolutionNode.java:71)
   at android.support.constraint.solver.widgets.ResolutionAnchor.resolve(ResolutionAnchor.java:85)
   at android.support.constraint.solver.widgets.ConstraintWidgetContainer.solveGraph(ConstraintWidgetContainer.java:586)
   at android.support.constraint.solver.widgets.ConstraintWidgetContainer.optimize(ConstraintWidgetContainer.java:643)
   at android.support.constraint.solver.widgets.ConstraintWidgetContainer.layout(ConstraintWidgetContainer.java:328)
   at android.support.constraint.ConstraintLayout.solveLinearSystem(ConstraintLayout.java:1860)
   at android.support.constraint.ConstraintLayout.onMeasure(ConstraintLayout.java:1621)
   at android.view.View.measure(View.java:16749)
   at android.widget.ScrollView.measureChildWithMargins(ScrollView.java:1235)
   at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
   at android.widget.ScrollView.onMeasure(ScrollView.java:327)
   at android.view.View.measure(View.java:16749)
   at android.support.constraint.ConstraintLayout.internalMeasureChildren(ConstraintLayout.java:1227)
   at android.support.constraint.ConstraintLayout.onMeasure(ConstraintLayout.java:1572)
   at android.view.View.measure(View.java:16749)
   at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5295)
   at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
   at android.support.v7.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:143)
   at android.view.View.measure(View.java:16749)
   at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5295)
   at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1413)
   at android.widget.LinearLayout.measureVertical(LinearLayout.java:696)
   at android.widget.LinearLayout.onMeasure(LinearLayout.java:589)
   at …
Run Code Online (Sandbox Code Playgroud)

android android-constraintlayout

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

如何在Gradle 5.1上指定Android汇编库文件名

当我从5.0更新到5.1时,Gradle改变了它的行为。

假设我们有一个带有名为library的单个模块的android项目。在Gradle 5.0(和以前的版本)上,当我执行./gradlew assembleRelease./gradlew assembleDebug生成输出时分别是library-release.aarlibrary-debug.aar

更新到Gradle 5.1(我也尝试过5.1.1)之后,它仅library.aar针对任何构建类型生成,而输出文件名中没有任何构建类型分类器。

所以我的问题是:如何强制Gradle 5.1为以前的不同构建类型设置正确的输出文件命名?以下是我的库模块的build.gradle.kts,但我认为它没有问题:

import org.jetbrains.kotlin.config.KotlinCompilerVersion

plugins {
    id("com.android.library")
    id("kotlin-android")
    id("maven-publish")
}

val libraryVersion = "1.5.0"

android {
    compileSdkVersion(28)

    defaultConfig {
        minSdkVersion(16)
        targetSdkVersion(28)
        versionCode = 1
        versionName = libraryVersion
    }

    lintOptions {
        isAbortOnError = false
    }

    buildTypes {
        getByName("release") {
            isMinifyEnabled = false
            proguardFiles(getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro")
        }
    }
}

dependencies {
    implementation(fileTree(mapOf("include" to listOf("*.jar"), "dir" to "libs")))
    implementation(kotlin("stdlib-jdk7", KotlinCompilerVersion.VERSION))
}
Run Code Online (Sandbox Code Playgroud)

更新:

如果我在build.gradle.kts中添加以下代码:

afterEvaluate { …
Run Code Online (Sandbox Code Playgroud)

android gradle android-library

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