uniapp本地打包官方文档,可以根据官方文档中的sdk文件夹UniPlugin-Hello-AS
为基础进行改造,刚开始摸索时,也是一点点看文档、看demo进行搭建的,毕竟一点安卓开发的基础也没有,又因为业务需求必须要开发一个推送功能module,所以就先把本地测试环境搭建好,方便开发module。
首先创建一个新的空项目(android studio默认已经安装好,以下称作“ad”),File=>New=>New Project=>Empty Activity
,
接下来进行一些项目最基础的配置
然后
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下所有文件夹
,新建了libs
与src
文件夹,
lib目录内容
其中libs
下是需要引入的依赖
以下为运行必备的依赖
[email protected]
lib.5plus.base-release.aar
oaid_sdk_1.0.25.aar
uniapp-v8-release.aar
其他的依赖可以按照自己的实际需要放入,具体的增加哪些可以根据下载的sdk文件夹Feature-Android.xls查看
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目录
目录截图,以下是其中各个文件内容,可以对照此图,查看各个文件的位置
AndroidManifest.xml
//这里我用了高德地图 所以需要加这个 不用可以不加,具体加哪些还是看上面提到的excel文件
// 离线打包的key, 没它可启动不了哦~
离线打包的key 从dcloud开发者中心获取
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生成的文件夹
假如生成的是
__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~