uniapp离线打包指南

uniapp本地打包官方文档,可以根据官方文档中的sdk文件夹UniPlugin-Hello-AS为基础进行改造,刚开始摸索时,也是一点点看文档、看demo进行搭建的,毕竟一点安卓开发的基础也没有,又因为业务需求必须要开发一个推送功能module,所以就先把本地测试环境搭建好,方便开发module。
首先创建一个新的空项目(android studio默认已经安装好,以下称作“ad”),File=>New=>New Project=>Empty Activity

Empty_Activity.png

接下来进行一些项目最基础的配置
image.png

然后Finish,ad会自动下载配置依赖,慢慢等待......
文件目录如下,各个文件的具体功能,可以自行百度(主要是不专业,怕说错喽) ↓↓↓↓

│  .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有什么用,所以根据uniapp给的demo,把这个删除了,只留下了:

rootProject.name = "MyTest"
include ':app'  // 用于增加子模块,如果这个时候想加一个新的module  可以再加一个 include ":"

gradle.properties文件是配置gradle的,uniapp 本地开发需要这三个配置

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

build.gradle文件

build.gradle文件是配置gradle依赖下载源,gradle构建工具的版本,我这里改成了阿里的源

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文件夹内

删除掉了src下所有文件夹,新建了libssrc文件夹,

lib目录内容

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

以下为运行必备的依赖
[email protected]
lib.5plus.base-release.aar
oaid_sdk_1.0.25.aar
uniapp-v8-release.aar

其他的依赖可以按照自己的实际需要放入,具体的增加哪些可以根据下载的sdk文件夹Feature-Android.xls查看
Feature-Android文件位置
这些是我用到的

build.gradle内的内容

// 声明是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" // 构建的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:*~"
    }
    /*代码结束*/
    /**
     * 编译配置
     */
    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所需库-----------------------结束*/

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


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

src目录

src目录

目录截图,以下是其中各个文件内容,可以对照此图,查看各个文件的位置

AndroidManifest.xml



    

    
    

    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    

    
        
            
                
                
            
        
        
            
                
                

                
                
            
        
        
        
            
        
        //这里我用了高德地图 所以需要加这个 不用可以不加,具体加哪些还是看上面提到的excel文件

        
        
        
        

        // 离线打包的key, 没它可启动不了哦~
        
    


离线打包的key 从dcloud开发者中心获取


离线打包key

string.xml


    你的应用名称

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 {
    ;
}

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

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




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

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

-keepclasseswithmembers class io.dcloud.EntryProxy {
    ;
}

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

-keepclasseswithmembers class *{
  public static java.lang.String getJsContent();
}
-keepclasseswithmembers class io.dcloud.appstream.StreamAppScriptEntry {
    ;
}
-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 (android.content.Context, android.util.AttributeSet);
}

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

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

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

-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

该文件夹下的是应用的基础图片,其实还有各种分辨率的,但是没有的话,安卓会使用当前存在的进行放大缩小,因为当时的目的仅仅是为了搭建一个本地环境,所以只设置了drawable-xxhdpi文件夹。

icon.png // 应用显示在手机桌面上的图标
push.png // 应用推送时的图标
splash.9.png  // 应用刚刚打开时的图片

apps

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

生成到前端项目dist->resources

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

dcloud_uniplugins.json

该文件夹是添加module的,目前文件内不需要加内容

data

dcloud_control.xml
dcloud_error.html
dcloud_properties.xml

以上三个直接从UniPlugin-Hello-AS\app\src\main\assets\data文件夹内复制粘贴
其中dcloud_control.xml内容(__UNI__E34234是随便写的,它应该跟你的uniapp应用标识一致)



    



进行完以上操作后,基本可以happy了
把手机连接电脑,调试模式,或者使用ad的AVD


运行

打包的话,点击后,下一步,填入证书就ok啦~


打包

参考

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

你可能感兴趣的:(uniapp离线打包指南)