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一起探讨-----------------