本机库对于安装时模块可以正常工作,但对于按需模块不能按预期工作

问题描述 投票:0回答:1

我正在尝试本地化一个使用 Native C++ 的应用程序。大多数用 C++ 编写的代码和所有字符串/文本都位于特定的构建标志中。例如 LANG_JP // 对于日语

我已经为我的项目创建了一个按需动态模块,即“module_jp”。 基本模块和动态模块之间的区别在于,在 module_jp 的 build.gradle 中,它将有一个额外的 cpp 标志。

**module_jp's build.gradle**
plugins {
   id 'com.android.dynamic-feature'
}
android {
   ...

   defaultConfig {
      ...
      externalNativeBuild {
         cmake {
            cppFlags "-fno-rtti -DLUTF8 -DLANG_JP" // Added extra flag here LANG_JP
         }
      }
   }

除此之外,我还创建了单独的 CMakeLists.txt 来创建新库,即 (libnative-activity-jp.so)

**module_jp's CMakeLists.txt**
...
add_library( # Sets the name of the library.
        native-activity-jp

        # Sets the library as a shared library.
        SHARED
        ...
...
target_include_directories(
        native-activity-jp PRIVATE
        ${PLAYCORE_LOCATION}/include
        )
...
target_link_libraries( # Specifies the target library.
        native-activity-jp
...

我的应用程序首先询问用户喜欢什么语言。之后,在主活动上,它将加载用户喜欢的库。例如,如果用户更喜欢日语,则会调用 System.LoadLibrary("native-activity-jp");如果是英文,它只会加载基础库。 System.LoadLibrary(“本机活动”);

   // LanguageSelectionActivity
   // This function open the native activity to start the normal process
   private void StartMainActivity(String LanguageCode) {

      if (LanguageCode.equals("en")) System.loadLibrary("native-activity");
      else System.loadLibrary("native-activity-" + szLanguageCode);

      // Initialize intent to start the normal activity
      Intent intent = new Intent(getApplicationContext(), NativeActivity.class);
      startActivity(intent);
      finish();
   }

问题 在本地测试时一切似乎都很好。当用户选择 jp 时,它只会显示确切的应用程序以及从 C++ 源文件中获取的翻译后的 JP 文本。然而,当在 Google 的封闭测试(Alpha)和内部应用程序共享中上传时,日志显示 module_jp 确实已安装,并且正在加载“libnative-activity-jp.so”,但它仍然显示 EN 翻译,告诉我“libnative-activity.so”。所以”首先被加载。

我尝试通过

调查该问题
  • 首先,我通过运行 adb backup 命令检查了设备上安装的 splitcompat 列表并提取了备份。我确认libnative-activity-jp.so确实被正确提取并保存在设备目录中(data/data//splitcompat/##/native-libraries)
  • 我还使用了相同的“libnative-activity-jp.so”并在本地进行了测试,它显示了日语翻译
  • 我还将模块交付类型从“按需”更改为“安装时”,并且在封闭测试(Alpha)和内部应用程序共享中进行测试时效果非常好。

问题

  1. 即使未调用 System.LoadLibrary("native-activity"),基本本机库是否始终首先加载?
  2. 为什么将该模块设置为安装时而不是按需时工作完全正确?
android android-ndk android-app-bundle dynamic-feature-module android-native-library
1个回答
0
投票

发现问题了。这是由作为源集一部分包含的其他 Java 活动的静态初始化程序块内的 System.loadLibrary 调用引起的。

static {
   System.loadLibrary("native-activity");
}

基本上,静态初始化程序块内的代码语句是在加载此不需要的库(libnative-activity.so)的任何对象初始化之前调用的。通过删除此静态初始化程序块并在 MainActivity 的 onCreate() 函数中加载所需的库来解决此问题。

© www.soinside.com 2019 - 2024. All rights reserved.