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

Unexpected results from implementing an AAR library compared to source library in Android Projects

总结

当前行为

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

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

预期行为

工作应用程序

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

这使用和管理位于 com.example.sourcelibrary 的单独库的源代码,其中有一个 class 我们称之为 ParentClass.

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

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

应用程序不工作

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

我从 com.example.compiledapp.MainActivity 顶部的 AAR 包中导入所需的 class 和 import com.example.sourcelibrary.ParentClass,没有任何分辨率问题。

稍后在 com.example.compiledapp.MainActivity 中,我使用与之前相同的代码

super.myBool = true;
super.onCreate()

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

此外,第二行似乎解析得很好,但当我将鼠标悬停在它上面时仔细检查,AndroidStudio 表明 onCreate 解析为 grand[=143 的成员=] class com.example.someotherlibrary.GrandparentClass 而不是 parent class com.example.sourcelibrary.ParentClass.

查看几行,当我将鼠标悬停在 onCreate 覆盖上时,Android Studio 指示我正在覆盖 grandparent class,而不是 parent class。

Why/How 会 onCreate 跳过 parent 方法并覆盖 grandparent class?

而且 super 关键字似乎解析为 grandparent class 而不是 parent class。这是我能想到的唯一解释,它会导致 onCreate 解析为 GrandparentClass 而 myBool 不可解析。我不认为 super 是这样工作的。

这正常吗?我只是误解了关于继承的一些基本知识?也许我在编译为 AAR 时做错了什么,以至于 parent variables/methods 尽管被声明为 public 但仍然无法访问?或者 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
    }

}

我最终找到了错误。事实证明,在构建包含库模块 com.example.sourcelibrarycom.example.sourceapp 时,构建过程并未更新 AAR 文件,并且在过时的 sourcelibrary 代码中显然有一些 wrong/old(可能是它缺少 onCreate 方法和 myBool。不确定,因为我不记得它在我的 git 历史记录中的哪个位置,因为我只是简单地注意到修改日期是旧的,然后重建,旧的时间戳现在是走了。

无论如何,进入 Android Studio 中的 gradle 菜单为 com.example.sourceapp 导航到 sourcelibrary-->Tasks-->build-->build .尝试直接构建库引发了与 SDK 版本相关的错误,所以我修复了这个问题并重新构建,重新导入到已编译的应用程序,它按预期工作。

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

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