与 Android 个项目中的源库相比,实施 AAR 库的意外结果
Unexpected results from implementing an AAR library compared to source library in Android Projects
总结
当前行为
与 Android 项目中的源库相比,实施 AAR 库的意外结果。
super
关键字似乎是指向grandparentclass而不是直接的parentclass。
- 尽管在 parent 中声明并覆盖了相同的方法,但以某种方式覆盖了 grandparent 方法。
这两个问题仅在使用库的编译AAR时存在,即使用库源代码实现相同项目时不存在问题。
预期行为
- 我希望对
super
的两次调用都能解析为 parent class。
- 我希望重写
onCreate
来重写 parent class 中的方法,而不是 grandparent。
工作应用程序
我有一个 Android 应用程序基于软件包 com.example.sourceapp
这使用和管理位于 com.example.sourcelibrary
的单独库的源代码,其中有一个 class 我们称之为 ParentClass
.
在 ParentClass
我有两个感兴趣的成员。
- 一个名为
myBool
的 public 布尔值,它起源于 ParentClass
- 一种覆盖
android.app.Activity.onCreate
方法的方法,该方法也被覆盖并继承自某些其他库 com.example.someotherlibrary
中的某些 grandparent class GrandparentClass
。
在我的 com.example.sourceapp.MainActivity
中,我做了两件事。
- 我扩展
com.example.sourcelibrary.ParentClass
并使用 super.myBool = true;
修改 ParentClass
中包含的 myBool
。
- 我在覆盖的方法中通过
super.onCreate()
调用了 onCreate
。
两者都按预期工作。当我将鼠标悬停在 super.onCreate
Android 上时,Studio 指示它按预期正确解析为 parent class。
应用程序不工作
在不同的 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.sourcelibrary
的 com.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 设置并允许它构建应用程序而没有错误,并且更新的库实际上已构建,但仅在应用程序?不确定,确切原因,但至少吸取了一个整体教训。
总结
当前行为
与 Android 项目中的源库相比,实施 AAR 库的意外结果。
super
关键字似乎是指向grandparentclass而不是直接的parentclass。- 尽管在 parent 中声明并覆盖了相同的方法,但以某种方式覆盖了 grandparent 方法。
这两个问题仅在使用库的编译AAR时存在,即使用库源代码实现相同项目时不存在问题。
预期行为
- 我希望对
super
的两次调用都能解析为 parent class。 - 我希望重写
onCreate
来重写 parent class 中的方法,而不是 grandparent。
工作应用程序
我有一个 Android 应用程序基于软件包 com.example.sourceapp
这使用和管理位于 com.example.sourcelibrary
的单独库的源代码,其中有一个 class 我们称之为 ParentClass
.
在 ParentClass
我有两个感兴趣的成员。
- 一个名为
myBool
的 public 布尔值,它起源于ParentClass
- 一种覆盖
android.app.Activity.onCreate
方法的方法,该方法也被覆盖并继承自某些其他库com.example.someotherlibrary
中的某些 grandparent classGrandparentClass
。
在我的 com.example.sourceapp.MainActivity
中,我做了两件事。
- 我扩展
com.example.sourcelibrary.ParentClass
并使用super.myBool = true;
修改ParentClass
中包含的myBool
。 - 我在覆盖的方法中通过
super.onCreate()
调用了onCreate
。 两者都按预期工作。当我将鼠标悬停在super.onCreate
Android 上时,Studio 指示它按预期正确解析为 parent class。
应用程序不工作
在不同的 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.sourcelibrary
的 com.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 设置并允许它构建应用程序而没有错误,并且更新的库实际上已构建,但仅在应用程序?不确定,确切原因,但至少吸取了一个整体教训。