java编写自动化脚本生成apk_Unity3D研究院之Android全自动打包生成apk(六十九)
Unity自動打包Android其實要比IOS容易得多,因為Android不用先生成java工程,然后在構建.apk包,我先說說Android打包的步驟。
1.把sdk拷貝至Plugins/Android下。
如下圖所示,如果你做過Android源生開發,我相信下面的東西你不會陌生。可是如果你沒做過Android原生開發,我還是詳細說明以下。
AndroidManifest:這是Android程序必不可少的文件,這里記錄著應用程序的啟動Activity。Activity就是Android的一個界面,一般應用程序會有很多Acitivty,來回切換界面。但是游戲就不太一樣了,因為游戲只需要一個Activity 一個View就可以了。(扯遠了)
AndroidManifest:里面還記錄著應用程序的權限,Service啊什么的,,有興趣的同學可以谷歌搜一搜。
每次打包的時候Unity會用它默認的AndroidManifest,它默認的AndroidManifest在 unity.app/Contents/PlaybackEngines/AndroidPlayer下面。當你在進行打包apk的時候 unity會拷貝該路徑下的所有參數。
在ProjectSetting里面勾選一些權限的時候,Unity會自動幫你修改AndroidManifest里面的權限,但是如果某個權限不能在Unity工程里面修改,那么就需要自己手動替換。如下圖所示,我們把AndroidManifest放在Plugins/Android下面, 這樣Unity在進行打包的時候就不會用它默認的,而是用我自己新寫的打包。。這樣就方便靈活很多了。。
bin:下面就記錄著sdk用到的第三方jar
res:下面就是安卓的一些圖片,資源啊什么。
你可以隨便解開一個android的APK看看它的目錄結構就明白了。。
這樣在打包的時候unity就會自動把Plugins/Android下面的所有資源打包在你的APK里面了。但是如果你做渠道包的時候,每個包用的是不同的sdk,所以你需要在打包不同渠道的時候把相關的文件拷貝在Plugins/Android下面。
如下圖所示,我在根目錄下創建一個文件夾名子叫91,當我自動化打包的時候自動把91文件夾下面的資源先拷貝在Plugins/Android下面,然后在自動打包。。?打完包以后再把Plugins/Andoird文件夾清空即可。。
Ok上腳本。。代碼和上一篇文章的第一步差不多,我就不多余注釋,,執行下面shell腳本將自動打開unity,然后執行ProjectBuild.BuidForAndroid方法。。?project-$1 就是傳入的參數。。
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#!/bin/sh
#參數判斷
if[$# != 1 ];then
echo"需要一個參數。 參數是游戲包的名子"
exit
fi
#UNITY程序的路徑#
UNITY_PATH=/Applications/Unity/Unity.app/Contents/MacOS/Unity
#游戲程序路徑#
PROJECT_PATH=/Users/MOMO/commond
#在Unity中構建apk#
$UNITY_PATH-projectPath$PROJECT_PATH-executeMethodProjectBuild.BuildForAndroidproject-$1-quit
echo"Apk生成完畢"
在關閉unity的情況下運行。在命令行里面執行這一條腳本, 參數一個參數 91。
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
usingSystem.Collections;
usingSystem.IO;
usingUnityEditor;
usingUnityEngine;
usingSystem.Collections.Generic;
usingSystem;
classProjectBuild:Editor{
//在這里找出你當前工程所有的場景文件,假設你只想把部分的scene文件打包 那么這里可以寫你的條件判斷 總之返回一個字符串數組。
staticstring[]GetBuildScenes()
{
Listnames=newList();
foreach(EditorBuildSettingsSceneeinEditorBuildSettings.scenes)
{
if(e==null)
continue;
if(e.enabled)
names.Add(e.path);
}
returnnames.ToArray();
}
staticvoidBuildForAndroid()
{
Function.DeleteFolder(Application.dataPath+"/Plugins/Android");
if(Function.projectName=="91")
{
Function.CopyDirectory(Application.dataPath+"/91",Application.dataPath+"/Plugins/Android");
PlayerSettings.SetScriptingDefineSymbolsForGroup(BuildTargetGroup.Android,"USE_SHARE");
}
stringpath=Application.dataPath+"/"+Function.projectName+".apk";
BuildPipeline.BuildPlayer(GetBuildScenes(),path,BuildTarget.Android,BuildOptions.None);
}
}
程序會執行BuildForAndroid的方法,這里我把shell傳入的參數取出來。根據傳入的不同參數來初始化打包的一些設置。。
最終BuildPlayr就開始構建apk,第二個參數就是打包出apk保存的路徑。 在打包之前你可以處理一些 游戲包名, 游戲icon 等等一些平臺之間的特殊性 ,也可以設置一些 預定義標簽,。
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
usingUnityEngine;
#if UNITY_EDITOR
usingUnityEditor;
usingUnityEditor.Callbacks;
usingUnityEditor.XCodeEditor;
usingSystem.Xml;
#endif
usingSystem.IO;
publicstaticclassXCodePostProcess
{
#if UNITY_EDITOR
[PostProcessBuild(100)]
publicstaticvoidOnPostProcessBuild(BuildTargettarget,stringpathToBuiltProject)
{
if(target==BuildTarget.Android)
{
Function.DeleteFolder(Application.dataPath+"/Plugins/Android");
if(Function.projectName=="91")
{
//當我們在打91包的時候 這里面做一些 操作。
}
}
}
#endif
}
在回到XUPortr里面,當Android打包完畢后,這里我們清空Plugins/Android文件夾。?;蛘吣阋部梢宰鲆恍┎僮?。。
Function.cs 用到的一個工具類
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
usingUnityEngine;
usingSystem.Collections;
usingSystem.IO;
publicclassFunction{
//得到項目的名稱
publicstaticstringprojectName
{
get
{
//在這里分析shell傳入的參數, 還記得上面我們說的哪個 project-$1 這個參數嗎?
//這里遍歷所有參數,找到 project開頭的參數, 然后把-符號 后面的字符串返回,
//這個字符串就是 91 了。。
foreach(stringarginSystem.Environment.GetCommandLineArgs()){
if(arg.StartsWith("project"))
{
returnarg.Split("-"[0])[1];
}
}
return"test";
}
}
publicstaticvoidDeleteFolder(stringdir)
{
foreach(stringdinDirectory.GetFileSystemEntries(dir))
{
if(File.Exists(d))
{
FileInfofi=newFileInfo(d);
if(fi.Attributes.ToString().IndexOf("ReadOnly")!=-1)
fi.Attributes=FileAttributes.Normal;
File.Delete(d);
}
else
{
DirectoryInfod1=newDirectoryInfo(d);
if(d1.GetFiles().Length!=0)
{
DeleteFolder(d1.FullName);遞歸刪除子文件夾
}
Directory.Delete(d);
}
}
}
publicstaticvoidCopyDirectory(stringsourcePath,stringdestinationPath)
{
DirectoryInfoinfo=newDirectoryInfo(sourcePath);
Directory.CreateDirectory(destinationPath);
foreach(FileSystemInfofsiininfo.GetFileSystemInfos())
{
stringdestName=Path.Combine(destinationPath,fsi.Name);
if(fsiisSystem.IO.FileInfo)
File.Copy(fsi.FullName,destName);
else
{
Directory.CreateDirectory(destName);
CopyDirectory(fsi.FullName,destName);
}
}
}
}
如下圖所示,腳本運行完畢,你打包的APK就靜靜的放在了這里,怎么樣?簡單吧?嘿嘿。。
注意事項:
1、因為你的工程可能比較大,如果IOS和Android同時打包的話切個平臺都要半個多小時,我建議的svn在本地check out 兩個工程,一個切在ios 一個切在Android ?打包的時候分開打。
2.執行shell腳本的時候請關閉保存unity工程。
3.Android 因為不受證書的限制,我上傳的工程建議你下載下來看看,肯定可以直接打出來包。。
4.我建議打包的機器使用mac。 因為windows不能打包IOS 而MAC可以同時 打包 IOS 和 Android
最后雨松MOMO祝大家學習愉快,哇咔咔。
最后編輯:2014-06-12作者:雨松MOMO
專注移動互聯網,Unity3D游戲開發
捐 贈寫博客不易,如果您想請我喝一杯星巴克的話?就進來看吧!
總結
以上是生活随笔為你收集整理的java编写自动化脚本生成apk_Unity3D研究院之Android全自动打包生成apk(六十九)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数组反向遍历ios_iOS中数组遍历的方
- 下一篇: 里面使用轮播_小程序ColorUI框架初