内容简介:H5+应用离线打包的第一步,就是直接去官网下载相应版本的SDKHTML 5+ SDK 更新日志;最好下载最新版本的sdk,因为最新版本的sdk会修复以前出现的Bug(如果你不想自己踩太多的坑的话,我推荐下载最新版本的sdk包)。不要担心官方文档离线打包文档和你使用的版本对应不上,然后造成自己离线打包出现重重阻碍,选择最新的sdk只会让你开头痛苦一下,后面你会比较顺利;不然后面你可能就是不断的打补丁,这个过程估计更痛苦。如果自己的电脑上没有Android Studio(后面AS均代表该软件)的话记得去下载一个
H5+应用离线打包的第一步,就是直接去官网下载相应版本的SDKHTML 5+ SDK 更新日志;最好下载最新版本的sdk,因为最新版本的sdk会修复以前出现的Bug(如果你不想自己踩太多的坑的话,我推荐下载最新版本的sdk包)。不要担心官方文档离线打包文档和你使用的版本对应不上,然后造成自己离线打包出现重重阻碍,选择最新的sdk只会让你开头痛苦一下,后面你会比较顺利;不然后面你可能就是不断的打补丁,这个过程估计更痛苦。
离线打包准备工作
如果自己的电脑上没有Android Studio(后面AS均代表该软件)的话记得去下载一个,我这里使用的是Android Studio3.4.1,先讲一下SDK中各文件夹的用途,如下图:
如图所示,我这里使用的是现在最新的sdk1.9.9.62327,其中目录结构如下:
- 两个markdown文件都是说明文档该版本的离线打包需要注意的一些东西,比如说某某功能不能和另一功能同时存在。
- SDK就是真正的SDK内容,其中的AndroidManifest.xml是安卓配置文件,assets是我们离线打包时需要放置app/src/main/目录下的,完整路径为app/src/main/assets;libs是一些功能依赖包文件(比如个推、分享等等)。
- HBuilder-Hello和HBuilder-integerate-As都是离线打包demo,但是如果使用Android Studio进行离线打包的话请使用HBuilder-integerate-As,如果是使用Eclipse的话可以试一下另一版本(我没试过)。
- 在uni-app中使用5+插件demo、UniPlugin-Hello-AS应该都是开发插件相关demo吧!由于此次没有用过这两个文件夹,因此它们的用处暂时不明白。
- Feature-Android.xls是权限清单,在AndroidManifest.xml配置文件需要使用(调用相应的功能需要相应的权限),可以用来参考。
打开Android Studio,使用以下方式打开HBuilder-integerate-As这个demo:
有两种方式进行离线打包,我上面说的是我推荐的,还有一种的话直接使用start a new Android Studio project新建一个原生安卓项目,看一下官方文档后面操作几乎和我说的这个教程区别不大,就是有些文件的你需要自己删除、添加,具体教程: 使用新版本5+SDK创建最简Android原生工程(Android studio) ,有很多文件都没有,踩的坑会比较多;我推荐的这种打包方式官方文档为: Android平台本地(离线)打包指南 - Android Studio ;官方文档打开之后直接编译一遍,判断官方demo是否能够正常运行,如果demo不能运行下面的步骤就没有意义了,可以考虑换一个SDK包了。如果能正常运行,官方文档后面的第一步是引入依赖包,如果你是按照我推荐的这个方式来离线打包的,
这一步可以直接跳过,因为这个demo几乎已经集成所有的功能,依赖已经引入了,如果你再从新引入,可能会导致AndroidManifest.xml配置文件合并失败,所以信我的,别给自己找麻烦,后面功能正常之后再参考Feature-Android.xls引入相应依赖包和添加权限。 官方文档的第二步分是配置应用权限
也可以直接跳过,demo也集成了,这就是我推荐的原因。 第三步配置第三方库的数据
也可以先跳过等到引入程序之后编译成功再配置。
离线打包
如果你是直接离线打包并没有使用过云打包的话,那么你需要将你代码build后的文件使用hbuilder(x)进行离线打包(使用过云打包的应该看到过)如图:
离线打包在顶部的发行功能菜单中,如果你还只有一个dist文件夹(build的包)那么你需要使用hubuilderx先建一个5+app项目,这样你就会有一个manifest文件,点击上面的manifest.json文件你可以可视化配置一些信息(启动图标、sdk配置等)。配置完成之后点击发行>原生app-本地打包>生成本地打包app资源,放置的位置为
我们的demo项目下的/app/src/main/assets/apps/XXXX/www/目录底下(其中XXXX为你的appId,注意:在AS左边的文件结构显示AcmApp.www代表AcmApp/www这是两个文件夹,不要把文件命名为AcmApp.www,不然上面就变成/app/src/main/assets/apps/XXXX.www了,这里是一个固定的格式appid/www,一定要按照这个格式,否则会导致编译失败),在hbuilderx可以查看或者直接查看manifest.json文件,一般你在使用hbuilderx离线打包时这一段XXXX/www/会自动生成,你只需要选择好放置的路径就行(你打开demo的/app/src/main/assets/apps路径下)。
到这里几乎完成一半了,现在要开始改改配置。
修改相应配置
在你(AS中)打开的demo项目中找到AndroidManifest.xml,修改步骤可以产看官方文档:
由于这里官方文档已经说的很详细了,所以我就不多说了,图标配置也说的很详细了,补充一点
- icon.png代表桌面显示图标。
- push.png代表推送显示图标(没试验过,因为我们应用icon和push使用的为一张图片)。
- splash.png(应用启动页面)。
注意:这里的名字一定要按这个格式命名。
修改/app/src/main/assets/data/dcloud_control.xml文件,appid和manifest.json文件的id一样,appver和manifest.json文件的version.name一样,如下图:
最后修改/app/build.gradle文件,如下图:
其中applicationId配置为你的包名。
如果你是用另一种方法进行离线打包,那你需要按照这种方式一步步从demo里面拷贝文件并进行修改,同时我说的SDK/assets/data文件放置在你离线项目下这个位置就行:
但是没有apps文件?没办法你只能在从demo项目中拷贝过来,然后将H57991E95这个文件夹替换成你的离线包(Hbuilderx通过发行>原生app-本地打包>生成本地打包app资源生成的包)记住一定是这种格式appid/www/真正的资源文件,这也是我不推荐使用这种方式从零开始,如果你有一定的Android功底可以这样。
AndroidManifest.xml重要配置项配置
不出意外上面的步骤已经让你成功离线打包了,而且应该是可以成功编译成功的,但是编译成功不代表你的应用所有功能都正常,这里有几个关于AndroidManifest.xml重要的配置项。
-
个推的配置项
首先得添加权限,检查一下demo是否添加:
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <uses-permission android:name="android.permission.WAKE_LOCK" /> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.VIBRATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.CALL_PHONE" /> <uses-permission android:name="getui.permission.GetuiService.你的app包名" /> <permission android:name="getui.permission.GetuiService.你的app包名" android:protectionLevel="normal" /> 复制代码
后面这两项server在同一设备上只能同时一个,因此配置了个推的就不要配置米推了。推送还需要做如下配置:
<receiver android:name="io.dcloud.feature.apsGt.GTNotificationReceiver"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED"/> <action android:name="你的包名.__CREATE_NOTIFICATION" /> <action android:name="你的包名.__REMOVE_NOTIFICATION" /> <action android:name="你的包名.__CLEAR_NOTIFICATION" /> <action android:name="你的包名.__CLILK_NOTIFICATION" /> </intent-filter> </receiver> 复制代码
上面标注包名的地方一定注意替换成你的包名
-
由于Android7.0+之后为了提高安全性对文件的权限控制更加严格,因此runtime的许多方法都会失效,我遇到的就有install(更新app)、打开文件(openFile),涉及到文件的应该都会有问题,而且还没有错误,这样根本让我无法定位,最后看到一篇博文才让我摆脱了这个问题,不然差一点就放弃了,在配置文件application节点中添加如下代码:
<provider android:name="android.support.v4.content.FileProvider" android:authorities="你的包名.fileprovider" android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_provider" /> </provider> 复制代码
原本那篇博文还需要在src/main/res目路下添加xml/file_proviser.xml,但是我没添加一样可以,如果你遇到没配置runtime功能还是不正常可以尝试配置一下,博文链接: 解决 Android N 7.0 上 报错:android.os.FileUriExposedException ;
-
还有一个值得注意的地方就是有很多需要把它demo的包名替换成你自己的包名,但是有一些地方你是不能替换成你自己的包名的,一旦替换轻则某些功能异常,重则直接编译不通过,因此为了怎么区分,一般不能改动的地方你直接把它的删了,然后在按着他的值再敲一遍,不要复制,如果提示中有它以前那个值代表这是一个引用其他地方的文件,你不能删除;还有一种方法,配置引用的大部分依赖来自于/src/main/java文件夹,你把在纠结是否把包名替换成你的包名的时候,去改路径找相应文件如com.HBuilder.integrate.SDK_WebView(我上面提过在AS文件结构.代表什么意思)则查看 java 文件夹下是否有com/Hbuilder/intergrate文件夹,并且还有SDK_WebView文件,如果有那么你就不能替换成你的包名。简单一点的方法就是凡是配置文件里面的activity节点里的包名就要慎重替换,基本的几个不能替换的:ActivityEntry、SDK_WebView、SDK_WebApp替换之后会导致直接不能通过编译,配置如下:
<activity android:name="com.HBuilder.integrate.ActivityEntry" android:configChanges="orientation|keyboardHidden" android:label="@string/app_name" android:launchMode="singleTask" android:screenOrientation="user" android:windowSoftInputMode="adjustResize"> </activity> <activity android:name="com.HBuilder.integrate.SDK_WebApp" android:configChanges="orientation|keyboardHidden|screenSize|keyboard|navigation|mcc|mnc|fontScale" android:screenOrientation="user" android:theme="@style/DCloudTheme"> <!-- 离线配置沉浸式 SDK_WebApp 作为apk入口时 必须设置 SDK_WebApp 的主题为android:theme="@style/DCloudTheme" --> </activity> <activity android:name="com.HBuilder.integrate.SDK_WebView" android:configChanges="orientation|keyboardHidden|screenSize|keyboard|navigation|mcc|mnc|fontScale" android:screenOrientation="sensor" android:theme="@style/DCloudTheme"></activity> 复制代码
h5+应用离线打包的坑暂时还只踩到这里,以后遇到再过来补充。
最后添加几个有参考价值的官方文档,官方文档确实坑,但是这几个文档你还是可以当作字典一样做参考:
- 5+ API使用的Android权限列表
- Android动态权限申请
- 离线打包关于Android7+文件操作异常问答: Android7解决plus.runtime.openFile方法打开文件无响应问题(需本地打包并修改SDK)
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- ReactNative-调用iOS原生方法
- MUI调用原生自定义方法实现计算缓存与清空缓存
- Deno 1.9 发布:新增原生 HTTP/2 Web 服务器、优化 Rust 调用效率
- 直观讲解-RPC调用和HTTP调用的区别
- 调用链系列一:解读UAVStack中的调用链技术
- 调用链系列二:解读UAVStack中的调用链技术
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。