成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

京東APP鴻蒙版上架實踐

系統
文章由鴻蒙社區產出,想要了解更多內容請前往:51CTO和華為官方戰略合作共建的鴻蒙技術社區https://harmonyos.51cto.com

[[406829]]

想了解更多內容,請訪問:

51CTO和華為官方合作共建的鴻蒙技術社區

https://harmonyos.51cto.com

背景

隨著鴻蒙2.0的發布,華為部分手機用戶迎來鴻蒙時代,京東作為華為鴻蒙OS的合作APP,首次投入鴻蒙應用商用版開發,目前已上架V10.0.2版本。

鴻蒙OS特性

2021年6月3日,華為舉行了鴻蒙OS2.0發布會。鴻蒙OS帶來了全新桌面及用戶體驗,如桌面圖標支持上滑呼出快捷卡片,原子化能力能通過鴻蒙設備間流轉實現快速分享、顯示,以及統一控制中心(手勢:右上角下滑)、服務中心(手勢:屏幕左下角或右下角向側上方滑動)等。

Android工程鴻蒙化

01 背景

為了利用上鴻蒙的特性,我們開發者需要盡快的將App鴻蒙化。但是將整個App鴻蒙化的工作量是特別龐大的,那么有沒有一種方式既能利用鴻蒙的特性也能快速適配呢,答案是有的,那就是混合包開發模式,整個App基本上沒有大的修改,只需要新增鴻蒙相關模塊用來實現鴻蒙相關特性即可。京東App鴻蒙版能夠做到快速適配上線,并擁有鴻蒙特性,就是利用了這種開發模式。下面我們將以京東App鴻蒙版為例,具體介紹下相關流程。

02 Android工程改造

1.我們需要依賴鴻蒙的一個兼容包(包文件可以聯系我們取得),將我們現有的Application繼承自HarmonyApplication,僅需編譯依賴,不需要真正打進App中。

  1. compileOnly files('libs/abilityshell_ide_java.jar'

2.在AndroidManifest.xml中,向根節點下增加。

  1. <uses-feature android:name="zidane.software.ability" android:required="false" /> 

3.向application節點下新增子節點。

  1. <meta-data android:name="permZA" android:value="true" /> 
  2. <meta-data android:name="multiFrameworkBundle" android:value="true" /> 

自此已經可以構建出鴻蒙需要的apk包了,大家也可以通過配置編譯變體等形式,構建鴻蒙版本的apk包。

注意:鴻蒙包中混入的apk必須要是64位的。

03 配置鴻蒙工程

1.在鴻蒙工程中entry module中的build.gradle里,增加混入apk文件配置。

  1. legacyApkOptions{ 
  2.    legacyApk rootProject.file('android_entry.apk').absolutePath //混入apk的存放路徑 
  3.    signConfig{ 
  4.        storeFile rootProject.file('xxx.keystore')   //混入apk所用簽名文件 
  5.    } 

整體配置如下圖 :

簽名改造,我們需要根據Android apk的簽名來做鴻蒙應用簽名的申請,需要將.keystore或.jks格式的簽名文件轉換成.p12文件,簽名秘鑰和別名保持不變。具體轉換步驟,大家可以自行搜索。

參考: 在轉換.p12文件時,我們遇到了問題,由于我們Android的簽名格式是.keystore,轉出來的.p12文件有問題無法申請鴻蒙應用證書,經過和華為方面溝通,我們將鴻蒙應用的簽名秘鑰和別名保持和Android的一致,解決了打包問題。

配置文件增加屬性,在鴻蒙工程的每個feature module的config.json app節點下,增加originalName,表示混入的apk包名,同時要將bundleName的值也改成一致。

在entry模塊下,新建一個空的Ability類并配置在config.json里作為啟動入口,如:

  1. "abilities": [{ 
  2.  "skills": [{ 
  3.    "entities": ["entity.system.home"], 
  4.    "actions": ["action.system.home"
  5.  }], 
  6.  "orientation""portrait"
  7.  "visible"true
  8.  "name""com.xxx.xxx.xx.EntryAbility"
  9.  "icon""$media:icon"
  10.  "description""$string:mainability_description"
  11.  "label""$string:app_name"
  12.  "type""page"
  13.  "launchType""standard" 
  14. ], 

自此已經可以構建出包含原有Android功能的鴻蒙包了。

Android鴻蒙互調用

01 從Android啟動鴻蒙組件

我們需要集成鴻蒙的一個jar包(可以聯系我們獲得此文件),來實現從Android啟動鴻蒙的組件。如:

  1. Intent intent = new Intent(); 
  2. ComponentName componentName = new ComponentName("your harmony app's bundleName name","your ability's full name"); 
  3. intent.setComponent(componentName); 
  4. intent.putExtras(bundle); 
  5. intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_CLEAR_TASK); 
  6. AbilityUtils.startAbility(context, intent); 

02 鴻蒙模塊調用Android

鴻蒙啟動Android組件

鴻蒙里本身是支持啟動Android組件的,只需要在Intent里增加一個flag

  1. Intent.FLAG_NOT_OHOS_COMPONENT 

如:

  1. Intent intent = new Intent(); 
  2.         Operation operation = new Intent.OperationBuilder() 
  3.                 .withDeviceId(""
  4.                 .withBundleName("your android app’s packagename"
  5.                 .withAbilityName("your android app’s activity fullname"
  6.                 .withFlags(Intent.FLAG_NOT_OHOS_COMPONENT) 
  7.                 .build(); 
  8.         intent.setOperation(operation); 
  9.         startAbility(intent); 

鴻蒙模塊調用Android現有能力

在Android包里,已經有了很多現有功能,如埋點收集、用戶登錄態獲取、定位、地址等等,在鴻蒙模塊里需要用到這些功能時,我們為了節省時間暫時沒有再去開發一遍鴻蒙版,我們利用了Java的反射技術來搞定。經過驗證,在Android中反射鴻蒙以及鴻蒙中反射Android都是可以的。

03 獲取當前是否為鴻蒙系統

在有些場景下,我們需要知道當前系統的運行環境是不是鴻蒙系統,可以使用以下代碼段來實現。

  1. private static final String HARMONY_OS = "harmony"
  2. /** 
  3. check the system is harmony os 
  4. * @return true if it is harmony os 
  5. */ 
  6. public static boolean isHarmonyOS() { 
  7.     try { 
  8.         Class clz = Class.forName("com.huawei.system.BuildEx"); 
  9.         Method method = clz.getMethod("getOsBrand"); 
  10.         return HARMONY_OS.equals(method.invoke(clz)); 
  11.     } catch (ClassNotFoundException e) { 
  12.         Log.e(TAG, "occured ClassNotFoundException"); 
  13.     } catch (NoSuchMethodException e) { 
  14.         Log.e(TAG, "occured NoSuchMethodException"); 
  15.     } catch (Exception e) { 
  16.         Log.e(TAG, "occur other problem"); 
  17.     } 
  18.     return false

鴻蒙OS特性+購物應用場景開發

鴻蒙OS打破了設備間的壁壘,對用戶及應用開發者來說,形成了超級終端。超級終端包含手機、大屏、平板,未來或許會有更多的設備加入,設備間協同合作讓購物體驗變得優質。每個設備不再是孤立的個體,而是基于鴻蒙操作系統的智慧終端,即便用戶拿著不同的設備,也可以有很好的體驗。通過一鍵流轉實現跨設備間的數據傳輸,從而實現無縫的購物體驗。

01 流轉:直播間FA

介紹

流轉泛指多設備間的分布式操作,打破設備界限,多設備聯動,使用戶應用程序可分可合、可流轉。流轉按照體驗可分為跨端遷移和多端協同。流轉支持免安裝運行FA。京東App鴻蒙版本中的直播FA就利用了流轉能力,將當前手機的直播流轉至TV端,做到無縫銜接,并支持通過手機端控制TV端直播顯示的功能。效果如下:

開發

我們以京東App鴻蒙版中直播FA的流轉開發經驗進行介紹,如何具備流轉能力。

1.權限要求

由于使用到了分布式能力,我們需要先把權限配置好,在對應的module的config.json下,增加以下權限:

  1. ohos.permission.GET_DISTRIBUTED_DEVICE_INFO 
  2. ohos.permission.DISTRIBUTED_DATASYNC 
  3. ohos.permission.DISTRIBUTED_DEVICE_STATE_CHANGE 

同時在Ability里,需要增加動態權限申請。

  1. requestPermissionsFromUser( 
  2.        new String[]{SystemPermission.DISTRIBUTED_DATASYNC},  
  3.         Constants.PermissionCode.PERMISSION_DISTRIBUTED_DATASYNC); 

2.關鍵接口

京東APP鴻蒙版上架實踐-鴻蒙HarmonyOS技術社區

3.功能實現

a. 通過流轉服務注冊管理器,將當前FA注冊,注冊時可以指定流轉的過濾條件,如設備類型、目標設備等等:

b. 當需要流轉時,我們通過流轉服務注冊管理器獲取當前滿足條件的設備列表:

系統會自動查找設備,將滿足條件的設備自動展示出來供用戶選擇,當用戶點擊某個設備后,就會回調IContinuationDeviceCallback的onDeviceConnectDone方法,獲取到目標設備的Id后,就可以啟動目標設備的FA。

c. 啟動遠程FA

需要注意的是,在啟動對端設備上FA時,我們要確保對端設備的分布式能力已經被初始化。

02 FA近場分享:商詳FA

介紹

FA近場分享能力依賴于華為分享服務,可以快速實現FA分享的功能。較單純的使用分布式FA流轉功能,為開發者免除了設備發現功能,并且沒有了同賬號同網絡等限制條件。在京東App鴻蒙版中,商詳FA就使用了此功能實現了FA的近場分享,并且能夠做到免安裝打開商詳頁面。下圖分別是A向B發送商詳FA 和 B接收商詳FA。

京東APP鴻蒙版上架實踐-鴻蒙HarmonyOS技術社區
京東APP鴻蒙版上架實踐-鴻蒙HarmonyOS技術社區

開發

我們將以在京東App鴻蒙版中的相關開發經驗介紹下如何進行FA近場分享的開發。

工作原理圖示:

京東APP鴻蒙版上架實踐-鴻蒙HarmonyOS技術社區

由于功能依賴華為分享服務,我們首先要引入IDL文件。

導入IDL文件

在商詳FA module中java同級目錄,創建idl目錄,并創建包名com.huawei.hwshare.third,在此包名下創建IHwShareCallback.idl和 IHwShareService.idl文件,文件具體內容如下:

  1. IHwShareCallback.idl: 
  2. interface com.huawei.hwshare.third.IHwShareCallback { 
  3.  
  4.     [oneway] void notifyState([inint state); 
  5.  
  6. IHwShareService.idl: 
  7. sequenceable ohos.interwork.utils.PacMapEx; 
  8.  
  9. interface com.huawei.hwshare.third.IHwShareCallback; 
  10.  
  11. interface com.huawei.hwshare.third.IHwShareService { 
  12.  
  13.     int startAuth([in] String appId, [in] IHwShareCallback callback);  
  14.     int shareFaInfo([in] PacMapEx pacMapEx); 
  15.  
京東APP鴻蒙版上架實踐-鴻蒙HarmonyOS技術社區

對分享能力進行封裝

以下是我們在商詳FA中封裝好的代碼,大家可以直接使用。

  1. package com.xxx.xxx.xxx; 
  2. import com.huawei.hwshare.third.HwShareCallbackStub; 
  3. import com.huawei.hwshare.third.HwShareServiceProxy; 
  4. import ohos.aafwk.ability.IAbilityConnection; 
  5. import ohos.aafwk.content.Intent; 
  6. import ohos.app.Context; 
  7. import ohos.bundle.ElementName; 
  8. import ohos.eventhandler.EventHandler; 
  9. import ohos.eventhandler.EventRunner; 
  10. import ohos.interwork.utils.PacMapEx; 
  11. import ohos.rpc.IRemoteObject; 
  12. import ohos.rpc.RemoteException; 
  13. import ohos.hiviewdfx.HiLog; 
  14. import ohos.hiviewdfx.HiLogLabel; 
  15. public class ShareFaManager { 
  16.    private static final HiLogLabel LABEL_LOG = new HiLogLabel(3, 0xD000F00, "ShareFa");  
  17.     private static final String LOG_FORMAT = "%{public}s: %{public}s"
  18.     // FA的圖標 byte[] len < 32768 非必須,不傳默認取應用圖標 
  19.     public static final String HM_FA_ICON = "ohos_fa_icon"
  20.     // FA的名字 String len < 1024 非必須,不傳默認取應用名 
  21.     public static final String HM_FA_NAME = "ohos_fa_name"
  22.     // ability類名 String len < 1024 必須 
  23.     public static final String HM_ABILITY_NAME = "ohos_ability_name"
  24.     // 包名 String len < 1024 必須 
  25.     public static final String HM_BUNDLE_NAME = "ohos_bundle_name"
  26.     // FA類型 int 暫時只有0 非必須,默認為0 
  27.     public static final String SHARING_FA_TYPE = "sharing_fa_type"
  28.     // FA卡片展示圖 byte[] len < 153600 必須 
  29.     public static final String SHARING_THUMB_DATA = "sharing_fa_thumb_data"
  30.     // FA卡片展示信息 String len < 1024 必須 
  31.     public static final String SHARING_CONTENT_INFO = "sharing_fa_content_info"
  32.     // 攜帶的額外信息,可帶到被拉起的FA String len < 10240 非必須 
  33.     public static final String SHARING_EXTRA_INFO = "sharing_fa_extra_info"
  34.     private static final String TAG = "ShareHmFaManager"
  35.     private static final String SHARE_PKG_NAME = "com.huawei.android.instantshare"
  36.     private static final String SHARE_ACTION = "com.huawei.instantshare.action.THIRD_SHARE"
  37.     private static final long UNBIND_TIME = 20*1000L; 
  38.     private Context mContext; 
  39.     private String mAppId; 
  40.     private PacMapEx mSharePacMap; 
  41.     private static ShareFaManager sSingleInstance; 
  42.     private HwShareServiceProxy mShareService; 
  43.     private boolean mHasPermission = false
  44.     private EventHandler mHandler = new EventHandler(EventRunner.getMainEventRunner()); 
  45.     //服務綁定回調 
  46.     private final IAbilityConnection mConnection = new IAbilityConnection() { 
  47.         @Override 
  48.         public void onAbilityConnectDone(ElementName elementName, IRemoteObject iRemoteObject, int i) { 
  49.             HiLog.error(LABEL_LOG, LOG_FORMAT, TAG, "onAbilityConnectDone success."); 
  50.             mHandler.postTask(()->{ 
  51.                 mShareService = new HwShareServiceProxy(iRemoteObject); 
  52.                 try { 
  53.                     //華為分享認證授權 
  54.                     mShareService.startAuth(mAppId, mFaCallback); 
  55.                 } catch (RemoteException e) { 
  56.                     HiLog.error(LABEL_LOG, LOG_FORMAT, TAG, "startAuth error."); 
  57.                 } 
  58.             }); 
  59.         } 
  60.         @Override 
  61.        public void onAbilityDisconnectDone(ElementName elementName, int i) { 
  62.            HiLog.info(LABEL_LOG, LOG_FORMAT, TAG, "onAbilityDisconnectDone."); 
  63.            mHandler.postTask(()->{ 
  64.                mShareService = null
  65.                mHasPermission = false
  66.             }); 
  67.         } 
  68.     }; 
  69.     private Runnable mTask = () -> { 
  70.         if (mContext != null && mShareService != null) { 
  71.             mContext.disconnectAbility(mConnection); 
  72.             mHasPermission = false
  73.             mShareService = null
  74.         } 
  75.     }; 
  76.     //華為分享認證授權回調 
  77.     private final HwShareCallbackStub mFaCallback = new HwShareCallbackStub("HwShareCallbackStub") { 
  78.         @Override 
  79.         public void notifyState(int state) throws RemoteException { 
  80.             mHandler.postTask(()->{ 
  81.                 HiLog.info(LABEL_LOG, LOG_FORMAT, TAG, "notifyState: " + state); 
  82.                 if (state == 0) { 
  83.                     mHasPermission = true
  84.                     if (mSharePacMap != null) { 
  85.                        shareFaInfo(); 
  86.                     } 
  87.                 } 
  88.             }); 
  89.         } 
  90.     }; 
  91.     /** 
  92.      \* 單例模式獲取ShareFaManager的實例對象 
  93.      * 
  94.      \* @param context 程序Context 
  95.      \* @return ShareFaManager實例對象 
  96.      */ 
  97.     public static synchronized ShareFaManager getInstance(Context context) { 
  98.         if (sSingleInstance == null && context != null) { 
  99.             sSingleInstance = new ShareFaManager(context.getApplicationContext()); 
  100.         } 
  101.         return sSingleInstance; 
  102.     } 
  103.     private ShareFaManager(Context context) { 
  104.         mContext = context; 
  105.     } 
  106.     private void shareFaInfo() { 
  107.         if (mShareService == null) { 
  108.             return
  109.         } 
  110.         if (mHasPermission) { 
  111.             HiLog.info(LABEL_LOG, LOG_FORMAT, TAG, "start shareFaInfo."); 
  112.             try { 
  113.                 mShareService.shareFaInfo(mSharePacMap); 
  114.                 mSharePacMap = null
  115.             } catch (RemoteException e) { 
  116.                 HiLog.error(LABEL_LOG, LOG_FORMAT, TAG, "shareFaInfo error."); 
  117.             } 
  118.         } 
  119.         // 不使用時斷開 
  120.         mHandler.postTask(mTask, UNBIND_TIME); 
  121.     } 
  122.     /** 
  123.      \* 開始分享 
  124.      * 
  125.      \* @param appId 開發者聯盟網站創建鴻蒙服務/鴻蒙應用時生成的appid 
  126.      \* @param pacMap 服務信息載體 
  127.      */ 
  128.     public void shareFaInfo(String appId, PacMapEx pacMap) { 
  129.         if (mContext == null) { 
  130.             return
  131.         } 
  132.         mAppId = appId; 
  133.         mSharePacMap = pacMap; 
  134.         mHandler.removeTask(mTask); 
  135.         shareFaInfo(); 
  136.         bindShareService(); 
  137.     } 
  138.     /** 
  139.      \* 綁定華為分享服務 
  140.      */ 
  141.     private void bindShareService() { 
  142.             if (mShareService != null) { 
  143.             return
  144.         } 
  145.         HiLog.error(LABEL_LOG, LOG_FORMAT, TAG, "start bindShareService."); 
  146.         Intent intent = new Intent(); 
  147.         intent.setBundle(SHARE_PKG_NAME); 
  148.         intent.setAction(SHARE_ACTION); 
  149.         intent.setFlags(Intent.FLAG_NOT_OHOS_COMPONENT); 
  150.         mContext.connectAbility(intent, mConnection); 
  151.     } 
  152.     } 

3.開始分享

我們將參數進行組裝,調用ShareFaManager的shareFaInfo方法即可自動的完成FA分享功能。如我們將商詳FA進行分享:

京東APP鴻蒙版上架實踐-鴻蒙HarmonyOS技術社區

注意

  1. 使用時要主要傳遞的數據不要超過限定的大小,否則會分享失敗并導致程序崩潰。
  2. 在對端接收到分享后,我們需要將自定義的參數取出來,從Intent中取sharing_fa_extra_info即可。

Ps:針對遠距離的場景,華為也給出了解決方案,通過暢連即可分享購物鏈接。值得注意的是,此時好友還可以通過屏幕共享在商品頁面進行涂鴉互動。

03 服務卡片:搜索卡片

用戶上滑 App 圖標即可生成萬能卡片 ,在桌面呈現更豐富的信息,卡片信息支持實時更新,減少了 App 加載的時間,如目前京東app,用戶上滑 App 圖標可打開快捷搜索入口。

介紹

FA卡片是FeatureAbility的Page模板的一種界面展示形式。FA卡片常用于嵌入到其他應用中作為其界面的一部分顯示,并支持基礎的交互功能。卡片使用方作為卡片展示的宿主負責顯示卡片,卡片使用方的典型應用就是桌面應用。卡片使用方僅限系統應用。

當FA規格小于10M時,可以支持免安裝運行。系統最大支持500個卡片,相同名稱的卡片實例最大是32個。

通過服務卡片的一些特點,如定時更新、免安裝運行等,可以很好的進行快捷入口的引導。如我們可以在卡片上展示活動商品,并定期更新,用戶可以免安裝的打開活動詳情,當用戶產生進一步購買欲望時,用戶可下載整個App進行下單。

開發

卡片的開發支持JS和Java兩種方式。在京東App鴻蒙版中的搜索FA里,我們加入了FA卡片,可以直達搜索。下面我們將以此為例進行開發步驟的講解。

1.卡片配置

首先要在搜索FA的config.json中配置forms節點,比如:

京東APP鴻蒙版上架實踐-鴻蒙HarmonyOS技術社區

我們給SearchAbility節點下添加forms節點,就表示這個卡片的創建及管理由SearchAbility來負責。

注意:必須要設置label屬性,必須是資源形式的且不能是包名。

屬性解釋:

京東APP鴻蒙版上架實踐-鴻蒙HarmonyOS技術社區

實現卡片相關回調

在SearchAbility中,復寫以下幾個方法:

 京東APP鴻蒙版上架實踐-鴻蒙HarmonyOS技術社區

創建:在創建卡片時,我們可以從Intent中獲取當前要創建卡片的Id,如:

京東APP鴻蒙版上架實踐-鴻蒙HarmonyOS技術社區

這是一個很簡單的卡片,我們沒有對卡片中的視圖設置任何數據和事件,那么點擊卡片后,打開的就是負責管理卡片的Ability。如果需要設置數據和事件,可以使用以下方式

創建ComponentProvider;

通過ComponentProvider設置對應View的數據,以及點擊事件,目前能夠支持的事件有START_ABILITY和START_SERVICE兩類;

將ComponentProvider對象合并入ProviderFormInfo中。

京東APP鴻蒙版上架實踐-鴻蒙HarmonyOS技術社區

更新:當觸發了更新卡片方法時,我們可以進行數據更新,并將最新的數據更新到卡片View上。

京東APP鴻蒙版上架實踐-鴻蒙HarmonyOS技術社區

刪除:當卡片使用方將卡片刪除,我們可能需要將對應卡片在App內的相關持久化數據進行刪除。

京東APP鴻蒙版上架實踐-鴻蒙HarmonyOS技術社區

3.配置EntryCard目錄

配置EntryCard目錄,以便讓系統能夠識別出服務卡片,并展示在服務中心的推薦里。新建應用時可以勾選自動生成,如果是之前IDE創建的工程,則需要手動補充上。

1)在工程根目錄下創建EntryCard目錄;

2) EntryCard目錄下,創建一個文件夾,取名為擁有卡片的FA工程名,如我們的搜索FA擁有服務卡片,搜索FA的工程名叫searchfeature,那我們就創建一個文件夾,名字就叫做searchfeature;

3)在searchfeature目錄下創建base/snapshot兩級目錄,在其中放置我們的卡片圖片,其命名方式為formnamedimensions,如搜索卡片的卡片名稱配置的是search_card,尺寸是22的,那么這個圖片就命名為search_card2x2.png。

鴻蒙App打包及上架

01 打包構建

通過以上配置,我們已經可以進行鴻蒙App的構建了。目前鴻蒙App分為兩種構建形式,debug和release,可以通過DevEco工具自帶的編譯任務或者使用gradle的assembleDebug signReleaseApp任務進行構建。

京東APP鴻蒙版上架實踐-鴻蒙HarmonyOS技術社區

其中debug模式構建方式出來的產物是多個目標設備的多個.hap文件,每個FA都會構建出各自的.hap文件;release會構建出一個.app文件,我們需要將此文件進行上架發布。

京東APP鴻蒙版上架實踐-鴻蒙HarmonyOS技術社區

安裝及運行

開發者無法安裝.app安裝包,此文件只能用于上架應用市場。

通過adb shell bm get udid獲取設備UDID后,錄入到開發者中心,并生成證書文件,我們就可以安裝.hap包。

安裝時可以將文件push到手機某個目錄下(如sdcard/hmphone),然后使用adb shell bm install p /sdcard/hmphone/進行安裝,每次安裝可以先刪除之前文件。

注意: 由于我們無法安裝驗證.app包,我們要保證在debug和release兩種構建模式下,我們的代碼不會發生改變。

02 應用上架及發布

1.如果還沒有在開發者中心創建鴻蒙應用的話,需要先新增一個鴻蒙應用,包名和之前Android的包名保持一致,并關聯到同一個項目中。

京東APP鴻蒙版上架實踐-鴻蒙HarmonyOS技術社區

選擇我們創建的鴻蒙應用,在【應用信息】頁面中,將應用安裝與升級修改為如下圖所示。

京東APP鴻蒙版上架實踐-鴻蒙HarmonyOS技術社區

在【版本信息】頁面中,點擊【版本/升級】創建新版本,在新版本頁面中的【軟件版本】模塊下,上傳我們構建的.app軟件包后并勾選,在當前頁面填入相關信息后即可提交審核,待審核通過后,在應用市場上就會出現了。

京東APP鴻蒙版上架實踐-鴻蒙HarmonyOS技術社區

后續規劃

鴻蒙OS為消費者建立便捷的購物超級終端模式提供了可能,隨著鴻蒙生態的豐富,人們的購物形式也會隨之出現新的改變。京東將從用戶角度出發,結合鴻蒙OS,讓更多的用戶在更多的設備和場景享受京東的優質服務,敬請期待……

想了解更多內容,請訪問:

51CTO和華為官方合作共建的鴻蒙技術社區

https://harmonyos.51cto.com

 

責任編輯:jianghua 來源: 鴻蒙社區
相關推薦

2019-07-04 14:11:48

App StoreiOS應用開發

2024-05-29 07:56:41

2015-07-15 10:08:26

Windows 10微軟

2016-12-28 14:16:25

京東高并發系統設計

2017-01-10 16:04:02

容器MySQL實踐

2020-02-22 13:00:26

App StoreiOSOffice

2017-02-24 10:30:51

iOS開源App Store

2019-03-05 14:42:25

微軟Surface GoLTE

2020-07-16 11:31:52

迅雷iOS版安卓版云盤

2022-01-11 15:35:22

數字人民幣子錢包區塊鏈

2021-04-28 09:08:23

Kotlin協程代碼
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产免费高清 | 成人av免费在线观看 | 在线一区二区观看 | 欧美综合久久 | 久久久久久久久久性 | 麻豆一区一区三区四区 | 日韩欧美国产精品一区二区 | av第一页 | 久久久www成人免费精品 | 国产精品一区二区久久久久 | 欧美一级视频免费看 | 黄a免费网络 | 欧美色性| 欧美视频精品 | 欧美1区| 亚洲国产精品日本 | 激情五月综合网 | 日韩欧美国产精品一区二区三区 | 中文字幕 在线观看 | 国产十日韩十欧美 | gogo肉体亚洲高清在线视 | 久久久成人网 | 毛片国产 | 国产精品视频在线播放 | 欧美综合一区 | 韩国欧洲一级毛片 | 久草新在线 | 久久久久九九九女人毛片 | 无码一区二区三区视频 | 精品一区久久 | 一级黄色片网站 | 国产一区二区三区日韩 | 欧美黑人又粗大 | 少妇精品久久久久久久久久 | 日韩精品在线一区 | 国产情侣激情 | 国产精品久久久久久一级毛片 | 天天操天天舔 | 香蕉91 | av永久免费 | 国产视频中文字幕在线观看 |