此文基于MUI、HBuilderX鞭缭、H5+開發(fā)的APP本地打包剖膳,不適用uniapp。
同款iOS的在這里:
MUI岭辣、HBuilderX吱晒、H5+開發(fā)APP本地打包(iOS)
為什么本地打包
使用HBuilderX
開發(fā)完項(xiàng)目后打包-發(fā)布, 通常情況下直接選擇【app云打包】直接在線打包然后下載安裝包沦童,簡單仑濒、方便。
一般情況下這種方式滿足了大部分需求偷遗,但同時(shí)也有幾個(gè)問題:
- 1墩瞳、項(xiàng)目代碼提交官方后臺(官方保證不保留任何用戶代碼,個(gè)人感覺也沒啥問題)氏豌。
- 2喉酌、云打包有文件大小限制,超過40M的文件打包需要提交申請箩溃,然后付費(fèi)瞭吃。對于我們測試某個(gè)問題,一天打包很多次也是不少的費(fèi)用涣旨。
我們的APP包很大歪架,如果云打包,不合適霹陡。所以必須自己本地打包和蚪。
工具準(zhǔn)備
- 開發(fā)工具 :
HBuilderX
(版本2.4.6.20191210) - 安卓打包SDK:
Android-SDK@2.4.6.71983_20191211
,版本要和HBuilderX
保持一致烹棉,一般都是更新到官方最新版就可以了攒霹。 - 打包工具:Android Studio 3.5.2
操作步驟
1、Android Studio創(chuàng)建一個(gè)工程浆洗,刪除如下無用文件
2催束、復(fù)制SDK->libs->lib.5plus.base-release.aar文件,及其他所需的庫文件到原生工程工程的app->libs目錄下
3伏社、新建如下目錄層級抠刺,導(dǎo)入有HBuilderx
導(dǎo)出的APP資源文件
apps.xxxx.www
: xxx為HB中appid塔淤,appid為應(yīng)用資源manifest.json文件中id節(jié)點(diǎn)的值,必須保持一致否則APP無法運(yùn)行速妖。
4高蜂、導(dǎo)入data目錄文件,并修改dcloud_control.xml文件的apps->app->appid屬性的值改為當(dāng)前應(yīng)用manifest.json文件id節(jié)點(diǎn)的值
5罕容、替換res->drawble目錄應(yīng)用的圖標(biāo)文件
6备恤、修改配置文件
AndroidManifest.xml
,
build.gradle
,
這一步至關(guān)重要,稍有不慎APP或無法運(yùn)行或 閃退锦秒、或相關(guān)功能不起作用露泊、無法獲取相關(guān)權(quán)限。最終配置如下旅择;
AndroidManifest.xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.gech.app">
<uses-permission android:name="android.permission.CAMERA"/>
<uses-feature android:name="android.hardware.camera"/>
<uses-feature android:name="android.hardware.camera.autofocus" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<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.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"/>
<application
android:name="io.dcloud.application.DCloudApplication"
android:allowClearUserData="true"
android:icon="@drawable/icon"
android:label="@string/app_name"
android:largeHeap="true"
>
<provider
android:name="io.dcloud.common.util.DCloud_FileProvider"
android:authorities="com.genertech.jzapp.dc.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/dcloud_file_provider" />
</provider>
<activity
android:name="io.dcloud.PandoraEntryActivity"
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:configChanges="orientation|screenSize"
android:windowSoftInputMode="stateAlwaysHidden"
android:theme="@style/DeviceDefault.Light"
android:name="com.dmcbig.mediapicker.PickerActivity" />
<activity android:configChanges="orientation|screenSize"
android:windowSoftInputMode="stateAlwaysHidden"
android:theme="@style/DeviceDefault.Light"
android:name="com.dmcbig.mediapicker.PreviewActivity"/>
</application>
</manifest>
使用到的權(quán)限:
- 訪問網(wǎng)絡(luò)
- 訪問相機(jī)和相冊
- 存儲權(quán)限
- 應(yīng)用內(nèi)安裝權(quán)限
build.gradle
apply plugin: 'com.android.application'
android {
compileSdkVersion 29
defaultConfig {
applicationId "com.gech.app"
minSdkVersion 25
targetSdkVersion 29
versionCode 108
versionName "1.0.8"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
multiDexEnabled true
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
lintOptions {
disable 'GoogleAppIndexingWarning'
checkReleaseBuilds false
abortOnError true
}
}
repositories {
flatDir {
dirs 'libs'
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation fileTree(include: ['*.aar'], dir: 'libs')
implementation 'androidx.appcompat:appcompat:1.1.0'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'androidx.test.ext:junit:1.1.1'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
// implementation 'androidx.multidex:multidex:2.0.0'
// implementation 'androidx.appcompat:appcompat:1.0.0'
implementation 'androidx.recyclerview:recyclerview:1.0.0'
implementation 'com.nineoldandroids:library:2.4.0'
implementation 'com.github.bumptech.glide:glide:4.5.0'
}
引入第三方庫滤淳、APP配置相關(guān)、文件依賴砌左。
遇到的問題及解決方法
遇到的問題大多都是權(quán)限配置的問題,剛開始不太熟悉用到一些功能也想不起去配置權(quán)限铺敌。
- 1汇歹、訪問相冊時(shí)沒有返回按鈕及導(dǎo)航欄相關(guān),默認(rèn)HB選擇圖片的樣式很不友好偿凭。
解決:
libs引入如下文件
application
中設(shè)置如下:
<activity android:configChanges="orientation|screenSize"
android:windowSoftInputMode="stateAlwaysHidden"
android:theme="@style/DeviceDefault.Light"
android:name="com.dmcbig.mediapicker.PickerActivity" />
<activity android:configChanges="orientation|screenSize"
android:windowSoftInputMode="stateAlwaysHidden"
android:theme="@style/DeviceDefault.Light"
android:name="com.dmcbig.mediapicker.PreviewActivity"/>
2产弹、選擇圖片點(diǎn)擊相機(jī)無法彈出,沒有提示獲取訪問相機(jī)的權(quán)限請求弯囊。
解決:
application
引入權(quán)限即可
<uses-permission android:name="android.permission.CAMERA"/>
<uses-feature android:name="android.hardware.camera"/>
<uses-feature android:name="android.hardware.camera.autofocus" />
3痰哨、APP版本升級時(shí),下載新版本無法安裝匾嘱,權(quán)限問題斤斧。
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"/>
同時(shí)application
添加provider
<provider
android:name="io.dcloud.common.util.DCloud_FileProvider"
android:authorities="com.gech.jzapp.dc.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/dcloud_file_provider" />
</provider>
4、無法js文件加密
在線打包時(shí)可以選擇js原生混合實(shí)現(xiàn)主要的js文件加密霎烙,由于官方加密算法的保密限制離線打包不在支持撬讽,目前還沒有找到合適的實(shí)現(xiàn)方案。
總結(jié)
類似本地打包操作這種嚴(yán)重依賴平臺的操作要多閱讀官方文檔悬垃,但是由于版本區(qū)別游昼、文檔更新不及時(shí)錯(cuò)誤很難避免,實(shí)際遇到問題要時(shí)刻保持關(guān)注尝蠕,多方搜集烘豌。
使用系統(tǒng)功能時(shí)如果不起作用,考慮是否需要申請用戶權(quán)限
Android Studio
打包時(shí)注意gradle
版本問題看彼,由于網(wǎng)絡(luò)問題可能會出現(xiàn)編譯失敗等問題廊佩,直接下載到本地使用更加方便囚聚。HB的版本和離線打包的sdk的打包盡量保持一致,如果不一致可能會出現(xiàn)莫名其妙的問題罐寨。
參考
我是Light413靡挥,一名iOS開發(fā)者,喜歡前端及后臺開發(fā)。我在簡書鸯绿,簡書就是我的陣營跋破,我喜歡在這里學(xué)習(xí),在這里分享瓶蝴。以后文章會不斷的更新毒返,介紹關(guān)于iOS開發(fā)學(xué)習(xí)總結(jié) , 介紹基于H5開發(fā)中感悟記錄總結(jié)舷手。感覺有用就點(diǎn)贊哈拧簸,喜歡就大膽的關(guān)注。