uniapp離線打包指南

uniapp本地打包官方文檔,可以根據(jù)官方文檔中的sdk文件夾UniPlugin-Hello-AS為基礎進行改造,剛開始摸索時,也是一點點看文檔、看demo進行搭建的,畢竟一點安卓開發(fā)的基礎也沒有,又因為業(yè)務需求必須要開發(fā)一個推送功能module,所以就先把本地測試環(huán)境搭建好,方便開發(fā)module。
首先創(chuàng)建一個新的空項目(android studio默認已經(jīng)安裝好,以下稱作“ad”),File=>New=>New Project=>Empty Activity,

Empty_Activity.png

接下來進行一些項目最基礎的配置
image.png

然后Finish,ad會自動下載配置依賴,慢慢等待......
文件目錄如下,各個文件的具體功能,可以自行百度(主要是不專業(yè),怕說錯嘍) ↓↓↓↓

│  .gitignore
│  build.gradle 
│  gradle.properties
│  gradlew
│  gradlew.bat
│  local.properties
│  settings.gradle
├─app
│  │  .gitignore
│  │  build.gradle
│  │  proguard-rules.pro
│  │
│  ├─libs
│  └─src
│      ├─androidTest
│      │
│      ├─main
│      │  │  AndroidManifest.xml
│      │  │
│      │  ├─java
│      │  │  └─com
│      │  │      └─fq
│      │  │          └─test
│      │  │                  MainActivity.java
│      │  │
│      │  └─res
│      │
│      └─test
│
└─gradle
    └─wrapper
            gradle-wrapper.jar
            gradle-wrapper.properties

以下是自己的個人理解:

settings.gradle文件

settings.gradle文件是用于寫項目之間的依懶關系,里面有項目的總名稱,包含了哪些模塊等,

dependencyResolutionManagement {
    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    repositories {
        google()
        mavenCentral()
        jcenter() // Warning: this repository is going to shut down soon
    }
}
rootProject.name = "MyTest"
include ':app'

我不曉得里面的dependencyResolutionManagement有什么用,所以根據(jù)uniapp給的demo,把這個刪除了,只留下了:

rootProject.name = "MyTest"
include ':app'  // 用于增加子模塊,如果這個時候想加一個新的module  可以再加一個 include ":<module名>"

gradle.properties文件是配置gradle的,uniapp 本地開發(fā)需要這三個配置

org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8
android.useAndroidX=true
android.enableJetifier=true

build.gradle文件

build.gradle文件是配置gradle依賴下載源,gradle構(gòu)建工具的版本,我這里改成了阿里的源

buildscript {
    repositories {
        maven {
            url 'https://maven.aliyun.com/repository/google'
        }
        maven {
            url 'https://maven.aliyun.com/repository/public'
        }
        maven {
            url 'https://maven.aliyun.com/repository/jcenter'
        }
    }
    dependencies {
        classpath "com.android.tools.build:gradle:4.2.2"
    }
}
allprojects {
    repositories {
        maven {
            url 'https://maven.aliyun.com/repository/google'
        }
        maven {
            url 'https://maven.aliyun.com/repository/public'
        }
        maven {
            url 'https://maven.aliyun.com/repository/jcenter'
        }
    }
}
task clean(type: Delete) {
    delete rootProject.buildDir
}

最外圍的改動就這些了,其他的操作都在app這個主項目文件夾下

注意以下的操作都在app文件夾內(nèi)

刪除掉了src下所有文件夾,新建了libssrc文件夾,

lib目錄內(nèi)容

其中libs下是需要引入的依賴

以下為運行必備的依賴
android-gif-drawable-release@1.2.23.aar
lib.5plus.base-release.aar
oaid_sdk_1.0.25.aar
uniapp-v8-release.aar

其他的依賴可以按照自己的實際需要放入,具體的增加哪些可以根據(jù)下載的sdk文件夾Feature-Android.xls查看
Feature-Android文件位置
這些是我用到的

build.gradle內(nèi)的內(nèi)容

// 聲明是Android程序,
// com.android.application 表示這是一個應用程序模塊,可直接運行
// com.android.library 標識這是一個庫模塊,是依附別的應用程序運行
apply plugin: 'com.android.application'
android {
    compileSdkVersion 30
    buildToolsVersion "30.0.3"
    defaultConfig {
        applicationId "app包名"  //注意確定自己的包名,不要有"test"之類的字眼,不然提交到應用商城會過不去
        minSdkVersion 21
        targetSdkVersion 26
        versionCode 79 // 對應hbuilder的 -> 應用版本號
        versionName "1.1.9.0"  // 對應hbuilder的 -> 應用版本名稱
//        multiDexEnabled true
        ndk {
            abiFilters 'x86', 'armeabi-v7a', 'arm64-v8a', "x86_64" // 允許在哪些設備中運行你的app
        }
        archivesBaseName = "fqApp-$versionName" // 構(gòu)建的apk名字
    }

    signingConfigs {
        config {  // 配置證書簽名,如何生成證書 https://ask.dcloud.net.cn/article/35777
            storeFile file('./lalala.keystore')  // file中是你app證書的位置
            storePassword '123456'
            keyAlias 'lalala'
            keyPassword '123456'
            v1SigningEnabled true
            v2SigningEnabled true
        }
    }
    /**
     * 代碼混淆
     */
    buildTypes {
        release {
            signingConfig signingConfigs.config // 簽名配置
//            zipAlignEnabled true // 是否支持zip
//            shrinkResources true // 移除無用的resource文件
            debuggable true
            minifyEnabled true // 代碼混淆
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
        debug {
//            zipAlignEnabled true
            debuggable true
            signingConfig signingConfigs.config
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    //使用uniapp時,需復制下面代碼
    /*代碼開始*/
    aaptOptions {
        additionalParameters '--auto-add-overlay'
        ignoreAssetsPattern "!.svn:!.git:.*:!CVS:!thumbs.db:!picasa.ini:!*.scc:*~"
    }
    /*代碼結(jié)束*/
    /**
     * 編譯配置
     */
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
    lintOptions {
        abortOnError false
    }
}
dependencies {
    implementation fileTree(include: ['*.jar','*.aar'], dir: 'libs')

    implementation 'androidx.appcompat:appcompat:1.0.0'
    implementation 'androidx.legacy:legacy-support-v4:1.0.0'

    /*uniapp所需庫-----------------------開始*/
    implementation 'androidx.recyclerview:recyclerview:1.0.0'
    implementation 'com.facebook.fresco:fresco:2.5.0'
    implementation "com.facebook.fresco:animated-gif:2.5.0"
    /*uniapp所需庫-----------------------結(jié)束*/

    // 基座需要,必須添加
    implementation 'com.github.bumptech.glide:glide:4.9.0'
    implementation 'com.alibaba:fastjson:1.1.46.android'


    // 添加uni-app插件
    // implementation project(":fqPush")
}

src目錄

src目錄

目錄截圖,以下是其中各個文件內(nèi)容,可以對照此圖,查看各個文件的位置

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="你的包名">
    <supports-screens
        android:anyDensity="true"
        android:largeScreens="true"
        android:normalScreens="true"
        android:resizeable="true"
        android:smallScreens="true" />

    <uses-feature android:name="android.hardware.camera" />
    <uses-feature android:name="android.hardware.camera.autofocus" />
<!-- app權限 根據(jù)實際情況增減  -->
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.CALL_PHONE" />
    <uses-permission android:name="android.permission.CAMERA" />
    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
    <uses-permission android:name="android.permission.FLASHLIGHT" />
    <uses-permission android:name="android.permission.GET_TASKS" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.INSTALL_PACKAGES" />
    <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
    <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
    <uses-permission android:name="android.permission.READ_LOGS" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
    <uses-permission android:name="android.permission.RECORD_AUDIO" />
    <uses-permission android:name="android.permission.VIBRATE" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="android.permission.WRITE_SETTINGS" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
    <uses-permission android:name="android.permission.BROADCAST_PACKAGE_ADDED" />
    <uses-permission android:name="android.permission.BROADCAST_PACKAGE_CHANGED" />
    <uses-permission android:name="android.permission.BROADCAST_PACKAGE_INSTALL" />
    <uses-permission android:name="android.permission.BROADCAST_PACKAGE_REPLACED" />
    <uses-permission android:name="android.permission.RESTART_PACKAGES" />

    <application
        android:name="io.dcloud.application.DCloudApplication"
        android:allowClearUserData="true"
        android:icon="@drawable/icon"
        android:label="@string/app_name"
        android:supportsRtl="true"
        >
        <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:configChanges="orientation|keyboardHidden|screenSize|mcc|mnc|fontScale|keyboard|smallestScreenSize|screenLayout|screenSize"
            android:hardwareAccelerated="true"
            android:launchMode="singleTask"
            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>
        <!--provider節(jié)點必須添加-->
        <provider
            android:name="io.dcloud.common.util.DCloud_FileProvider"
            android:authorities="你的包名.dc.fileprovider"
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/dcloud_file_provider" />
        </provider>
        //這里我用了高德地圖 所以需要加這個 不用可以不加,具體加哪些還是看上面提到的excel文件
<!-- 高德 開始 -->
        <meta-data
            android:name="com.amap.api.v2.apikey"
            android:value="地圖的key"
            >
        </meta-data>
        <service
            android:name="com.amap.api.location.APSService"
            >
        </service>
<!-- 高德 結(jié)束 -->
        // 離線打包的key, 沒它可啟動不了哦~
        <meta-data
            android:name="dcloud_appkey"
            android:value="你的離線打包key" />
    </application>

</manifest>

離線打包的key 從dcloud開發(fā)者中心獲取


離線打包key

string.xml

<resources>
    <string name="app_name">你的應用名稱</string>
</resources>

proguard-rules.pro

-optimizationpasses 5
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-dontpreverify
-verbose

#-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*
-dontoptimize

-keep public class * extends android.app.Activity
-keep public class * extends android.app.Application
-keep public class * extends android.app.Service
-keep public class * extends android.content.BroadcastReceiver
-keep public class * extends android.content.ContentProvider
-keep public class * extends android.app.backup.BackupAgentHelper
-keep public class * extends android.preference.Preference
-keep public class * extends io.dcloud.common.DHInterface.IPlugin
-keep public class * extends io.dcloud.common.DHInterface.IFeature
-keep public class * extends io.dcloud.common.DHInterface.IBoot
-keep public class * extends io.dcloud.common.DHInterface.IReflectAble

-keep class io.dcloud.feature.speech.** {*;}
-keep class io.dcloud.net.** {*;}
-keep class io.dcloud.common.constant.** {*;}
-keep class io.dcloud.common.sonic.** {*;}
-keep class io.dcloud.common.DHInterface.** {*;}
-keep class io.dcloud.common.util.** {*;}
-keep class io.dcloud.common.adapter.** {*;}
-keep class io.dcloud.feature.internal.reflect.** {*;}
-keep class io.dcloud.feature.internal.sdk.** {*;}
-keep class io.dcloud.feature.payment.** {*;}
-keep class io.dcloud.sdk.** {*;}
-keep class com.** {*;}
-keep class io.dcloud.nineoldandroids.** {*;}
-keep class vi.com.gdi.** {*;}
-keep class androidx.** {*;}
-dontwarn pl.droidsonroids.gif.**

-keepclasseswithmembers class * extends io.dcloud.js.geolocation.GeoManagerBase {
    <methods>;
}

-keep class io.dcloud.share.AbsWebviewClient
-keepclasseswithmembers class io.dcloud.share.AbsWebviewClient {
    <methods>;
}

-keep class io.dcloud.share.ShareAuthorizeView
-keepclasseswithmembers class io.dcloud.share.ShareAuthorizeView {
    <methods>;
}
-keep class io.dcloud.share.IFShareApi
-keep public class * extends io.dcloud.share.IFShareApi
-keepclasseswithmembers class io.dcloud.share.IFShareApi {
    <methods>;
}




-keepattributes Exceptions,InnerClasses,Signature,Deprecated, SourceFile,LineNumberTable,*Annotation*,EnclosingMethod
-keep class io.dcloud.appstream.StreamAppManager
-keepclasseswithmembers class io.dcloud.appstream.StreamAppManager {
    public protected <methods>;
}

-keep class io.dcloud.common.DHInterface.IReflectAble
-keep public class * extends io.dcloud.common.DHInterface.IReflectAble{
  public protected <methods>;
  public protected *;
}
-keep class **.R
-keep class **.R$* {
    public static <fields>;
}
-keep public class * extends io.dcloud.common.DHInterface.IJsInterface{
  public protected <methods>;
  public protected *;
}

-keepclasseswithmembers class io.dcloud.EntryProxy {
    <methods>;
}

-keep class * implements android.os.IInterface {
  <methods>;
}

-keepclasseswithmembers class *{
  public static java.lang.String getJsContent();
}
-keepclasseswithmembers class io.dcloud.appstream.StreamAppScriptEntry {
    <methods>;
}
-keepclasseswithmembers class *{
    public static void onReceiver1(android.content.Intent, android.content.Context);
}

-keepclasseswithmembers class *{
  public static io.dcloud.share.AbsWebviewClient getWebviewClient(io.dcloud.share.ShareAuthorizeView);
}
-keepclasseswithmembers class *{
    public java.lang.String exec(java.lang.String,java.lang.String,java.lang.String[]);
}
-keepattributes Exceptions,InnerClasses,Signature,Deprecated, SourceFile,LineNumberTable,*Annotation*,EnclosingMethod

-keepclasseswithmembers class * {
    public <init>(android.content.Context, android.util.AttributeSet);
}

-keepclasseswithmembers class * {
    public <init>(android.content.Context, android.util.AttributeSet, int);
}

-keep public class * extends android.app.Application{
  public static <methods>;
  public *;
}

-keepclassmembers class * extends android.app.Activity {
   public void *(android.view.View);
   public static <methods>;
}

-keepclassmembers enum * {
    public static **[] values();
    public static ** valueOf(java.lang.String);
}

-keep class * implements android.os.Parcelable {
  public static final android.os.Parcelable$Creator *;
}

-keepattributes Signature
-keep class io.dcloud.encryption.K {*;}
-dontwarn com.igexin.**
-keep class org.json.** { *; }
-dontwarn com.amap.**
-dontwarn org.apache.commons.**
-dontwarn com.sina.weibo.sdk.**

-keep class tv.danmaku.ijk.media.player.** {*;}

-keep class uni.** {*;}
-keep class pl.** {*;}
-keep class io.** {*;}
-keep class org.mozilla.**{*;}

-keep class androidtranscoder.**{*;}
-keep class XI.**{*;}

drawable-xxhdpi

該文件夾下的是應用的基礎圖片,其實還有各種分辨率的,但是沒有的話,安卓會使用當前存在的進行放大縮小,因為當時的目的僅僅是為了搭建一個本地環(huán)境,所以只設置了drawable-xxhdpi文件夾。

icon.png // 應用顯示在手機桌面上的圖標
push.png // 應用推送時的圖標
splash.9.png  // 應用剛剛打開時的圖片

apps

apps下是使用hbuilderx生成的文件夾

生成到前端項目dist->resources

假如生成的是__UNI__E34234,直接把__UNI__E34234文件夾放到apps下

dcloud_uniplugins.json

該文件夾是添加module的,目前文件內(nèi)不需要加內(nèi)容

data

dcloud_control.xml
dcloud_error.html
dcloud_properties.xml

以上三個直接從UniPlugin-Hello-AS\app\src\main\assets\data文件夾內(nèi)復制粘貼
其中dcloud_control.xml內(nèi)容(__UNI__E34234是隨便寫的,它應該跟你的uniapp應用標識一致)

<hbuilder>
<apps>
    <app appid="__UNI__E34234" appver=""/>
</apps>
</hbuilder>

進行完以上操作后,基本可以happy了
把手機連接電腦,調(diào)試模式,或者使用ad的AVD


運行

打包的話,點擊后,下一步,填入證書就ok啦~


打包

參考

因為之前百度找了好多,不知道借鑒了哪些文章,所以就不列出來了
over~

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容