Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is there some decompiler for Kotlin files that decompile into kotlin *.kt files

I try to learn how to decompile Android program(APK) and found this site Decompilers online . It´s working grate for java code but when there are Kotlin files code the decompiler produces java code and it mixes Kotlin and java.

Here's what I see from the file ColorCircle.kt. As you see Kotlin Lazy is there and other Kotlin code. My questions are: Is there some other decompiler for Kotlin files that decompile into kotlin *.kt files?
Can I have Kotlin imports in *.java files without problems?

package io.coolbe.vai.view;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.View;
import io.coolbe.vai.C1300R;
import java.util.HashMap;
import kotlin.Lazy;
import kotlin.Metadata;
import kotlin.jvm.functions.Function0;
import kotlin.jvm.internal.Intrinsics;
import kotlin.jvm.internal.PropertyReference1Impl;
import kotlin.jvm.internal.Reflection;
import kotlin.reflect.KProperty;
import org.jetbrains.annotations.NotNull;

@Metadata(bv = {1, 0, 3}, d1 = {"\u0000>\n\u0002\u0018\u0002\n\u0002\u0018\u0002\n\u0000\n\u0002\u0018\u0002\n\u0002\b\u0002\n\u0002\u0018\u0002\n\u0002\b\u0002\n\u0002\u0010\u0007\n\u0002\b\u0002\n\u0002\u0018\u0002\n\u0002\b\u0005\n\u0002\u0010\b\n\u0002\b\u0002\n\u0002\u0010\u0002\n\u0000\n\u0002\u0018\u0002\n\u0000\u0018\u00002\u00020\u0001B\u000f\b\u0016\u0012\u0006\u0010\u0002\u001a\u00020\u0003¢\u0006\u0002\u0010\u0004B\u0017\b\u0016\u0012\u0006\u0010\u0002\u001a\u00020\u0003\u0012\u0006\u0010\u0005\u001a\u00020\u0006¢\u0006\u0002\u0010\u0007J\u0010\u0010\u0014\u001a\u00020\u00152\u0006\u0010\u0016\u001a\u00020\u0017H\u0014R\u000e\u0010\b\u001a\u00020\tX\u000e¢\u0006\u0002\n\u0000R\u000e\u0010\n\u001a\u00020\tX\u000e¢\u0006\u0002\n\u0000R\u001b\u0010\u000b\u001a\u00020\f8BX\u0002¢\u0006\f\n\u0004\b\u000f\u0010\u0010\u001a\u0004\b\r\u0010\u000eR\u000e\u0010\u0011\u001a\u00020\u0012X\u000e¢\u0006\u0002\n\u0000R\u000e\u0010\u0013\u001a\u00020\tX\u000e¢\u0006\u0002\n\u0000¨\u0006\u0018"}, d2 = {"Lio/coolbe/vai/view/ColoredCircle;", "Landroid/view/View;", "context", "Landroid/content/Context;", "(Landroid/content/Context;)V", "attrs", "Landroid/util/AttributeSet;", "(Landroid/content/Context;Landroid/util/AttributeSet;)V", "offsetX", "", "offsetY", "paint", "Landroid/graphics/Paint;", "getPaint", "()Landroid/graphics/Paint;", "paint$delegate", "Lkotlin/Lazy;", "strokeColor", "", "strokeWidth", "onDraw", "", "canvas", "Landroid/graphics/Canvas;", "app_release"}, k = 1, mv = {1, 1, 13})
/* compiled from: ColoredCircle.kt */
public final class ColoredCircle extends View {
    static final /* synthetic */ KProperty[] $$delegatedProperties = new KProperty[]{Reflection.property1(new PropertyReference1Impl(Reflection.getOrCreateKotlinClass(ColoredCircle.class), "paint", "getPaint()Landroid/graphics/Paint;"))};
    private HashMap _$_findViewCache;
    private float offsetX;
    private float offsetY;
    private final Lazy paint$delegate;
    private int strokeColor;
    private float strokeWidth;

    private final Paint getPaint() {
        Lazy lazy = this.paint$delegate;
        KProperty kProperty = $$delegatedProperties[0];
        return (Paint) lazy.getValue();
    }

    public vaid _$_clearFindViewByIdCache() {
        HashMap hashMap = this._$_findViewCache;
        if (hashMap != null) {
            hashMap.clear();
        }
    }

    public View _$_findCachedViewById(int i) {
        if (this._$_findViewCache == null) {
            this._$_findViewCache = new HashMap();
        }
        View view = (View) this._$_findViewCache.get(Integer.valueOf(i));
        if (view != null) {
            return view;
        }
        view = findViewById(i);
        this._$_findViewCache.put(Integer.valueOf(i), view);
        return view;
    }

    public ColoredCircle(@NotNull Context context) {
        Intrinsics.checkParameterIsNotNull(context, "context");
        super(context);
        this.strokeColor = -7829368;
        this.strokeWidth = 10.0f;
        this.paint$delegate = LazyKt__LazyJVMKt.lazy((Function0) new ColoredCircle$paint$2(this));
    }

    public ColoredCircle(@NotNull Context context, @NotNull AttributeSet attributeSet) {
        Intrinsics.checkParameterIsNotNull(context, "context");
        Intrinsics.checkParameterIsNotNull(attributeSet, "attrs");
        super(context, attributeSet);
        this.strokeColor = -7829368;
        this.strokeWidth = 10.0f;
        this.paint$delegate = LazyKt__LazyJVMKt.lazy(new ColoredCircle$paint$2(this));
        context = context.getTheme().obtainStyledAttributes(attributeSet, C1300R.styleable.ColoredCircle, 0, 0);
        try {
            this.offsetX = context.getDimension(0, this.offsetX);
            this.offsetY = context.getDimension(1, this.offsetY);
            this.strokeColor = context.getColor(2, this.strokeColor);
            this.strokeWidth = context.getDimension(3, this.strokeWidth);
        } finally {
            context.recycle();
        }
    }

    protected vaid onDraw(@NotNull Canvas canvas) {
        Intrinsics.checkParameterIsNotNull(canvas, "canvas");
        super.onDraw(canvas);
        float f = (float) getLayoutParams().width;
        float f2 = (float) getLayoutParams().height;
        float f3 = (float) 2;
        float min = (Math.min(f, f2) / f3) - (this.strokeWidth / f3);
        canvas.save();
        canvas.translate(this.offsetX, this.offsetY);
        canvas.drawCircle(f / f3, f2 / f3, min, getPaint());
        canvas.restore();
    }
}
like image 989
Tord Larsen Avatar asked Mar 11 '19 07:03

Tord Larsen


People also ask

Can Kotlin be decompiled?

Sometimes, to debug Java/Kotlin interoperability issues, it helps to see the equivalent Java code for a particular Kotlin source file. IntelliJ IDEA and Android Studio both offer this capability. From the Tools > Kotlin menu, choose “Show Kotlin Bytecode”.

How do I enable decompile Kotlin in Java?

Open your Kotlin project in the IntelliJ IDEA / Android Studio. Then navigate to Tools > Kotlin > Show Kotlin Bytecode. You will get the bytecode of your Kotin file. Now click on the Decompile button to get your Java code from the bytecode.


1 Answers

Is there som other decompiler for Kotlin files that decompile into kotlin *.kt files?

Currently, there is no "comfortable" decompiler to do .class -> .kt.

There are several famous decompiler do .class -> .java, but they just suits for the bytecode Java compiler generated. If you try to use them for decompile some bytecode generated by Kotlin, you can see something weird even errorness. This is caused by some tricks used to write and compile Kotlin.

Then, in most of the time, you can't use the decompiler output directly.

Can I have Kotlin imports in *.java files without problems?

This is a question related to the "100% interoperable with the Java". Kotlin can be imported in a .java file nearly without problems (I am not sure if there will be questions when we pass Java Lambda into Kotlin, but the common way of function calling is surely no problems).

like image 137
Geno Chen Avatar answered Oct 24 '22 11:10

Geno Chen