打包背景:
因为使用uni-app云打包的app,在安卓4.4上运行不了,故而需要使用本地打包的方式解决此问题。
话不多说,直接上手操作,具体如下:
一、开发环境准备
参考官网操作 :开发环境 | uni小程序SDK
需要注意,App 离线 SDK版本不要使用最新的,我目前使用“Android-SDK@3.6.4.81503_20220926” 此版本是可以正常打包运行的,不过官网已经找不到此版本下载链接,如果需要,可以私信我,我转发给你,或者是在官网的QQ群里面问,里面会有很多热心的大佬,说不定刚好他们手上有此版本,这样你就可以问他们给了,我也是通过官方群问群里大佬拿到的,在此感谢 群里 “初学者”提供的SDK版本
二、系统环境变量设置
1、新增系统变量:ANDROID_HOME ,设置目录到类似目录“C:\Users\gxsyh\AppData\Local\Android\Sdk”
接着在系统变量Path上新增5个变量:
C:\Program Files\Java\jre-1.8\bin 【这里要看自己实际安装目录】
%ANDROID_HOME%\platform-tools
%ANDROID_HOME%\emulator
%ANDROID_HOME%\tools
%ANDROID_HOME%\tools\bin
如下图
2、用户变量设置
新增Android_Home变量,并设置
C:\Users\gxsyh\AppData\Local\Android\Sdk 和C:\Users\gxsyh\AppData\Local\Android\Sdk\platform-tools
最后修改Path路径变量
C:\Program Files\Java\jre-1.8\bin 和 %Android_Home%
三、导入工程项目
1、先解压Android-SDK@3.6.4.81503_20220926,并导入项目HBuilder-HelloUniApp【对应 一的第三步:App 离线 SDK 下载】
路径说明:
HBuilder-HelloUniApp:专门用来做打包的,注意打包必须使用此环境
**HBuilder-Integrate-AS:**调试的版本,打正式包不要使用此项目
需要注意,目录不能有中文名称
2、Uni-app本地打包资源生成
点击 发行-》原生App本地打包-》生成本地App资源包
3、复制uni-app生成的资源包到项目apps目录
目录地址例如:D:\01-MyWoekFile\03-HBuilderX\01-build\Android-SDK@3.6.4.81503_20220926\HBuilder-HelloUniApp\app\src\main\assets\apps
四、证书设置
1、登录后台 ,找到云证书【云证书在uni-app生成云打包会自动生成】
2、AndroidManifest.xml文件设置
路径:D:\01-MyWoekFile\03-HBuilderX\01-build\Android-SDK@3.6.4.81503_20220926\HBuilder-HelloUniApp\app\src\main
3、设置dcloud_control.xml
路径:D:\01-MyWoekFile\03-HBuilderX\01-build\Android-SDK@3.6.4.81503_20220926\HBuilder-HelloUniApp\app\src\main\assets\data
4、设置strings.xml 的名称
路径:D:\01-MyWoekFile\03-HBuilderX\01-build\Android-SDK@3.6.4.81503_20220926\HBuilder-HelloUniApp\app\src\main\res\values
5、设置 build.gradle 阿里下载路径【也可以不用设置】
maven() {
url 'https://maven.aliyun.com/repository/jcenter'
}
maven(){
url 'https://maven.aliyun.com/repository/google'
}
maven {
url 'https://maven.aliyun.com/repository/public'
}
maven {
url 'https://maven.aliyun.com/repository/mapr-public'
}
如图:
6、打开云证书并下载证书
7、设置 build.gradle 证书信息配置节点 signingConfigs
例如下面
signingConfigs {
config {
keyAlias '__UNI__159FB9C'
keyPassword 'T1IsdfLh'
storeFile file('D:\\01-MyWoekFile\\03-HBuilderX\\01-build\\Android-SDK@3.6.4.81503_20220926\\HBuilder-Integrate-AS\\simpleDemo\\3051be6ebb0c37e9dbf61cf76feb758f.keystore')
storePassword 'T1IsdfLh'
v1SigningEnabled true
v2SigningEnabled true
}
}
如图
8、设置 build.gradle 文件 android 的节点
接着设置Gradle 和环境依赖版本
8、build.gradle 打包 低版本文件例子
apply plugin: 'com.android.application'
android {
compileSdkVersion 29
buildToolsVersion '29'
defaultConfig {
applicationId "uni.UNI__B98FD4F"
minSdkVersion 19
targetSdkVersion 19
versionCode 100
versionName "1.0.0"
multiDexEnabled true
ndk {
abiFilters 'x86', 'armeabi-v7a', 'arm64-v8a'
}
manifestPlaceholders = [
"apk.applicationId" : "com.android.HelloH5",
"GETUI_APPID" : "unipush的appid",
"plus.unipush.appid" : "unipush的appid",
"plus.unipush.appkey" : "unipuish的appkey",
"plus.unipush.appsecret": "unipush的secrety"
]
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
signingConfigs {
config {
keyAlias '__UNI__B98FD4F'
keyPassword '你的实际密码'
storeFile file('C:\\Users\\gxsyh\\Downloads\\c38d5128bb2728d20c3cfebfdcd578eb.keystore')
storePassword '你的实际密码'
v1SigningEnabled true
v2SigningEnabled true
}
}
buildTypes {
debug {
signingConfig signingConfigs.config
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
release {
signingConfig signingConfigs.config
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
lintOptions {
checkReleaseBuilds false
abortOnError false
}
//使用uniapp时,需复制下面代码
/*代码开始*/
aaptOptions {
additionalParameters '--auto-add-overlay'
//noCompress 'foo', 'bar'
ignoreAssetsPattern "!.svn:!.git:.*:!CVS:!thumbs.db:!picasa.ini:!*.scc:*~"
}
/*代码结束*/
}
repositories {
flatDir {
dirs 'libs'
}
}
dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs')
implementation fileTree(include: ['*.aar'], dir: 'libs')
implementation 'androidx.appcompat:appcompat:1.0.0'
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
/*uniapp所需库-----------------------开始*/
implementation 'androidx.recyclerview:recyclerview:1.0.0'
implementation 'com.facebook.fresco:fresco:2.5.0'
implementation "com.facebook.fresco:animated-gif:2.5.0"
/*uniapp所需库-----------------------结束*/
// 基座需要,必须添加
implementation 'com.github.bumptech.glide:glide:4.9.0'
implementation 'com.alibaba:fastjson:1.1.46.android'
}
五、开始打包app
1、先编译,没有错误才能打包
2、编译通过,开始打包
3、打包成功
路径:D:\01-MyWoekFile\03-HBuilderX\01-build\Android-SDK@3.6.4.81503_20220926\HBuilder-HelloUniApp\app\debug
4、打包兼容安卓4.4操作系统设置【就是最低版本兼容19】
六、打包常见错误处理
1、设置最小兼容版本是19,打包却提示是21
解决办法:直接点击提示文件,打开后修改最低版本号为19,如下图
C:\Users\gxsyh.gradle\caches\transforms-3\2f4e82feceb3692362bfb1e4a7791b5d\transformed\jetified-oaid_sdk_1.0.25
2、打包在安卓4.4项目上面跑的话,必须要选择.apk打包
3、打包后安装,运行提示编译版本不一致
解决办法,打开源码,新增以下代码
"compatible": {
"ignoreVersion": true //true表示忽略版本检查提示框,HBuilderX1.9.0及以上版本支持
},
如图
七、AndroidManifest.xml配置文件例子
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="uni.UNIA410556">
<!-- Barcode(二维码) begin -->
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.FLASHLIGHT" />
<!-- Barcode(二维码) end -->
<uses-permission android:name="android.permission.USE_FINGERPRINT"/>
<!-- Maps(地图) begin -->
<!-- Maps - 百度地图 begin -->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<uses-permission android:name="android.permission.READ_LOGS" />
<!-- Maps(地图) end -->
<!-- Push(推送)只能选择一个推送组件 -->
<!-- Push(推送)-MKeyPush begin -->
<!--
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
-->
<!-- Push(推送)-MKeyPush end -->
<!-- 小米推送 -->
<!--
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.GET_TASKS"/>
<uses-permission android:name="android.permission.VIBRATE"/>
<uses-permission android:name="android.permission.GET_TASKS"/>
<uses-permission android:name="android.permission.INTERACT_ACROSS_USERS_FULL"/>
<uses-permission android:name="android.permission.GET_TOP_ACTIVITY_INFO"/>
<uses-permission android:name="com.HBuilder.integrate.permission.MIPUSH_RECEIVE"/>
<permission android:name="com.HBuilder.integrate.permission.MIPUSH_RECEIVE" android:protectionLevel="signature"/>
-->
<!-- 小米推送 end -->
<!-- Share(分享) begin -->
<!-- Share - 新浪微博分享 -->
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<!-- Share - 腾讯微博分享 -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" />
<!-- Share - 微信分享 -->
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<!-- Push(推送) end -->
<!-- Speech(语音识别) begin -->
<!-- Speech - 讯飞语音云 -->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<!-- Speech(语音识别) end -->
<!-- Statistic(统计) begin -->
<!-- Statistic - 友盟统计 -->
<uses-permission android:name="android.permission.READ_LOGS" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.RECEIVE_USER_PRESENT" />
<!-- Statistic(统计) end -->
<!-- 小米分享 -->
<uses-permission android:name="com.xiaomi.permission.AUTH_SERVICE" />
<!-- 蓝牙 ibeacon权限-->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.BLUETOOTH" />
<!-- 基座删除的部分权限 -->
<uses-permission android:name="android.permission.GET_TASKS" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-feature android:name="android.hardware.camera.autofocus" />
<uses-permission android:name="android.permission.WRITE_CONTACTS" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.SEND_SMS" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.FLASHLIGHT" />
<uses-feature android:name="android.hardware.camera" />
<uses-permission android:name="android.permission.WRITE_SMS" />
<uses-permission android:name="android.permission.READ_SMS" />
<application
android:name="io.dcloud.application.DCloudApplication"
android:allowClearUserData="true"
android:icon="@drawable/icon"
android:label="@string/app_name"
android:largeHeap="true"
android:debuggable="true"
>
<activity
android:name="io.dcloud.PandoraEntry"
android:configChanges="orientation|keyboardHidden|keyboard|navigation"
android:label="@string/app_name"
android:launchMode="singleTask"
android:hardwareAccelerated="true"
android:theme="@style/TranslucentTheme"
android:screenOrientation="user"
android:windowSoftInputMode="adjustResize" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<!-- Statistic(统计)-友盟统计 begin -->
<!-- 官方网站:http://www.umeng.com/analytics -->
<!-- meta-data节点android:name="UMENG_APPKEY"项中android:value值为友盟网站申请的APPKEY -->
<!-- meta-data节点android:name="UMENG_CHANNEL"项中android:value值为发行渠道标识,可任意取值,用于各种发行渠道效果统计 -->
<meta-data
android:name="UMENG_APPKEY"
android:value="友盟appkey" />
<meta-data
android:name="UMENG_CHANNEL"
android:value="友盟渠道" />
<!-- 友盟统计 配置 end -->
<!-- Maps(地图) begin -->
<!-- meta-data节点android:name="com.baidu.lbsapi.API_KEY"项中android:value值为百度地图应用的Appkey -->
<meta-data
android:name="com.baidu.lbsapi.API_KEY"
android:value="百度key"/>
<!-- -->
<service
android:name="com.baidu.location.f"
android:enabled="true"
android:process=":remote"/>
<!-- Maps(地图) end -->
<meta-data android:name="com.amap.api.v2.apikey"
android:value="高德key"/>
<service android:name="com.amap.api.location.APSService" />
<!-- Oauth 授权登陆 start -->
<!-- Oauth QQ start -->
<!-- QQ 分享 配置和授权登陆相同 -->
<meta-data
android:name="QQ_APPID"
android:value="QQ的appid" />
<activity
android:name="com.tencent.tauth.AuthActivity"
android:launchMode="singleTask"
android:noHistory="true">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="QQ的appid" />
</intent-filter>
</activity>
<activity
android:name="com.tencent.connect.common.AssistActivity"
android:screenOrientation="portrait"
android:theme="@android:style/Theme.Translucent.NoTitleBar" />
<!-- Oauth QQ end -->
<!-- Oauth Sina start -->
<!-- Oauth Sina end -->
<!-- Oauth 授权登陆 end -->
<!-- Share(分享) begin -->
<!-- Share - 新浪微博分享 -->
<!-- 官方网站:http://open.weibo.com/ -->
<meta-data
android:name="SINA_REDIRECT_URI"
android:value="微博的回调地址" />
<meta-data
android:name="SINA_SECRET"
android:value="微博的secret" />
<meta-data
android:name="SINA_APPKEY"
android:value="_微博的appkey" />
<!-- 分享 -->
<!-- 微信分享 配置begin -->
<meta-data
android:name="WX_SECRET"
android:value="微信的secret" />
<meta-data
android:name="WX_APPID"
android:value="微信的appid" />
<activity
android:name=".wxapi.WXEntryActivity"
android:exported="true"
android:label="@string/app_name"
android:launchMode="singleTop">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="微信的appid" />
</intent-filter>
</activity>
<!-- 微信分享 配置 end -->
<!-- 微信支付配置 start -->
<activity
android:name=".wxapi.WXPayEntryActivity"
android:exported="true"
android:launchMode="singleTop" />
<meta-data
android:name="WX_APPID"
android:value="微信的appid" />
<!-- 微信支付配置end -->
<!-- 小米分享 -->
<meta-data
android:name="MIUI_APPID"
android:value="_%小米分享的APPID%" />
<meta-data
android:name="MIUI_APPSECRET"
android:value="%小米分享的appSecret%" />
<meta-data
android:name="MIUI_REDIRECT_URI"
android:value="%小米分享的回调地址%" />
<activity android:name="com.xiaomi.account.openauth.AuthorizeActivity" />
<!-- 小米分享 end -->
<!-- Dcloud 开屏广告配置>
<meta-data android:name="DCLOUD_STREAMAPP_CHANNEL" android:value="io.dcloud.H57BCF8D2|H57BCF8D2|12331280401"></meta-data>
<meta-data android:name="DCLOUD_AD_ID" android:value="-553621487"></meta-data>
<meta-data android:name="DCLOUD_AD_SPLASH" android:value="true"></meta-data>
< Dcloud 开屏广告配置-->
<!--百度语音识别 start-->
<meta-data android:name="com.baidu.speech.APP_ID" android:value="百度语音的appid"/>
<meta-data android:name="com.baidu.speech.API_KEY" android:value="百度语音的appkey"/>
<meta-data android:name="com.baidu.speech.SECRET_KEY" android:value="百度语音的secret"/>
<service android:name="com.baidu.speech.VoiceRecognitionService" android:exported="false" />
<!--百度语音识别 end-->
<activity
android:name="io.dcloud.PandoraEntryActivity"
android:launchMode="singleTask"
android:configChanges="orientation|keyboardHidden|screenSize|mcc|mnc|fontScale|keyboard|smallestScreenSize|screenLayout|screenSize"
android:hardwareAccelerated="true"
android:permission="com.miui.securitycenter.permission.AppPermissionsEditor"
android:screenOrientation="user"
android:theme="@style/DCloudTheme"
android:windowSoftInputMode="adjustResize">
<intent-filter>
<category
android:name="android.intent.category.DEFAULT" />
<category
android:name="android.intent.category.BROWSABLE" />
<action
android:name="android.intent.action.VIEW" />
<data
android:scheme=" " />
</intent-filter>
</activity>
<meta-data
android:name="dcloud_appkey"
android:value="4d4f86e31e0b1dd0dc26965d6f9683dd" />
</application>
</manifest>
需要注意