<原创声明>本文首发于微信公众号,具有原创标识,秉着知识共享、互帮互助的原则欢迎大家的转载,但转载须有度,还请加出处,请尊重别人的劳动成果,谢谢。
HBuilderX是一款不错的前端编辑器,它为使用者提供了云打包和离线打包两种形式,但云打包有着次数限制(可付费解锁)并且服务器繁忙时需要排队等候,不利于开发者的正常调试。从另一方面来看,尽管官方对于隐私保护极为重视,但还是无法让使用者打消代码上传泄露的疑虑,所以离线打包作为第二条打包途径理当重视。
HBuilderX安卓离线打包基于自身的SDK和AndroidStudio软件,AndroidStudio对于初学者来说较难掌握,而官方文档也过于简洁,初期打包可能各种报错,我在社区里看到不少离线打包失败的网友,本着知识共享的原则将HBuilderX安卓离线打包步骤一一演示,希望能帮助到大家。
第一步,AndroidStudio环境测试
首先要下载AndroidStudio软件,下面是官方网址:
https://developer.android.google.cn/studio/index.html
我们可以看到目前最新的版本是3.63,大家根据自己的电脑配置按照要求下载安装即可,如果想了解更多而自己的英文水平不是那么的好,可以私下里使用谷歌浏览器翻译了解。
AndroidStudio下载安装完成后打开,如下图所示选中Empty Activity,点击Next创建。
编辑应用名称、包名和保存位置,包名一般为com.***.*** 样式。我们注意到下方Minimum SDK有下拉列表框选项,这里简单解释一下,这份是用来选择API的,注意到下面的蓝色标记“Your app will run on approximately 92.3% of device”了没,代表安卓用户中有92.3%的用户手机版本大于等于这个数,也就是安卓5.1及以上版本的Android手机可以正常使用这个应用,而低于此版本的即使安装安装成功也会闪退黑屏等无法打开。
这就需要你做一个权衡,怎么才能让应用覆盖更多的用户,太低不利于发展,太高用户基数少,官方文档的建议是大于等于19,我这里选的是22,大家自行斟酌。
点击Finish完成创建。
看到下图的红色箭头了没,这个是创建模拟器的选项,在最初没有模拟器时如红色下划线状态,这在官方文档里最后运行描述时一笔带过,至于我为什么详细描述,在后面我会给大家解释。
点击红色箭头选项。
点击Create Virtual Device创建虚拟设备
在Phone栏里随意选择各种配置的模拟设备,如果你的电脑配置并不是多么好,建议挑选简单的比较容易加载,在这里我挑选了一个320×480的。点击Next。
系统镜像,自己选择。点击Next。
这个默认就行,直接点击Finish。
我们可以看到虚拟设备已经创建完成,点击右上角×直接退出此界面。
顺着最左边的箭头,可以看到刚刚创建的虚拟设备标识,点击右边箭头指向的选项,运行虚拟设备(也可直接在上图中直接点击Actions栏中最左边的三角符号运行。)
等待片刻,模拟器成功打开。
此时点击红色方框中"Run app"选项。
发现刚刚创建的Empty Activity项目成功跑起,这也就证明了你的AndroidStudio已经配置好了。相对于5+APP和uni-app来说,AndroidStudio上手难,成效低,不少个人开发者转向移动APP开发时都没有接触过它,在初涉AndroidStudio时,好多人在安装配置方面往往报错,我第一次也是如此。
在写这篇教程时我是默认你SDK、API等全配置好了的,如果你在这一步报错,模拟器没能打开或者没能成功显示下图界面,就说明哪里仍存在问题,后续运行和调试自己的项目时很有可能会报错,建议大家配置完毕再往下进行。AndroidStudio的配置我就不在赘述,如果有需要后面会考虑附加一篇配置教程。
第二步,APP离线SDK下载
下载安卓离线SDK包,网址如下:
https://nativesupport.dcloud.net.cn/AppDocs/download/android
这里要吐槽的一点是需要通过百度网盘下载...
下载好后在目录
2.6.16\Android-SDK@2.6.16.80137_20200426\SDK\libs
下找到
lib.5plus.base-release.aar
android-gif-drawable-release@1.2.17.aar
miit_mdid_1.0.10.aar
三个文件,复制到自定义的新文件夹方便使用
在目录
2.6.16\Android-SDK@2.6.16.80137_20200426\SDK\assets
下找到data文件夹,打开可以发现下图几个文件。
返回上一级,复制data文件夹如上操作,为了方便与三个文件放到一起。
第三步,HBuilderX生成本地打包资源
如图,在发行选项→原生APP-本地打包(L)中选择生成本地打包App资源(R)。
显示导出成功,顺着路径将自己项目id名的文件夹拷贝,放到上一步自定义的文件夹下,方便使用。这里我的项目id是H525CFE5C,就把它放到与上一步复制的文件一起。
所需资源整理完毕,我们开始进行下一步操作。
第四步,安卓离线打包环境配置
切换到AndroidStudio,如果你第一步操作像我一样只是测试用,那也可以在里面再创建一个Empty Activity项目或者No Activity,在最后我会提到No Activity,这里采用官方文档的方式创建Empty Activity即可。
我们可以看到之前默认的是“Android”展示形式,而官方文档里是Project,为了契合我们把它换成下拉列表选项中最上面Project样式。
如图。
以5+APP举例,如下图将
lib.5plus.base-release.aar
android-gif-drawable-release@1.2.17.aar
miit_mdid_1.0.10.aar
三个文件复制粘贴到libs目录下
点击build.grade,下滑到底部资源引用页面
如下图添加引用资源,
implementation fileTree(dir: 'libs', include: ['*.aar', '*.jar'], exclude: [])
implementation 'com.github.bumptech.glide:glide:4.9.0' // 基座依赖
implementation 'com.android.support:support-v4:28.0.0'
implementation 'com.alibaba:fastjson:1.1.46.android'
点击红色圈中的任一选项进行同步处理。
同步完成(这跟后面在AndroidManifest.xml中application节点添加内容相联系,如果没有添加依赖会报红)。
在原页面最上方配置app版本号。
applicationId为创建时的包名,compileSdkVersion为编译版本,minSdkVersion为兼容最小的版本号,targetSdkVersion为目标版本,有兴趣的可以百度一下三者之间的区别和联系。注意,官方文档中标注“App离线SDK minSdkVersion最低支持19,小于19在部分4.4以下机型上将无法正常使用。”
versionCode需要设定一个数值,一般为1,每次更新版本时versionCode的值都要比前一个设置的值大,否则无法正常安装,versionName一般填写主版本号次版本号和修正号,如图中的“1.0”为最初版本号,其余的可以自行查阅。
下面配置资源,你可能会奇怪我为什么跟官方文档顺序不一样,官方文档这一步是开始在strings.xml里修改应用名。因为资源导入的先后会影响使用和观感,之前在HBuilderX中生成本地打包的app资源还没引入怎么跟strings.xml里的应用名比较呢。
我们在main文件夹下创建assets文件夹。
把刚刚转移到自定义文件夹下的data文件夹拷贝到assets文件夹下。
官方文档中说dcloud1.dat、dcloud2.dat为uni-app所需资源(2.7.0之后已不在需要,升级时需要删除,可以减少apk大小),我演示的是5+App,所以不需要这两个文件。
继续在刚刚创建的assets文件夹下创建apps文件夹,把第三步中的文件(我的是H525CFE5C)拷贝到apps文件夹下。
自此资源引入完成,进行下一步strings.xml操作。
在app→src→main→res→ values配置strings.xml文件,修改应用名称,与
刚刚引入本地打包资源的里的manifest.json文件(assets>apps>“应用id名文件夹”>www下)比较,
发现不一致,遂将string.xml里的“Test2020”改为Mood。
在app→src→main下配置AndroidManifest.xml文件,
在将内容添加到application节点之前,不知道大家发现没,Application标签下红色圈中内部也有activity,它和即将添加的activity之间会不会有冲突呢。
实际上使用AndroidStudio开发软件时,一个activity的使用要在AndroidManifest.xml中声明,我们在第一步末尾运行时发现最后输出了"Hello World!"字样的界面。
仔细观察图中圈出的activity,作为"Run App"跑出来的页面,它在AndroidManifest.xml文件中<intent-filter />标签内做出了主页声明,如果你不考虑这点直接忽略它的话,在模拟器上跑时也许会生成两个相同图标的app,分别打开后一个是“Hello World!”界面,一个是你项目自定义的首页如index.html,也有一定可能无法正常运行,所以最好的办法是直接注释掉。
然后继续下一步,添加内容到application节点(建议复制官方文档里的,下面的复制粘贴后排版会比较乱)。
代码
<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>
<activity
android:name="io.dcloud.PandoraEntryActivity"
android:launchMode="singleTask" android:configChanges="orientation|keyboardHidden|screenSize|mcc|mnc|fontScale|keyboard" 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="h56131bcf" />
</intent-filter>
</activity>
如下图。
下面是应用图标和启动页面的配置
官方文档
icon.png为应用的图标,push.png为推送消息的图标,splash.png为应用启动页的图标,只要将icon.png、push.png、splash.png放置到drawable,drawalbe-ldpi,drawable-mdpi,drawable-hdpi,drawable-xhdpi,drawable-xxhdpi文件夹下,就会自动引用,不同文件夹下对应不同图片尺寸,可参考
https://blog.csdn.net/xuaho0907/article/details/72848520
里面说的比较清楚,我就不多此一举了,我举另外的例子,通过AndroidStudio软件修改应用图标。
在应用目录内部右键调出菜单(New→Image Asset),点击。
出来应用图标设置界面。
修改背景为红色。
修改前景为文字M。
点击Finish。
这样一个简单的应用图标就完成啦,有需求的可以网上详细了解哦。
下面配置资源环境。
将assets下apps文件夹中的manifest.json文件和data文件夹中的dcloud_control.xml文件打开,确保manifest.json中的id和dcloud_control.xml中的appid一致。
自定义基座暂不考虑。
然后就可以愉快地调试程序啦,
Run~
图标
打开。
效果。
最后一步,离线打包
在菜单栏中选择Build,点击Generate Signed Bundle /APK...项,进入打包页面。
选中APK,点击Next。
打包需要签名认证,点击Create new...创建。
如图,第一行创建自定义jks文件,并确定路径,我把它设置为Mood(这种其实是不符合jks格式的,最后生成时可能会有警告,点击OK即可,一般为*-*-*jks,平时还是要多注意规范)。
填写密钥库密码和确定密钥库密码,因为是演示,我把密码设置为123456。
Alias为密钥名称,在这里把它设置mood,Password为密钥密码,仍设置为123456,Validity(years)为密钥有效时间,按年算起,直接默认。
下面First and Last Name为名字和姓氏 ,Organizational Unit为组织单位 ,Organization为组织,City or Locality为城市或地区,State or Province为州或者省份,Country Code(XX)为国家 ,至少选填一种,这里我们直接填上国家China。
点击OK。
跳转到签名界面,因为都帮我们填好了,所以点击Next即可。
这里要说一下V1和V2的选择问题,V1属于旧的验证方式,V2是在安卓版本7.0之后新的验证方式,只勾选V1在Android7.0以上不会使用更安全的验证方式,如果只勾选V2那么安卓版本7.0以下的手机将无法正常安装,所以建议V1和V2同时勾选。
debug和release不用多说,一个是测试版一个是正式版,这里我直接选择release,点击Finish,等待打包完成。
完成打包,点击locate或者直接进入到AndroidStudio项目文件夹app>release下,
找到app-release.apk包,安装。
打开。
教程结束。
总结
不知道大家发现没有,上面都是在创建Empty Activity的基础上进行打包配置的,Empty Activity在app>src>main>java>自定义包名a.b.c的目录下默认生成MainActivity文件,这个文件又绑定了一个layout文件,默认是在app>src>main>res>layout目录下的activity_main.xml文件,在AndroidManifest.xml文件中做出activity声明,最后我们还要把这个activity注释或者删除掉,这也就代表MainActivity文件和activity_main.xml文件没有效用了,蚊子再小也是肉,删掉还可以缩小点app体积。
其实没必要后期删除那么麻烦,大家只需在第一步创建Empty Activity项目用来测试AndroidStudio开发环境即可,在第四步开始时,New>New Project创建No Activity用来打包自己的项目,点击Next,下一页同第一步一样自定义,然后点击Finish,这样一个NoActivity项目就创建完毕啦。
在AndroidManifest.xml页我们可以看到如下页面:
只需把它修改为这样。
再添加内容。
后续步骤都是一样的,这样可以避免在AndroidManifest.xml中注释或删除默认activity,也省去了删除默认文件的麻烦。
官方文档中附加的内容:
基座配置文档:
https://ask.dcloud.net.cn/article/35482
安卓模块及第三方SDK配置:
https://nativesupport.dcloud.net.cn/AppDocs/usemodule/android
Android注意事项:
https://nativesupport.dcloud.net.cn/AppDocs/FAQ/android
最后