前语:

各位同学大家好,最近帮别人打包了一个 uni 的项目编译成apk 所以觉得必要共享下。

上效果图

uni app 本地打包apk 教程
uni app 本地打包apk 教程

原始工程

uni app 本地打包apk 教程

这种uni 原始的工程我们直接

uni app 本地打包apk 教程
uni app 本地打包apk 教程

这样我们就可以工作到我们的模拟器或许真机上面去

手动打包

开发环境

  1. Android Studio 下载地址:Android Studio官网ORAndroid Studio中文社区
  2. HBuilderX
  3. App离线SDK下载:最新android途径SDK下载 3.1.10版别起需求恳求Appkey,详细请点击链接

SDK目录说明

	|-- HBuilder-Hello				App离线打包演示运用
	|-- HBuilder-Integrate-AS		集成uni-app的最简示例
	|-- SDK							SDK库文件目录
	|-- Feature-Android.xls			Android途径各扩展Feature API对应的详细配备
	|-- Readme.txt					版别说明文件及留心事项
	|-- UniPlugin-Hello-AS			uni原生插件开发示例

android 离线sdk

百度网盘 提取码: 7rfu

uni app 本地打包apk 教程
我们找到这个 HBuilder-Integrate-AS 导入进去

配备工程

  1. 基础库配备 将lib.5plus.base-release.aar、android-gif-drawable-release@1.2.23.aar、uniapp-v8-release.aar、oaid_sdk_1.0.25.aar和breakpad-build-release.aar拷贝到libs目录下 留心:HBuilder X 3.5.0及以上版别新增库breakpad-build-release.aar
    uni app 本地打包apk 教程

在build.gradle中添加资源引用

留心:HBuilderX3.2.5版别之后适配了AndroidX。 AndroidX版别需添加如下资源

 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'
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'
拷贝代码
uni-app配备时需求在build.gradle中添加aaptOptions配备
    aaptOptions {  
        additionalParameters '--auto-add-overlay'  
        ignoreAssetsPattern "!.svn:!.git:.*:!CVS:!thumbs.db:!picasa.ini:!*.scc:*~"  
    }  
拷贝代码
**留心:更新SDK时需求一起更新aar/jar文件和build.gradle配备**

2. 运用配备

*   配备Appkey
    **3.1.10版别起需求恳求 Appkey,恳求请[参看](https://nativesupport.dcloud.net.cn/AppDocs/usesdk/appkey)**
    翻开Androidmanifest.xml, 导航到Application节点,创建meta-data节点,name为dcloud\_appkey,value为恳求的AppKey如下:
<!---->
    <application
        ...>
        <meta-data
            android:name="dcloud_appkey"
            android:value="替换为自己恳求的Appkey" />
拷贝代码
*   配备运用版别号
    ![image.png](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/a9eedcd098c244548982b8d5ea34c696~tplv-k3u1fbpfcp-zoom-1.image)
    versionCode为运用的版别号(整数值),用于各运用商场的晋级判断,建议与manifest.json中version -> code值一起
    versionName为运用的版别称谓(字符串),在体系运用管理程序中闪现的版别号,建议与manifest.json中version -> name值一起。
    applicationId为运用的包名,一般设置为反向域名,不建议批改。
    建议将targetSdkVersion设置为25或以上。
    App离线SDK minSdkVersion最低支撑21,小于21在部分5.0以下机型上将无法正常运用。
    完好版build.gradle可参看如下内容。
<!---->
    apply plugin: 'com.android.application'
    android {
    	compileSdkVersion 29
    	defaultConfig {
    		applicationId "com.example.myapplication"
    		minSdkVersion 21
    		targetSdkVersion 28
    		versionCode 1
    		versionName "1.0"
    		multiDexEnabled true
    		ndk {
    			abiFilters 'x86', 'armeabi-v7a', 'arm64-v8a'
    		}
    	}
    	compileOptions {
    		sourceCompatibility JavaVersion.VERSION_1_8
    		targetCompatibility JavaVersion.VERSION_1_8
    	}
    	buildTypes {
    		release {
    			minifyEnabled false
    			proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
    		}
    	}
    }
    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 'com.alibaba:fastjson:1.2.83'
    	implementation 'androidx.webkit:webkit:1.3.0'
    }
拷贝代码
**留心:假如需求集成的第三方sdk存在so库文件,只需添加armeabi-v7a、arm64-v8a、x86三个文件夹即可,否则会导致在部分手机上无法工作。**
*   配备运用称谓
    翻开app-> src -> main -> res -> values -> strings.xml文件,批改“app\_name”字段值,该值为装置到手机上桌面闪现的运用称谓,建议与manifest.json中name(基础配备中的运用称谓)对应。
*   配备运用发起页及provider节点
将下述activity信息添加到Androidmanifest.xml的application节点中
**留心:新建的项目默许会有一个MainActivity的节点,有必要删掉!**
**留心:为适配折叠屏,需求在PandoraEntryActivity的android:configChanges特色中追加“smallestScreenSize|screenLayout|screenSize”,参看如下配备。**
**留心:为适配暗黑方式,需求在PandoraEntryActivity的android:configChanges特色中追加“uiMode”,参看如下配备。**
    	<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>
            <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>
    	<activity
            android:name="io.dcloud.PandoraEntryActivity"
            android:launchMode="singleTask"
            android:configChanges="orientation|keyboardHidden|screenSize|mcc|mnc|fontScale|keyboard|smallestScreenSize|screenLayout|screenSize|uiMode"
            android:hardwareAccelerated="true"
            android:permission="com.miui.securitycenter.permission.AppPermissionsEditor"
            android:screenOrientation="user"
            android:theme="@style/DCloudTheme"
            android:windowSoftInputMode="adjustResize">
        </activity>
拷贝代码
添加provider信息到Androidmanifest.xml的application节点中
**留心:3.3.7及以上版别,可以不添加**
    <!--provider节点有必要添加-->
    <provider
        android:name="io.dcloud.common.util.DCloud_FileProvider"
        android:authorities="${apk.applicationId}.dc.fileprovider"
        android:exported="false"
        android:grantUriPermissions="true">
        <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/dcloud_file_provider" />
    </provider>
拷贝代码
**留心:\${apk.applicationId} 有必要替换成当时运用的包名**
假如集成离线SDK时需求重写application,有必要继承自DCloudApplication,否则会导致SDK中事务逻辑无法正常工作。
将对应的application配备到Androidmanifest.xml中(如下),并添加tools:replace="android:name"以防呈现抵触。
    	<application  
    	    android:name="io.dcloud.test.TestApplication"  
    	    android:icon="@drawable/icon"  
    	    android:label="@string/app_name"  
    	    tools:replace="android:name">
    	</application>
拷贝代码
*   配备运用图标和发起界面
    *   图标称谓
        icon.png为运用的图标。
        push.png为推送音讯的图标。
        splash.png为运用发起页的图标。
将icon.png、push.png、splash.png放置到drawable,drawable-ldpi,drawable-mdpi,drawable-hdpi,drawable-xhdpi,drawable-xxhdpi文件夹下,不同文件夹下对应不同图片尺寸,可参看[文档](https://blog.csdn.net/xuaho0907/article/details/72848520)

uni app 本地打包apk 教程
批改Androidmanifest.xml中application节点的icon特色为@drawable/icon。如下图:
uni app 本地打包apk 教程
留心:splash.png在不同设备上闪现效果不一样,为防止呈现拉伸的情况,建议运用Android studio生成.9.png类型图片,可参看文档 3. 资源配备 Android studio默许项目没有assets文件夹,需手动创建,创建方位与java目录同级。 * 创建data文件夹并拷贝资源 将SDK->assets->data文件夹拷贝到刚刚创建的assets文件夹下,如下图:
uni app 本地打包apk 教程
留心:SDK晋级时,data下资源需求一起更新。 * 创建apps文件夹并拷贝资源 将HBuilderX中的项目导出,将导出的资源拷贝到assets->apps下,如下图所示:
uni app 本地打包apk 教程
导出app资源 * 批改dcloud_control.xml文件 批改dcloud_control.xml中的appid为拷贝过来的uni-app的id,保证dcloud_control.xml中的appid与manifest.json中的id与文件夹名一起,如下图所示:
uni app 本地打包apk 教程
生成自定义基座,需求在根节点下添加debug=”true”和syncDebug=”true”,如下图:
uni app 本地打包apk 教程

自定义基座支撑热更新需求将debug-server-release.aar打入apk中,生成正式包时可以删去。
[详细步骤可参看链接](https://ask.dcloud.net.cn/article/35482)

4. 怎样配备暗黑方式 在AndroidManifest.xml中添加: “`

```
拷贝代码
其间可用的方式分别为`light`、`dark`、`auto`, 此设置会影响发起时的默许方式,别的在工作时可运用`plus.nativeUI.setUIStyle`动态批改主题方式。
**留心`PandoraEntryActivity`的`android:configChanges`配备有必要包括uiMode。**

5. 其他配备 AndroidX 配备 需求在项目根目录下的gradle.properties文件中添加如下内容 android.useAndroidX=true android.enableJetifier=true 拷贝代码

工作

联接手机,点击按钮,工作即可。

uni app 本地打包apk 教程

完好工程截图

dcloud_appkey 换成自己的

uni app 本地打包apk 教程
appid 换成自己的
uni app 本地打包apk 教程

怎样获取我们 appkey

我们在uni 官方开发者后台 上传我们jks 前面里面的 md5 sha1 sha256 信息

uni app 本地打包apk 教程
履行这个 指令就可以获取了

keytool -list -v -keystore  xxx.jks

uni app 本地打包apk 教程
然后在 开发者后台找到这一栏
uni app 本地打包apk 教程
把这儿拿到的key 配备上面博客说的当地 然后包名批改跟开发者后台一起
uni app 本地打包apk 教程
签名也要用我们上传的md5 信息的那个jks
uni app 本地打包apk 教程
终究打包就可以了
uni app 本地打包apk 教程
uni app 本地打包apk 教程
uni app 本地打包apk 教程
uni app 本地打包apk 教程
uni app 本地打包apk 教程

终究总结:

终究我们发现uni 打包成apk能工作是运用webview js做桥接 和recat native 有异曲同工之妙 这种跨途径的项目打包终究都不能绕开长途 虽然生跨途径实则是借鸡生蛋 安卓终究是经过android studio 变成apk iOS 端则是经过xcode编译成ipa 终究呢 希望我都文章能帮助到各位同学工作和学习 假如你觉得文章还不错费事给我三连 关注点赞和转发 谢谢