鸿蒙混合打包。在现有安卓应用的基础上扩展鸿蒙的特性,以最快的速度布局鸿蒙生态!

news2024/11/27 20:31:41

鸿蒙混合打包

介绍

鸿蒙混合打包。在现有安卓应用的基础上扩展鸿蒙的特性,以最快的速度布局鸿蒙生态!

参考:京东APP鸿蒙版上架实践。本项目只是这篇文章的一个验证,让更多的兄弟们可以少走弯路。

我尽可能把每一步的改动作为一个commit,这样方便大家看代码。

开发步骤

  1. 准备Android工程

    本示例中,我用AS建了一个Hello World工程。

  2. Android工程改造

    请参考京东APP鸿蒙版上架实践。

    这一步,有两点要注意的:

    1. abilityshell_ide_java.jar在这里,自行copy到安卓工程中在这里插入图片描述
    1. 注意apk文件名必须是 xxx-entry.apk这种格式
  3. 准备鸿蒙工程

    本示例中,我用DevEco Studio建了一个Hello World工程。在这里插入图片描述

  4. 配置鸿蒙工程

    请参考京东APP鸿蒙版上架实践。

    这一步,有三点要注意的:

    1. 签名就不要转了,直接重新创建,只要秘钥和别名和Android的保持不变。(如果在模拟器上运行,不配置签名也能跑起来)

    2. 鸿蒙的version 和apk的version要一致

    3. config.json的app节点下,增加relatedBundleName而不是originalName

      config.json里都支持哪些字段,没必要看文档,只要按住ctrl点击相应的字段,就可以看到,比如点击app字段。在这里插入图片描述

  5. 卡片

    本示例中,我用DevEco Studio建了一个名为mycard的module ,并且勾选"show in service center",这样这个卡片就可以显示在"服务中心"了。在这里插入图片描述

    有几点需要说明:

    1. 必须签名(我的验证结果是这样的),所以要有真机。我提交的签名文件是绑定我的机器,所以你要更新自己的签名文件。
    2. 卡片的config.json的app字段要和entry的app字段完全一致relatedBundleName字段只在entry里有就可以,卡片里不写也行)
    3. 多module的工程,运行的时候要勾选Deploy Multi Hap Packages在这里插入图片描述
    1. 为什么把卡片放在独立的module里?因为混合打包下,entry只是一个壳,我们可以把entry当作apk的占位,所以entry里的内容都不会打到appj里,鸿蒙相关的功能代码我们只能放在独立的module中。(当然,这也是我的验证结果,最终要等华为官方更明确的文档解释)
  6. 鸿蒙打开apk中的activity

    请参考京东APP鸿蒙版上架实践。

  7. 鸿蒙打开apk中的activity,并传递参数

    • 鸿蒙IntentParams对应安卓Bundle,相应的api

      //ohos put:
      IntentParams params = new IntentParams();
      params.setParam("androidFile1","androidFile1----");
      intent.setParams(params);
      
      //android put:
      Intent intent = new Intent();
      intent.putExtra("androidFile1","androidFile1----");
      
      //get:
      intent.getStringExtra("androidFile1");
      
      //ohos put:
      Set<String> entities = new HashSet<>();
      entities.add("entity.user.c1");
      
    • 鸿蒙Uri对应安卓Uri,鸿蒙Entity对应安卓Category,相应的api

      //ohos put:
      Operation operation = new Intent.OperationBuilder()
              .withUri(Uri.parse("https://www.baidu.com"))
              .withEntities(entities)
              .build();
      
      //android put:
      Intent intent = new Intent();
      intent.setData(Uri.parse("https://www.baidu.com"));
      intent.addCategory("entity.user.c1");
      
      //get:
      intent.getData();
      intent.getCategories();
      
  8. 安卓打开鸿蒙中的ability,并传递参数

    • 核心代码:

      Intent intent = new Intent();
      //CardAbility有对应的代理类CardAbilityShellActivity,我们可以这样理解。
      ComponentName componentName = new ComponentName("wang.unclecat.hello","wang.unclecat.mycard.CardAbilityShellActivity");
      intent.putExtra("msg","鸿蒙哥哥,我是安卓");
      intent.setComponent(componentName);
      startActivity(intent);
      
    • 原理:鸿蒙工程在编译期,Ability会生成相应的代理类XXXShellActivity。如下图所示。我们只要访问这个代理Activity,就可以在apk中访问相应的Ability了。

      以上都只是猜测,试过之后,还真的可行。

在这里插入图片描述

在这里插入图片描述

  1. 创建鸿蒙ServiceAbility

    用ide生成,没什么好说的

  2. 把ServiceAbility设置为前台Service

    请参考:官方文档

  3. 安卓向鸿蒙ServiceAbility发数据

    有了启动Page Ablility的经验,同理我们创建一个Service Ablility,在build目录中编译器同样生成了相应的代理类ServiceAbilityShellService。再次大胆猜想一下,你会惊奇地发现,一样可行。

  • 核心代码:

    //建立连接
    Intent intent = new Intent();
    ComponentName componentName = new ComponentName("wang.unclecat.hello","wang.unclecat.mycard.ServiceAbilityShellService");
    intent.setComponent(componentName);
    bindService(intent, connection, Context.BIND_AUTO_CREATE);
    
    //发送
    Parcel data = Parcel.obtain();
    Parcel reply = Parcel.obtain();
    data.writeString("time:"+new Date().getTime());
    try {
        serviceBinder.transact(2, data, reply, IBinder.FLAG_ONEWAY);
    } catch (RemoteException e) {
        e.printStackTrace();
    }
    

最终效果

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/474744.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【HarmonyOS】【JS】Tabs如何设置区分TabBar和TabContent的分割线不显示

【关键字】 Tabs&#xff0c;分割线 【问题描述】 使用JS开发HarmonyOS应用时&#xff0c;使用Tabs组件&#xff0c;默认自带TabBar和TabContent的蓝色分割线&#xff0c;由于蓝色分割线样式不可设置&#xff0c;若不想要此蓝色分割线&#xff0c;如何去除蓝色分割线&#xf…

搭建外网minecraft服务器方案

很多minecraft服务器主都想自己搭建一个外网可以访问的minecraft服务器&#xff0c;在没有外网IP的情况下&#xff0c;一般都是使用Logmein Hamachi方案。这种方案有它的弊端&#xff0c;需要客户机安装Hamachi&#xff0c;十分不方便。另外&#xff0c;免费版只支持5人&#x…

C++三大特性—继承 “基类与派生类之间的类型转换与赋值转换”

理解基类与派生类之间的类型转换是理解C语言面向对象编程的关键所在 继承 通过继承联系在一起的类构成一种层次关系&#xff0c;层次关系的根部有一个基类&#xff0c;其他直接或间接从基类继承而来&#xff0c;称为派生类。    继承(inheritance)机制是面向对象程序设计使代…

Spring RabbitMQ 实现消息队列延迟

1.概述 要实现RabbitMQ的消息队列延迟功能&#xff0c;一般采用官方提供的 rabbitmq_delayed_message_exchange插件。但RabbitMQ版本必须是3.5.8以上才支持该插件&#xff0c;否则得用其死信队列功能。 2.安装RabbitMQ延迟插件 检查插件 使用rabbitmq-plugins list命令用于查看…

C++引用进阶篇:让你的程序更加高效、安全、简洁

文章目录 前言1. 引用和临时数据&#x1f351; 什么样的临时数据会放到寄存器中&#x1f351; 关于常量表达式&#x1f351; 引用也不能指代临时数据&#x1f351; 引用作为函数参数 2. 为const引用创建临时变量3. const引用与转换类型&#x1f351; 引用类型的函数形参请尽可能…

SPFA 算法:实现原理及其应用

文章目录 一、前言二、SPFA 算法1、SPFA算法的基本流程2、代码详解 三、SPFA 算法已死 &#xff1f; 一、前言 SPFA算法&#xff0c;全称为Shortest Path Faster Algorithm&#xff0c;是求解单源最短路径问题的一种常用算法&#xff0c;它可以处理有向图或者无向图&#xff0…

PySide2 QWebEngine与Web js交互

文章目录 单向交互双向传值案例 单向交互 QWebEngineView加载web页面&#xff0c;web页面中点击按钮&#xff0c;执行js代码&#xff0c;js的返回值传给QWebEnginePage&#xff0c;使用python进行保存结果。 单向&#xff0c;js向python(PySide2)端传输数据。 前端实现 <…

前端web3入门脚本三:一键完成与dex的交互,羊毛党必备

前言 该脚本用途&#xff1a;一键可以完成与dex的所有交互&#xff0c;包括2次swap&#xff0c;添加/移除流动性&#xff0c;以及farm和提取LP。一次运行可以有6条交易记录。 无论是个人单刷还是羊毛党批量地址刷交互都完美适配。当然反女巫方案不在这次文章的讨论范围内。 一、…

javascript中find(), filter(), some(), every(), map()等方法介绍

1、find() find() 用于找出第一个符合条件的数组成员。它的参数是一个回调函数&#xff0c;所有数组成员依次执行该回调函数&#xff0c;直到找出第一个返回值为true的成员&#xff0c;然后返回该成员。如果没有符合条件的成员&#xff0c;则返回undefined。 find()方法的回调…

利用Matab进行覆盖计算----战术计算

在 contour函数中添加如下代码 %------- 计算畅通区面积和占比例 --------% Spi*maxrange*maxrange/1e6; S0 nnz(isInRange)*reslons*reslats/1e6;isnn ~isnan(cdata); cdata0 cdata(isnn); S1numel(cdata0)*reslons*reslats/1e6;AS1/S0; % 畅通区所占比例; fprintf("…

CLion开发工具 | 06 - 使用CLion开发STM32(无需Cmake)

专栏介绍 文章目录 专栏介绍一、准备工作1. 工具准备2. 裸机工程准备二、使用CLion打开工程三、基于CLion写代码1. LED blink代码2. printf重定位代码四、编译工程1. 编译配置2. 选择编译目标3. 编译五、烧录1. OpenOCD基础知识(了解)2. 设置CLion路径3. 新建CLion配置文件4.…

面试总结,4年经验

小伙伴你好&#xff0c;我是田哥。 本文内容是一位星球朋友昨天面试遇到的问题&#xff0c;我把核心的问题整理出来了。 1&#xff1a;Java 层面的锁有用过吗&#xff1f;除了分布式锁以外 是的&#xff0c;Java中提供了多种锁机制来保证并发访问数据的安全性和一致性。常见的J…

分析GC日志解读

目录 GC分类 GC日志分类 GC日志结构剖析 透过日志看垃圾收集器 透过日志看GC原因 GC日志分析工具 GC分类 针对HotSpot VM的实现&#xff0c;它里面的GC按照回收区域又分为两大种类型&#xff1a;一种是部分收集&#xff08;Partial GC&#xff09;&#xff0c;一种是整堆…

VPN 虚拟专用网络隧道

1 什么是VPN VPN(全称&#xff1a;Virtual Private Network)虚拟专用网络&#xff0c;是依靠ISP和其他的NSP&#xff0c;在公共网络中建立专用的数据通信的网络技术&#xff0c;可以为企业之间或者个人与企业之间提供安全的数据传输隧道服务。在VPN中任意两点之间的链接并没有…

从零开始学习Linux运维,成为IT领域翘楚(二)

文章目录 &#x1f525;Linux系统目录结构&#x1f525;Linux用户和用户组&#x1f525;Linux用户管理 &#x1f525;Linux系统目录结构 文件系统组织结构 ⭐ /lib 系统开机所需要最基本的动态链接共享库&#xff0c;其作用类似于Windows里的DLL文件。 几乎所有的应用程序都需…

PACS系统源码,大型医院PACS源码集成三维重建

PACS系统为医院提供包括放射、超声、核医学、病理、内窥镜、心电图室在内的所有影像检查数字化的一体化解决方案。 它涵盖了传统PACS和RIS系统的所有功能&#xff0c;以构建全数字化影像科为目标&#xff0c;致力于实现对医院所有影像数据的统一管理、影像检查工作流的自动化&a…

POJ3704 括号匹配问题 递归方法

目录 题目 算法 完整代码 题目 参考 递归: https://blog.csdn.net/qq_45272251/article/details/103257953 利用了递归, 但思路稍复杂了 循环: https://blog.csdn.net/weixin_50340097/article/details/114579805 (看起来是递归其实是循环. 每次递归其实是循环内一次迭…

牛客网Python入门103题练习|【07--循环语句(2)】

⭐NP55 2的次方数 描述 在Python中&#xff0c; * 代表乘法运算&#xff0c; ** 代表次方运算。 请创建一个空列表my_list&#xff0c;使用for循环、range()函数和append()函数令列表my_list包含底数2的 [1, 10] 次方&#xff0c;再使用一个 for 循环将这些次方数都打印出来…

【Linux问题合集001】Linux中如何将用户添加到sudo组中的步骤

看教程的前提我的linux当前用户是zhou&#xff0c;看以下步骤时将zhou看做你的liunx当前用户就行了&#xff1a; 一、 以root用户登录到系统。 在Linux系统中&#xff0c;root用户是具有完全系统管理权限的超级用户。要以root用户身份登录到系统&#xff0c;您可>以使用以下…

继续打脸水货教程:关于可变对象与不可变对象

入门教程、案例源码、学习资料、读者群 请访问&#xff1a; python666.cn 大家好&#xff0c;欢迎来到 Crossin的编程教室 &#xff01; 今天这篇我要继续来打脸互联网上各种以讹传讹的水货教程。 前阵子我们聊了下Python中有关函数参数传递以及变量赋值的一些内容&#xff1a;…