项目背景
前一段时间弄过HBuilder X打包安卓APK文件,过了几年给忘记了,现在再写一遍教程,方便日后操作。
------------------------本教程只打包安卓APK---------
------------------------本教程只打包安卓APK---------
------------------------本教程只打包安卓APK---------
uniapp部分
1、下载HBuilder X开发工具
# hbuilderx官网下载地址
https://www.dcloud.io/hbuilderx.html
2、uniapp申请key
下面是appkey申请的教程地址。打开后登录到后台开发者中心。然后自己申请一个app,这里不多说。
# appkey官网教程
https://nativesupport.dcloud.net.cn/AppDocs/usesdk/appkey.html
# app后台开发者中心
https://dev.dcloud.net.cn
3、修改项目中的appkey
打开项目的mainfest.json文件,然后修改对应的APPID即可。
4、离线打包uniapp
这里要注意,如果你有多个项目,打包时候必须先单击到文件夹上面,然后再去点击【发行】。
5、uniapp完成。
然后等待生成就可以了。前端uniapp打包工作就结束了。
生成keystore文件
1、打开cmd
进入到自己的项目文件夹下面,然后cmd
2、keystore命令
生成命令填写完后,在这个文件夹下面就会生成myprojectalias.keystore,这个文件中的【myprojectalias】这个玩意比较重要,要记住。最好是自己把这一串都右键保存成txt。生成完就结束了。
# 把下面的myproject改成自己喜欢的拼音就行
keytool -genkey -alias myprojectalias -keyalg RSA -keysize 2048 -validity 1825 -keystore myproject.keystore
D:\java\java_source\uniapp-bluetooth>keytool -genkey -alias myprojectalias -keyalg RSA -keysize 2048 -validity 1825 -keystore myprojectalias.keystore
输入密钥库口令:myproject 输入后直接回车,这里不显示
再次输入新口令:myproject 输入后直接回车,这里不显示
您的名字与姓氏是什么?
[Unknown]: wang
您的组织单位名称是什么?
[Unknown]: wahaha
您的组织名称是什么?
[Unknown]: wahaha
您所在的城市或区域名称是什么?
[Unknown]: hangzhou
您所在的省/市/自治区名称是什么?
[Unknown]: zhejiang
该单位的双字母国家/地区代码是什么?
[Unknown]: CN
CN=chen, OU=wahaha, O=wahaha, L=hangzhou, ST=zhejiang, C=CN是否正确?
[否]: y 输入y,然后回车
输入 <myprojectalias> 的密钥口令
(如果和密钥库口令相同, 按回车): 输入后直接回车,这里不显示
再次输入新口令: 输入后直接回车,这里不显示
3、完成
Android Studio部分
1、SDK下载地址
https://developer.android.google.cn/studio?hl=zh-cn
直接下载就行。
2、下载hbuilder的安卓项目
根据自己hbuilder的版本下载对应的安卓项目。文件特别大,还是个百度云,这个太坑了。
# 官网教程
https://nativesupport.dcloud.net.cn/AppDocs/download/android.html
3、安卓studio导入项目
打开android studio工具,然后导入uniapp生成的www静态资源。替换www资源然后修改对应的appkey。
注意,这里的android studio和gradle的版本的对照参照下文
# gradle和android studio配置工具
这里可能还有一些问题,我把我的build.gradle文件分享一下
apply plugin: 'com.android.application' 不要改
android {
compileSdkVersion 31
buildToolsVersion '30.0.3'
defaultConfig {
applicationId "cn.wahaha" 修改
minSdkVersion 21
targetSdkVersion 31
versionCode 1
versionName "1.0"
multiDexEnabled true
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
signingConfigs {
debug {
storeFile file('D:\\keystore\\myprojectKeystore.jks') 修改
storePassword 'myproject' 修改
keyPassword 'myproject' 修改
keyAlias 'myprojectalias' 修改
}
}
buildTypes {
debug {
signingConfig signingConfigs.debug
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
release {
signingConfig signingConfigs.debug
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
aaptOptions {
additionalParameters '--auto-add-overlay'
ignoreAssetsPattern "!.svn:!.git:.*:!CVS:!thumbs.db:!picasa.ini:!*.scc:*~"
}
ndkVersion '26.1.10909125'
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.aar', '*.jar'], exclude: [])
implementation 'androidx.appcompat:appcompat:1.1.0'
implementation 'androidx.localbroadcastmanager:localbroadcastmanager:1.0.0'
implementation 'androidx.core:core:1.1.0'
implementation "androidx.fragment:fragment:1.1.0"
implementation 'androidx.recyclerview:recyclerview:1.1.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.amap.api:location:6.4.2'
}
# 官网教程
https://nativesupport.dcloud.net.cn/AppDocs/importfeproject/android.html
4、android studio生成签名文件
因为官网发布的话需要用到Android 应用签名SHA256,这里就要借助这个工具了。
按照下面的官网教程操作。
https://nativesupport.dcloud.net.cn/AppDocs/package/android.html
经过一系列的操作后,会生成.jks文件。注意,如果要再打包一个app,就把HBuilder-Integrate-AS这个文件夹整个复制,其余的名字都不要改,然后重新生成.keystore,.jks文件。
然后去开发者中心,拿刚才的SHA256申请一个离线打包key。然后在把这个离线打包key替换到项目中。
5、clean
打包前一定要先clean project。build-clean project
6、打包apk
7、完成。
打包完成后,sdk的右下角会提示完成,并且有输出的地址,单击能打开文件夹,直接复制apk文件就行,然后复制到手机上,直接安装。
结束
-----华丽的分割线,以下是凑字数,大家不用花时间看,快去改代码-----
-----华丽的分割线,以下是凑字数,大家不用花时间看,快去改代码-----
-----华丽的分割线,以下是凑字数,大家不用花时间看,快去改代码-----
package cn.renkai721.bean.vo;
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class MakeUpTheWordCount {
private String make_up_the_word_count_column_999999999_1;
private String make_up_the_word_count_column_999999999_2;
private String make_up_the_word_count_column_999999999_3;
private String make_up_the_word_count_column_999999999_4;
private String make_up_the_word_count_column_999999999_5;
private String make_up_the_word_count_column_999999999_6;
private String make_up_the_word_count_column_999999999_7;
private String make_up_the_word_count_column_999999999_8;
private String make_up_the_word_count_column_999999999_9;
private String make_up_the_word_count_column_999999999_10;
private String make_up_the_word_count_column_999999999_11;
private String make_up_the_word_count_column_999999999_12;
private String make_up_the_word_count_column_999999999_13;
private String make_up_the_word_count_column_999999999_14;
private String make_up_the_word_count_column_999999999_15;
private String make_up_the_word_count_column_999999999_16;
private String make_up_the_word_count_column_999999999_17;
private String make_up_the_word_count_column_999999999_18;
private String make_up_the_word_count_column_999999999_19;
private String make_up_the_word_count_column_999999999_20;
public String getMake_up_the_word_count_column_999999999_1() {
return make_up_the_word_count_column_999999999_1;
}
public void setMake_up_the_word_count_column_999999999_1(String make_up_the_word_count_column_999999999_1) {
this.make_up_the_word_count_column_999999999_1 = make_up_the_word_count_column_999999999_1;
}
public String getMake_up_the_word_count_column_999999999_2() {
return make_up_the_word_count_column_999999999_2;
}
public void setMake_up_the_word_count_column_999999999_2(String make_up_the_word_count_column_999999999_2) {
this.make_up_the_word_count_column_999999999_2 = make_up_the_word_count_column_999999999_2;
}
public String getMake_up_the_word_count_column_999999999_3() {
return make_up_the_word_count_column_999999999_3;
}
public void setMake_up_the_word_count_column_999999999_3(String make_up_the_word_count_column_999999999_3) {
this.make_up_the_word_count_column_999999999_3 = make_up_the_word_count_column_999999999_3;
}
public String getMake_up_the_word_count_column_999999999_4() {
return make_up_the_word_count_column_999999999_4;
}
public void setMake_up_the_word_count_column_999999999_4(String make_up_the_word_count_column_999999999_4) {
this.make_up_the_word_count_column_999999999_4 = make_up_the_word_count_column_999999999_4;
}
public String getMake_up_the_word_count_column_999999999_5() {
return make_up_the_word_count_column_999999999_5;
}
public void setMake_up_the_word_count_column_999999999_5(String make_up_the_word_count_column_999999999_5) {
this.make_up_the_word_count_column_999999999_5 = make_up_the_word_count_column_999999999_5;
}
public String getMake_up_the_word_count_column_999999999_6() {
return make_up_the_word_count_column_999999999_6;
}
public void setMake_up_the_word_count_column_999999999_6(String make_up_the_word_count_column_999999999_6) {
this.make_up_the_word_count_column_999999999_6 = make_up_the_word_count_column_999999999_6;
}
public String getMake_up_the_word_count_column_999999999_7() {
return make_up_the_word_count_column_999999999_7;
}
public void setMake_up_the_word_count_column_999999999_7(String make_up_the_word_count_column_999999999_7) {
this.make_up_the_word_count_column_999999999_7 = make_up_the_word_count_column_999999999_7;
}
public String getMake_up_the_word_count_column_999999999_8() {
return make_up_the_word_count_column_999999999_8;
}
public void setMake_up_the_word_count_column_999999999_8(String make_up_the_word_count_column_999999999_8) {
this.make_up_the_word_count_column_999999999_8 = make_up_the_word_count_column_999999999_8;
}
public String getMake_up_the_word_count_column_999999999_9() {
return make_up_the_word_count_column_999999999_9;
}
public void setMake_up_the_word_count_column_999999999_9(String make_up_the_word_count_column_999999999_9) {
this.make_up_the_word_count_column_999999999_9 = make_up_the_word_count_column_999999999_9;
}
public String getMake_up_the_word_count_column_999999999_10() {
return make_up_the_word_count_column_999999999_10;
}
public void setMake_up_the_word_count_column_999999999_10(String make_up_the_word_count_column_999999999_10) {
this.make_up_the_word_count_column_999999999_10 = make_up_the_word_count_column_999999999_10;
}
public String getMake_up_the_word_count_column_999999999_11() {
return make_up_the_word_count_column_999999999_11;
}
public void setMake_up_the_word_count_column_999999999_11(String make_up_the_word_count_column_999999999_11) {
this.make_up_the_word_count_column_999999999_11 = make_up_the_word_count_column_999999999_11;
}
public String getMake_up_the_word_count_column_999999999_12() {
return make_up_the_word_count_column_999999999_12;
}
public void setMake_up_the_word_count_column_999999999_12(String make_up_the_word_count_column_999999999_12) {
this.make_up_the_word_count_column_999999999_12 = make_up_the_word_count_column_999999999_12;
}
public String getMake_up_the_word_count_column_999999999_13() {
return make_up_the_word_count_column_999999999_13;
}
public void setMake_up_the_word_count_column_999999999_13(String make_up_the_word_count_column_999999999_13) {
this.make_up_the_word_count_column_999999999_13 = make_up_the_word_count_column_999999999_13;
}
public String getMake_up_the_word_count_column_999999999_14() {
return make_up_the_word_count_column_999999999_14;
}
public void setMake_up_the_word_count_column_999999999_14(String make_up_the_word_count_column_999999999_14) {
this.make_up_the_word_count_column_999999999_14 = make_up_the_word_count_column_999999999_14;
}
public String getMake_up_the_word_count_column_999999999_15() {
return make_up_the_word_count_column_999999999_15;
}
public void setMake_up_the_word_count_column_999999999_15(String make_up_the_word_count_column_999999999_15) {
this.make_up_the_word_count_column_999999999_15 = make_up_the_word_count_column_999999999_15;
}
public String getMake_up_the_word_count_column_999999999_16() {
return make_up_the_word_count_column_999999999_16;
}
public void setMake_up_the_word_count_column_999999999_16(String make_up_the_word_count_column_999999999_16) {
this.make_up_the_word_count_column_999999999_16 = make_up_the_word_count_column_999999999_16;
}
public String getMake_up_the_word_count_column_999999999_17() {
return make_up_the_word_count_column_999999999_17;
}
public void setMake_up_the_word_count_column_999999999_17(String make_up_the_word_count_column_999999999_17) {
this.make_up_the_word_count_column_999999999_17 = make_up_the_word_count_column_999999999_17;
}
public String getMake_up_the_word_count_column_999999999_18() {
return make_up_the_word_count_column_999999999_18;
}
public void setMake_up_the_word_count_column_999999999_18(String make_up_the_word_count_column_999999999_18) {
this.make_up_the_word_count_column_999999999_18 = make_up_the_word_count_column_999999999_18;
}
public String getMake_up_the_word_count_column_999999999_19() {
return make_up_the_word_count_column_999999999_19;
}
public void setMake_up_the_word_count_column_999999999_19(String make_up_the_word_count_column_999999999_19) {
this.make_up_the_word_count_column_999999999_19 = make_up_the_word_count_column_999999999_19;
}
public String getMake_up_the_word_count_column_999999999_20() {
return make_up_the_word_count_column_999999999_20;
}
public void setMake_up_the_word_count_column_999999999_20(String make_up_the_word_count_column_999999999_20) {
this.make_up_the_word_count_column_999999999_20 = make_up_the_word_count_column_999999999_20;
}
}