美文网首页H5开发移动端APP
HBuilderX开发APP本地打包(Android篇)

HBuilderX开发APP本地打包(Android篇)

作者: Light413 | 来源:发表于2020-01-12 19:01 被阅读0次

    为什么本地打包

    使用HBuilderX开发完项目后打包-发布, 通常情况下直接选择【app云打包】直接在线打包然后下载安装包,简单、方便。

    一般情况下这种方式满足了大部分需求,但同时也有几个问题:

    • 1、项目代码提交官方后台(官方保证不保留任何用户代码,个人感觉也没啥问题)。
    • 2、云打包有文件大小限制,超过40M的文件打包需要提交申请,然后付费。对于我们测试某个问题,一天打包很多次也是不少的费用。

    我们的APP包很大,如果云打包,不合适。所以必须自己本地打包。

    工具准备

    • 开发工具 :HBuilderX(版本2.4.6.20191210)
    • 安卓打包SDK: Android-SDK@2.4.6.71983_20191211,版本要和HBuilderX保持一致,一般都是更新到官方最新版就可以了。
    • 打包工具:Android Studio 3.5.2

    操作步骤

    1、Android Studio创建一个工程,删除如下无用文件

    1_新建工程.png

    2、复制SDK->libs->lib.5plus.base-release.aar文件,及其他所需的库文件到原生工程工程的app->libs目录下

    2_导入sdk.png

    3、新建如下目录层级,导入有HBuilderx导出的APP资源文件

    导入资源目录.png

    apps.xxxx.www: xxx为HB中appid,appid为应用资源manifest.json文件中id节点的值,必须保持一致否则APP无法运行。

    4、导入data目录文件,并修改dcloud_control.xml文件的apps->app->appid属性的值改为当前应用manifest.json文件id节点的值

    导入data文件.png

    5、替换res->drawble目录应用的图标文件

    修改图标.png

    6、修改配置文件
    AndroidManifest.xml,
    build.gradle,
    这一步至关重要,稍有不慎APP或无法运行或 闪退、或相关功能不起作用、无法获取相关权限。最终配置如下;
    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>
    

    使用到的权限:

    • 访问网络
    • 访问相机和相册
    • 存储权限
    • 应用内安装权限

    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配置相关、文件依赖。

    遇到的问题及解决方法

    遇到的问题大多都是权限配置的问题,刚开始不太熟悉用到一些功能也想不起去配置权限。

    • 1、访问相册时没有返回按钮及导航栏相关,默认HB选择图片的样式很不友好。

    解决:
    libs引入如下文件

    选择相册.png

    application中设置如下:

           <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、选择图片点击相机无法弹出,没有提示获取访问相机的权限请求。

    解决:
    application引入权限即可

        <uses-permission android:name="android.permission.CAMERA"/>
        <uses-feature android:name="android.hardware.camera"/>
        <uses-feature android:name="android.hardware.camera.autofocus" />
    

    3、APP版本升级时,下载新版本无法安装,权限问题。

        <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"/>
    

    同时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文件加密

    在线打包时可以选择js原生混合实现主要的js文件加密,由于官方加密算法的保密限制离线打包不在支持,目前还没有找到合适的实现方案。

    总结

    • 类似本地打包操作这种严重依赖平台的操作要多阅读官方文档,但是由于版本区别、文档更新不及时错误很难避免,实际遇到问题要时刻保持关注,多方搜集。

    • 使用系统功能时如果不起作用,考虑是否需要申请用户权限

    • Android Studio 打包时注意gradle版本问题,由于网络问题可能会出现编译失败等问题,直接下载到本地使用更加方便。

    • HB的版本和离线打包的sdk的打包尽量保持一致,如果不一致可能会出现莫名其妙的问题。

    参考

    我是Light413,一名iOS开发者,喜欢前端及后台开发。我在简书,简书就是我的阵营,我喜欢在这里学习,在这里分享。以后文章会不断的更新,介绍关于iOS开发学习总结 , 介绍基于H5开发中感悟记录总结。感觉有用就点赞哈,喜欢就大胆的关注。

    相关文章

      网友评论

        本文标题:HBuilderX开发APP本地打包(Android篇)

        本文链接:https://www.haomeiwen.com/subject/wlrooctx.html