HarmonyOS 开启混淆后生成的sourceMaps.map文件在哪里可以找到呢 ?

1,根据文档https://developer.huawei.com/consumer/cn/doc/harmonyos-guides...,开启编译混淆设置。
"buildOptionSet": [
{
"name": "release",
"arkOptions": {
"obfuscation": {

"ruleOptions": { 
  "enable": true, 
  "files": [ 
  "./obfuscation-rules.txt" 
  ] 
} 

}
}
},
],
2,执行:hvigor.js --mode project -p product=default -p buildMode=release assembleApp --analyze --parallel --incremental --daemon命令构建,生成加固后的hap包,在哪里可以找到混淆对应的sourceMaps.map文件呢?

阅读 816
avatarAI BotBETA

在HarmonyOS项目中,当你开启编译混淆设置并构建项目后,生成的sourceMaps.map文件通常不会自动生成,除非你明确配置了相关选项来生成这些映射文件。标准的混淆过程主要是为了保护源代码不被轻易反编译和理解,因此默认情况下不会生成详细的映射文件。

然而,如果你需要生成这些映射文件以支持调试或分析,你可能需要查看或修改你的构建脚本或IDE设置来启用这一功能。在HarmonyOS或类似的Android Studio/Gradle环境中,这通常涉及到在构建配置中添加特定的代码或插件。

由于HarmonyOS的具体实现和文档可能随时间更新,以下是一个基于一般Android开发经验的假设性指导,你可以尝试在HarmonyOS环境中调整:

  1. 检查构建脚本:查看你的build.gradle文件或相应的构建配置文件,看是否有关于生成source map的选项。在Android项目中,这通常涉及到设置minifyEnabledshrinkResources为true,并可能还需要设置proguardFiles来指定混淆规则文件。但在HarmonyOS中,这些设置可能有所不同。
  2. 使用ProGuard或类似工具:如果HarmonyOS支持ProGuard或类似的代码混淆工具,你可能需要查看这些工具的文档,了解如何配置以生成source map文件。在Android中,这通常是通过在ProGuard配置文件中添加-printmapping mapping.txt来完成的,但在HarmonyOS中可能有所不同。
  3. 查看HarmonyOS文档和社区:由于HarmonyOS是一个较新的平台,其文档和社区可能包含关于如何生成source map文件的最新信息。
  4. 联系技术支持:如果上述方法都无法解决问题,你可以考虑联系HarmonyOS的技术支持团队或访问其开发者论坛寻求帮助。

综上所述,在HarmonyOS中开启混淆后,默认情况下可能不会生成sourceMaps.map文件。如果你需要这些文件,你需要检查并可能修改你的构建配置,或者查找HarmonyOS提供的特定解决方案。

1 个回答

可以借助三方库aki 实现class的导出;AKI 提供 JSBIND_CLASS 对 C++ 类/结构体进行绑定,根据aki使用修改下 CMakeLists.txt 和 napi_init.cpp 文件配置;在声明需要被绑定的类后就可以正常导出。参考下:
aki绑定 Native 对象/结构体用例:https://gitee.com/openharmony-sig/aki/tree/master/example/oho...
aki介绍:https://gitee.com/openharmony-sig/aki#3-%E4%BD%BF%E7%94%A8-aki
C++ 侧的class可以通过napi_define_class将构造函数与一个ArkTS的类绑定,这样在Arkts侧创建这个类的实例的时候就会调用c侧的构造函数在C侧也创建一个绑定的类,下面是一个示例demo,其中成员函数分为普通函数和静态成员函数,区别是普通成员函数需要创建一个JS实例与C++ 实例绑定,而静态函数不需要。在C++中定义一个类:

class AddClass { 
  public: 
    AddClass(std::string name) 
  { 
  this->instName = name; 
}; 
AddClass(){}; 
~AddClass(){}; 
std::string instName; 
double Add(double a, double b) 
{ 
  return a+b; 
}; 
static double StaticAdd(double a, double b) { return a + b; }; 
}; 
为这个类绑定构造函数: 
static napi_value JsConstructor(napi_env env, napi_callback_info info) { 
  // 创建napi对象 
  napi_value jDemo = nullptr; 
  size_t argc = 1; 
  napi_value args[1] = {0}; 
  // 获取构造函数入参 
  napi_get_cb_info(env, info, &argc, args, &jDemo, nullptr); 
  // args[0] js传入的参数 
  char name[50]; 
  size_t result = 0; 
  napi_get_value_string_utf8(env, args[0], name, sizeof(name) + 1, &result); 
  // 创建C++对象 
  AddClass *cDemo = new AddClass(name); 
  //OH_LOG_INFO(LOG_APP, "%{public}s", (cDemo->instName).c_str()); 
  // 设置js对象name属性 
  napi_set_named_property(env, jDemo, "name", args[0]); 
  // 绑定JS对象与C++对象 
  napi_wrap( 
    env, jDemo, cDemo, 
    // 定义js对象回收时回调函数,用来销毁C++对象,防止内存泄漏 
    [](napi_env env, void *finalize_data, void *finalize_hint) { 
    AddClass *cDemo = (AddClass *)finalize_data; 
    delete cDemo; 
    cDemo = nullptr; 
  }, 
  nullptr, nullptr); 
  return jDemo; 
}
这个C类将与JS侧的类绑定,在JS侧的类创建时,这个C的构建函数也将调用为类中普通函数Add()提供js侧接口:
static napi_value JsAdd(napi_env env, napi_callback_info info) { 
  size_t argc = 2; 
  napi_value args[2] = {nullptr}; 
  napi_value jDemo = nullptr; 
  napi_get_cb_info(env, info, &argc, args, &jDemo, nullptr); 
  AddClass *cDemo = nullptr; 
  // 将js对象转为c对象 
  napi_unwrap(env, jDemo, (void **)&cDemo); 
  // 获取js传递的参数 
  int value0; 
  napi_get_value_int32(env, args[0], &value0); 
  int value1; 
  napi_get_value_int32(env, args[1], &value1); 
  int cResult = cDemo->Add(value0, value1); 
  napi_value jResult; 
  napi_create_int32(env, cResult, &jResult); 
  return jResult; 
} 
为类中静态函数StaticAdd()提供js侧接口: 
static napi_value JsStaticAdd(napi_env env, napi_callback_info info) { 
  size_t argc = 2; 
  napi_value args[2] = {nullptr}; 
  napi_value jDemo = nullptr; 
  napi_get_cb_info(env, info, &argc, args, &jDemo, nullptr); 
  // 获取js传递的参数 
  int value0; 
  napi_get_value_int32(env, args[0], &value0); 
  int value1; 
  napi_get_value_int32(env, args[1], &value1); 
  int cResult = AddClass::StaticAdd(value0, value1); 
  napi_value jResult; 
  napi_create_int32(env, cResult, &jResult); 
  return jResult; 
}
在init函数中暴露C++ 的类,和类中的函数,并引入JS侧对应要绑定的类:
static napi_value Init(napi_env env, napi_value exports) { 
  // 定义模块需要对外暴露的方法 
  // 通过napi_define_class建立JS类与C++侧的映射关系,然后将对应的对象挂载到export上 
  napi_property_descriptor classProp[] = {{"Add", nullptr, JsAdd, nullptr, nullptr, nullptr, napi_default, nullptr}, 
  {"StaticAdd", nullptr, JsStaticAdd, nullptr, nullptr, nullptr, napi_static, nullptr}}; 
 
napi_value jDemo = nullptr; 
const char *jDemoName = "AddClass"; 
// 建立JS构造函数与C++方法的关联,指定2个prop 
napi_define_class(env, jDemoName, sizeof(jDemoName), JsConstructor, nullptr, 
  sizeof(classProp) / sizeof(classProp[0]), classProp, &jDemo); 
napi_set_named_property(env, exports, jDemoName, jDemo); 
return exports; 
}
在index.d.ts中导出AddClass:
export const add: (a: number, b: number) => number; 
declare namespace testNapi { 
  class AddClass { 
    constructor(name:string) 
    name: string 
    Add(a: number, b: number): number 
    static StaticAdd(a: number, b: number): number 
  } 
} 
export default testNapi;
在ArkTS侧调用native侧类函数:
Button('add') 
  .onClick(() => { 
    //调用构造函数,获取对象 
    let AddClass = new testNapi.AddClass("class name"); 
    hilog.info(0x0000, 'ckTest', 'Test NAPI 3 + 7 = %{public}d', AddClass.Add(3, 7)); 
  }) 
Button('static add') 
  .onClick(() => { 
    hilog.info(0x0000, 'ckTest', 'Test NAPI static 8 + 5 = %{public}d', testNapi.AddClass.StaticAdd(5,8)); 
  }) 
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进