## Mall4j 商城 Android 打包文档

文档源自 [uniapp 官方离线打包文档](https://nativesupport.dcloud.net.cn/AppDocs/)，如有出入以官网文档为准

### 准备工作

Android平台签名证书 [生成指南](https://ask.dcloud.net.cn/article/35777)

注册Dcloud账号，登录后台创建应用并申请离线打包 [Appkey](https://nativesupport.dcloud.net.cn/AppDocs/usesdk/appkey)



### 开发环境

Android Studio [官方下载](https://developer.android.google.cn/studio/index.html)

HbulidX  [官方下载](https://www.dcloud.io/hbuilderx.html)

App离线SDK下载  [最新android平台SDK下载](https://nativesupport.dcloud.net.cn/AppDocs/download/android)



### SDK目录说明

```
|-- HBuilder-Hello                App离线打包演示应用
|-- HBuilder-Integrate-AS         集成uni-app的最简示例
|-- SDK                           SDK库文件目录
|-- Feature-Android.xls           Android平台各扩展Feature API对应的详细配置
|-- Readme.txt                    版本说明文件及注意事项
|-- UniPlugin-Hello-AS            uni原生插件开发示例
```



### 导入工程

打开 Android Studio 导入 SDK 中的 HBuilder-Integrate-AS 工程

![导入工程](../img/app打包/android/导入工程.png)



导入后 Android Studio 会自动下载项目中用到的资源，默认源是Google，建议科学上网



### 工程配置

**build.gradle**

将生成的签名证书放入 simpleDemo 目录下
打开 simpleDemo/build.gradle 配置文件，修改包名和签名信息

![修改包名、签名](../img/app打包/android/修改包名、签名.png)



```js
// 签名信息配置
signingConfigs {
    config {
        keyAlias 'key0'				// 证书别名
        keyPassword '123456'		// 证书密码
        storeFile file('test.jks')	// 证书文件路径
        storePassword '123456'		// 证书文件密码
        v1SigningEnabled true
        v2SigningEnabled true
    }
}
```





**Androidmanifest.xml**

打开 simpleDemo/src/main/Androidmanifest.xml，修改包名，配置Appkey

![修改包名、签名](../img/app打包/android/AppKey.png)



### 图标、启动图以及应用名称

#### 图标、启动图

simpleDemo/src/main/res/drawable，icon  为图标，splash  为启动图。可直接替换

#### **应用名称**

simpleDemo/src/main/res/values/strings.xml文件，修改“app_name”字段值

![](../img/app打包/android/应用名称.png)



### 模块及第三方SDK配置

使用模块或第三方SDK需要引入资源，并添加对应配置。

#### 第三方SDK配置

以 [微信支付](https://nativesupport.dcloud.net.cn/AppDocs/usemodule/androidModuleConfig/pay?id=%e5%be%ae%e4%bf%a1%e6%94%af%e4%bb%98) 为例，需要登录 [微信开放平台](https://open.weixin.qq.com/) 创建移动应用，审核成功后获取 微信AppId(appkey) [微信appkey申请方法](http://ask.dcloud.net.cn/article/208)

1. 引入文件

   在 SDK/libs 目录下，找到 payment-weixin-release.aar 将这个文件放入工程中 simpleDemo/libs 目录;

   将 SDK/src/wxapi 下的 WXPayEntryActivity.java 文件复制到工程 simpleDemo/main/java/包名/wxapi 目录

   ![](../img/app打包/android/微信支付1.png)

   

2. 添加配置

   1. Androidmainfest.xml 

      需要在application节点前添加权限

      ```xml
      <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/>
      ```

      application节点下配置如下代码

      ```xml
       <meta-data  android:name="WX_APPID"  android:value="$微信APPID" />
       <activity android:name="io.dcloud.feature.payment.weixin.WXPayProcessMeadiatorActivity"
                  android:exported="false"
                  android:excludeFromRecents="true"
                  android:theme="@style/ProjectDialogTheme"/>
        <activity
                  android:name="$你的包名.wxapi.WXPayEntryActivity"
                  android:exported="true"
                  android:theme="@android:style/Theme.Translucent.NoTitleBar"
                  android:launchMode="singleTop" />
      ```

   2. dcloud_properties.xml  (assets/data)

      ```xml
      <feature name="Payment" value="io.dcloud.feature.payment.PaymentFeatureImpl">
          <module name="Payment-Weixin" value="io.dcloud.feature.payment.weixin.WeiXinPay"/>
      </feature>
      ```
      
   3. build.gradle （simpleDemo/build.gradle）在主工程的build.gradle文件配置 dependencies
   
      ```json
      dependencies {
          implementation fileTree(dir: 'libs', include: ['*.aar', '*.jar'], exclude: [])
          implementation 'androidx.appcompat:appcompat:1.0.0'
          implementation 'androidx.legacy:legacy-support-v4:1.0.0'
          implementation 'androidx.recyclerview:recyclerview:1.0.0'
          implementation 'com.facebook.fresco:fresco:2.5.0'
          implementation "com.facebook.fresco:animated-gif:2.5.0"
          implementation 'com.github.bumptech.glide:glide:4.9.0'
          implementation 'com.alibaba:fastjson:1.2.83'
          implementation 'androidx.webkit:webkit:1.3.0'
      
          //  微信支付依赖配置
          implementation 'com.tencent.mm.opensdk:wechat-sdk-android-without-mta:6.8.0'
      }
      ```
   
      

​			

![](../img/app打包/android/微信支付2.png)





项目中用到的模块及第三方SDK

| 模块/第三方SDK                                               | 需要引入的文件                                  |
| ------------------------------------------------------------ | ----------------------------------------------- |
| [系统定位](https://nativesupport.dcloud.net.cn/AppDocs/usemodule/androidModuleConfig/geolocation?id=系统定位) | 无需引入文件，需添加配置                        |
| [支付宝支付](https://nativesupport.dcloud.net.cn/AppDocs/usemodule/androidModuleConfig/pay?id=支付宝) | payment-alipay-release.aar                      |
| [微信支付](https://nativesupport.dcloud.net.cn/AppDocs/usemodule/androidModuleConfig/pay?id=微信支付) | payment-weixin-release.aar                      |
| [VideoPlayer（视频播放）](https://nativesupport.dcloud.net.cn/AppDocs/usemodule/androidModuleConfig/others?id=videoplayer（视频播放）) | media-release.aar、weex_videoplayer-release.aar |
| [livepusher（直播推流）](https://nativesupport.dcloud.net.cn/AppDocs/usemodule/androidModuleConfig/others.html#livepusher-%E7%9B%B4%E6%92%AD%E6%8E%A8%E6%B5%81) | weex_livepusher-release.aar                     |



### 导出资源

用 HbulidX 打开项目，打开 manifest.json 配置文件，修改 uniapp 应用标识(appid) 为 离线AppKey 中的应用id

![](../img/app打包/android/检查appid.png)



选择项目 -> 发行 -> 原生App-本地打包 -> 生成本地打包App资源，编译完成后控制台会显示资源路径

或执行命令 npm run build:app-android 编译

![](../img/app打包/android/导出资源.png)



### 导入资源

将编译好的app资源拷贝到项目assets->apps下，目录结构如下图

![](../img/app打包/android/导入资源.png)



修改 assets/data/dcloud_control.xml 中的 appid 为 uni-app 的 id



### 打包apk

Android Studio 菜单选择 Build  ->  Generate Signed Bund / APK ，弹窗选择 APK，选择打包用的签名，输入签名信息，选择release， 点击 Finish 即可完成打包

![](../img/app打包/android/打包apk.png)





### 常见问题

#### 未配置AppKey或配置错误

1、查看签名文件是否配置到了主APP的build.gradle

2、查看离线项目中dcloud_control.xml文件中的appid是否与申请AppKey时的appid一致

3、检测离线项目的包名是否申请AppKey时的包名是否一致

4、编译完通过apk解压获取一下签名信息与申请AppKey时填写的SHA1一致



#### 模拟器中app无法运行

要在模拟器运行，需要在 simpleDemo 目录下 build.gradle 配置文件  defaultConfig 下 添加配置 

```xml
android {
	defaultConfig {
       ...
       ndk {
           abiFilters 'arm64-v8a','armeabi-v7a', 'x86'
	   }
    }
}
```

