AndroidStudio使用命令行出包(可封装成C#版打包工具)

AndroidStudio使用命令行出包

---------从这里到正文区之间的内容,都是正文写完之后,增加的升级补丁,若没有升级过Unity版本则跳过-------------

---------本文内容的复杂程度较高,正常观看需要有一定的水平和耐心------------------------------------

 

-----更新于2022.11.30------增加注解更新------------------

注释:gradle和gradlew命令,这俩命令有一个字母的区别,但它们是一样的意思,其实就是对一个命令做了封装。如果有一个不能用,则应该是Android_Home或者Gralde_Home没有配置好,而我们早期的项目,一般只需要JAVA_HOME就行了。

-----更新于2022.11.30-------增加Il2cpp任务分离的说明-----------------

更新内容:将IL2CPP.so生成的任务从AndroidStudio的打包工程里分离。

使用此文的打包方式之后,在unityLibrary的build.gradle会有一个android任务,如下图:

 

 我们将圈出来的4行代码给注释掉。

然后我们打开此安卓工程所在的目录,与unityLibrary文件夹同级的那个目录,打开后在里面新建bat脚本buildil2cpp.bat,里面的内容为

@echo off
gradlew :unityLibrary:BuildIl2CppTask

或者

@echo off
gradle :unityLibrary:BuildIl2CppTask

然后运行bat,则会执行这个task,生成il2cpp.so的文件到我们任务中指定的目录。

或者用cmd去执行这个gradlew命令。

上面图中的任务注释掉后,安卓打包就不会将il2cpp的任务进行执行,也不会额外的再去生成il2cpp.so。

这样就真正做到了安卓工程和Unity内容分离。

在现阶段软著和版号都无法申请的情况下,可以快速的交叉包名,交叉游戏内容,增加产品内容的竞争力。

 

-----更新于2022.09.20------------------------

如果使用代码进行包名替换后,此时打包指令出包是不会成功的,可以刷新一下工程,

在工程主目录下,也就是与launcher和unityLibrary同级的目录,把cmd.exe放到此处,或者打开cmd指向这个目录。

执行命令:gradlew build --refresh-dependencies

即可完成,成功完成后窗口给出的显示也是BUILD SUCCESSFUL in。

所以代码怎么写,自己需要注意一下。

注意这里的命令和出包命令不一样,出包命令是gradle assembleRelease

第一个单词不一样,刷新工程命令的单词多一个w。

-----更新于2022.09.07------------------------

升级2022.1.115版本后要注意的:

1、需要升级NDK最低版本为21.3,下载好之后记得手动选择21.3并且apply。

com.android.tools.build:gradle:4.0.1 

 这个版本是支持ndk21.3的,如果更换到了21.3,还是报19的错,则重启androidstudio或者清缓存。

    全局搜一下原来的版本号,全局搜索快捷键:ctrl+shift+F。

    这个地方就得提一下,任何地方,你明明改了,还显示的不对,那只有两种情况,情况1是改的地方不对,情况2是缓存没有清除。

2、添加到build.gradle里的BuildIL2Cpp生成.so库的任务需要修改路径,因为deploy下面的.netcoreapp3.1文件夹没了

 

commandLine(workingDir + "/src/main/Il2CppOutputProject/IL2CPP/build/deploy/il2cpp.exe",

 

3、注释掉下面这句,因为没了这个文件。

 

"--map-file-parser=" + workingDir + "/src/main/Il2CppOutputProject/IL2CPP/MapFileParser/MapFileParser.exe",

 

4、buidle.gradle里找到android{}

checkReleaseBuilds false --增加这一行
abortOnError false --这一行本来就有。

----------------------------------------------------------------

----------更新于2022.09.02-----

09.02更新的内容加在了文章最末尾。

----------------以下是文章正文,上面的都是后续更新的补丁-------------

本文讲述了使用的android新的出gradle命令出包,不使用以前的老的命令模式,并且不使用jinkens。

整个过程分为:命令出包(完整讲述)---->CMD出包(简述过程)----->.net core api网站在线出包(简述思路)

以上过程,均已在我本地实现,整个过程,需要有耐心。。

刚方案的提出到实现,一共花了3天,前1.5天实现了全部功能,后1.5天卡在了IIS调起cmd却不会执行的问题。

IIS调起cmd成功运行,但输入指令不执行的问题,虽然还是没有解决,但使用了一个新的方式绕过了该问题,文章的结尾会说。

另外要注意的是命令符,并不是只有一个cmd,一共分为三种,cmd、PowerShell、Terminal。

而我们此文是使用Terminal命令,在win10里,cmd.exe出来的就是Terminal,而谷歌新的命令出包方式,也是基于Terminal的。

使用命令行出包的两种方式:

方案1、Apache ant命令行出包(弃用)。

方案2、Android Gradle命令行出包(Terminal,你也可以把这个Terminal叫做cmd)。

先说方案1,此方案为古老传说流传下来的出包方式,而google在几年前就已经弃用了此方式,并且停止了支持。

所以我们也直接弃用方案1,同时也无须再使用jinkens了。

再说方案2,的确比较简单,方案2也是google要使用的方式,一个长期被支持的方案。

如果需要在线出包,还可以用C#写一个api,与网站对接,网站点个按钮,在线出包。

方案2出包配置(Windows环境):

配置说明:尽量的使用高版本工具、尽量使用Android Studio捆绑工具。

使用命令行出包,需要注意的几点需要配置。

Gradle配置、JDK配置、SDK配置、NDK配置、签名配置、il2cpp的so库编译配置(此项仅为unity2020以上版本il2cpp模式使用)。

如果是unity2020以上的版本,若要打ip2cpp包,则需要il2cpp的so库编译配置。

参考链接:关于Unity2020版本打包安卓工程IL2CPP没有SO的解决方案 - 威少小二orz - 博客园 (cnblogs.com)

以我这边安卓工程和Unity的配置来举例。

我这边Unity工程为2020.3.32f1c1。

Android工程为Unity打出来的Android工程。

本文的结尾会整理出可能出现的异常情况。

1、Gradle下载。

(必须)

https://gradle.org/releases/#close-notification

https://services.gradle.org/distributions/

下载binary-only,我使用的是6.83

 

2、配置Gradle环境。

(必须)

在系统变量里配置GRADLE_HOME,变量值为gradle的目录,这个目录为gradle中bin的上一层。

 

 

 在系统变量的pah里增加一个路径:

E:\Download\Gradle\gradle-6.8.3-all\gradle-6.8.3\bin

 

 

 

 3、配置ANDROID_HOME环境。

(不确定是必须还是可选,但配了肯定没问题)

 

 

 路径为你AndroidStudio中sdk的目录。

 

 

 

4、adb配置。

(不需要,写在这里是为了让你知道不需要adb配置。)

 

5、测试。

在AndroidStudio里的Terminal里输入Gradle -v

 

 

 如图上所示,则是安装成功。

清除上面的历史信息指令是cls。

如果不知道Terminal从哪里打开,那就把项目切换到Project模式,如下图。

 

 

 

6、项目配置。

使用代码配置jdk:使用AndroidStudio捆绑的jdk配置。

找到捆绑版本的jdk路径,如下图。

 

 

 AndroidStudio里不需要将它选中,只是在这里找到它的路径。

然后将其配置到gradle.properties文件里。

 

 

 

 

 

 路径就是写死的,不用怀疑。

使用代码配置gradle:

在gradle-wrapper.properties文件中添加

distributionUrl=https\://services.gradle.org/distributions/gradle-6.8.3-bin.zip

 

 

 

 

 

 使用代码配置sdk:

 

 

 

 此处SDK.dir,尽量与android Studio里的sdk目录一致。

 

 使用代码配置ndk:

与sdk在同一个配置文件,如上图,是上图,不是下图。

7、签名配置。

在launcher里的build.gradle加入keystore配置。

unity2019之后打出来的android工程,都是包含launcher和unityLibrary两个工程的,launcher为主工程,unityLibrary为子工程。

 

 

 

8、配置完成,然后初始化gradle。

指令为Gradle init.

 

 

 如上图所示即为成功。

 

9、使用指令出包。

使用指令gradle assembleRelease即可出release的包,出包路径为工程目录下的launcher\build\outputs\apk\release。

 

 

 

10、如果不想打开AndroidStudio出包,则打开cmd,

然后cd到源码的目录下,下图的路径就是源码的根文件夹。

 

 

 然后使用出包指令:

gradle assembleRelease

 

 

 

 虽然成功了,但是上面有个警告,意思说是我不应该在xml中声明sdk的版本,可以将其移至build.gradle的配置文件中去。

因为是警告,所以直接忽略,之所以忽略,是因为我在build.gradle已经声明过sdk版本了,而xml中的声明的优先级不高,所以忽略。

忽略警告,即为成功。

如下图sdk声明的配置:

 

 

 

以上过程完成,则打包成功。

 

可能存在的异常情况:

1、Error:FAILURE: Build failed with an exception. * What went wrong: Task '' not found in root projec

2、 AAPT: error: unexpect ed element <queries> found in <manifest>.

12无效解:网上传言要直接在项目的目录下修改与项目名称同名的.iml文件,删除<component name="FacetManager"> ... </component>

12正解:彻底关闭AndroidStudio,重启,重新Clear Project,重新Reload,再将Build.gradle里的classpath升级到4.0以上版本。

classpath 'com.android.tools.build:gradle:4.0.1'
如下图:

 

3、Deprecated Gradle features were used in this build, making it incompatible with Gradle 7.0.

 无效解:Gradle版本不对。

正解:jdk的兼容问题,将配置文件里配置的jdk设置为AndroidStudio捆绑的jdk版本,参考本文中的jdk配置。

4、> Configure project :launcher

WARNING: DSL element 'useProguard' is obsolete.
It will be removed in version 5.0 of the Android Gradle plugin.
Use 'android.enableR8' in gradle.properties to switch between R8 and Proguard.
WARNING: DSL element 'useProguard' is obsolete.
It will be removed in version 5.0 of the Android Gradle plugin.
Use 'android.enableR8' in gradle.properties to switch between R8 and Proguard

 

无效解:将build.gradle中的useProguard=false属性移至gradle.properties,并将此属性的名称更改为新版本的android.enableR8=false。

正解:不必须选项,忽略警告即可。

-----------------------------------------------------

以上为Gradle命令出包的全部内容。

----------------------------------------------------

如果你想把出包服务放在IIS上,那么,我碰到的问题是iis调起cmd后,你可以输入出包指令,但它不会执行,按网上说的方法,都不管用。

说到这有一个你要注意的点,我这win10的系统,在IIS里开启的cmd,是6.2版本,而不在IIS里打开的cmd,是10.0版本,同时10.0版本的另一个名字叫做:Terminal。

但是,你可以不挂在IIS上,直接开启一个服务,比如一个windows服务,或者用.net core api开启一个server。

我使用的方法就是开启一个.net core api的server。

如果你会用.net core api,那么在你的工程的appsettings.json的配置文件里加入下图中的Urls,

马赛克处为局域网内的IP。

 

 

 然后编译.net core api,找到编绎后的server.exe,直接打开,你的网页就开始运行了。

需要出包,直接调用网页的api即可,具体做法就不讲了,能看到这偏文章的,相信只需要说个思路,就都会了。

 ----------------------------2022.09.02更新-------------------------

1、build.gradle里库的引用。

命令打包不能使用如下方式,但是使用AndroidStudio打包是可以用以下方式的。

另外,命令打包,只能有一个存放库的目录,不能放在子目录。

implementation fileTree(dir: 'libs', include: ['*.aar'])

implementation fileTree(dir: 'libs/adn', include: ['*.aar'])

2、打包时间。

首次打包会较慢,如果是il2cpp,则会跑ndk的服务编出il2cpp的so库,对应的进程是clang.exe,所以在打包期间若要编il2cpp就会出现大量的clang.exe进程,别慌,

打包的时候,出现占CPU的进程以openjdk platform binary为主。

首次出包大约2分钟。

之后出包,从更改配置到打包完成,i7的话大约15秒左右,我这个E3的CPU在30多秒。

 

 

-----------------如果您有需要,或者不太明白,欢迎加QQ120638094一起探讨-----------------

posted @ 2022-08-30 14:32  威少小二orz  阅读(2054)  评论(1编辑  收藏  举报