首页 > 解决方案 > 与 Android 项目中的源库相比,实现 AAR 库的意外结果

问题描述

概括

当前行为

与 Android 项目中的源库相比,实现 AAR 库的意外结果。

这两个问题仅在使用库的编译 AAR 时存在,即使用库源代码实现相同项目时不存在问题。

预期行为

工作应用程序

我有一个基于包的 Android 应用程序com.example.sourceapp

这使用和管理位于 中的单独库的源代码,com.example.sourcelibrary我们将在其中调用一个类ParentClass

ParentClass我有两个感兴趣的成员。

在我的com.example.sourceapp.MainActivity我做两件事。

不工作的应用程序

在不同的 Android 项目中,我依赖于由同一个库生成的已编译(调试)AAR 文件,com.example.compiledapp.MainActivity而不是依赖于源库。com.example.sourcelibrary

我从顶部的 AAR 包中导入所需的类,com.example.compiledapp.MainActivity没有import com.example.sourcelibrary.ParentClass任何解决问题。

稍后com.example.compiledapp.MainActivity我使用与以前相同的代码

super.myBool = true;
super.onCreate()

但 Android Studio 表示它无法解析 myBool 中的super.myBool = true;.

此外,第二行似乎解决得很好,但是当我将鼠标悬停在它上面时仔细检查,Android Studio 表明它onCreate解析为是祖父类的成员com.example.someotherlibrary.GrandparentClass而不是父类com.example.sourcelibrary.ParentClass

查看几行,当我将鼠标悬停在onCreate覆盖上时,Android Studio 表明我正在覆盖onCreate祖父类,而不是父类。

为什么/如何onCreate跳过父方法并覆盖祖父类?

此外,看起来super关键字正在解析为祖父类而不是父类。这是我能想到的唯一解释,它会导致onCreate解析为 GrandparentClass 而myBool无法解析。我不认为这是如何super工作的。

这是正常的吗?我只是误解了继承的基本原理吗?也许我在编译到 AAR 时做错了,以至于尽管被声明为公共的父变量/方法变得不可访问?或者,Android Studio 可能会根据我不知道的一些规则优先选择一个包而不是另一个包?

工作代码

package com.example.sourceapp;

import android.os.Bundle;

import com.example.sourcelibrary.ParentClass;

public class MainActivity extends ParentClass {

    // Shows to Override onCreate in ParentClass
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState); // super resolves to ParentClass
        super.myBool = true; // super resolves to ParentClass
    }

}

不工作的代码

package com.example.compiledapp;

import android.os.Bundle;

import com.example.sourcelibrary.ParentClass;

public class MainActivity extends ParentClass {

    // Shows to Override onCreate in GrandparentClass
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState); // super resolves to Grandparent
        super.myBool = true; // does not resolve
    }

}

标签: javaandroidandroid-studioaar

解决方案


我最终找到了错误。事实证明,在构建com.example.sourceapp包含库模块com.example.sourcelibrary的 my 时,构建过程没有更新 AAR 文件,并且在过时的源库代码中显然存在错误/旧问题(可能缺少 onCreate 方法和 myBool。不确定因为我不记得在我的 git 历史中它会在哪里,因为我只是简要地指出修改日期是旧的,然后重建并且旧的时间戳现在已经消失了。

不管怎样,进入 Android Studio 的 gradle 菜单com.example.sourceapp并导航到 sourcelibrary-->Tasks-->build-->build 有帮助。尝试直接构建库会引发与 SDK 版本相关的错误,因此我修复了此问题并重新构建,重新导入到已编译的应用程序中,它按预期工作。

其他人可能从中学到的一点是,如果您的 AAR 依赖项发生了一些奇怪的事情,请检查您构建 AAR 的源代码是否实际上正在构建和更新 AAR 文件,因为 Android Studio 显然不会引发错误在构建围绕图书馆的应用程序时。

也许应用程序级别gradle中的SDK设置覆盖了库级别gradle设置并允许它构建应用程序而没有错误,并且更新的库实际上是构建的,但仅在APK内?不确定,确切的原因,但至少吸取了一个整体的教训。


推荐阅读