uni-app开发应用,Android Studio 本地打包发布

打包背景:

因为使用uni-app云打包的app,在安卓4.4上运行不了,故而需要使用本地打包的方式解决此问题。

话不多说,直接上手操作,具体如下:

一、开发环境准备

参考官网操作 :开发环境 | uni小程序SDK

需要注意,App 离线 SDK版本不要使用最新的,我目前使用“[email protected]_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、先解压[email protected]_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\[email protected]_20220926\HBuilder-HelloUniApp\app\src\main\assets\apps

四、证书设置

1、登录后台 ,找到云证书【云证书在uni-app生成云打包会自动生成】

登录 (dcloud.net.cn)

2、AndroidManifest.xml文件设置

路径:D:\01-MyWoekFile\03-HBuilderX\01-build\[email protected]_20220926\HBuilder-HelloUniApp\app\src\main

3、设置dcloud_control.xml

路径:D:\01-MyWoekFile\03-HBuilderX\01-build\[email protected]_20220926\HBuilder-HelloUniApp\app\src\main\assets\data

4、设置strings.xml 的名称

路径:D:\01-MyWoekFile\03-HBuilderX\01-build\[email protected]_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\\[email protected]_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\[email protected]_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>

需要注意

猜你喜欢

转载自blog.csdn.net/hymlx526/article/details/130754632