日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

java编写自动化脚本生成apk_Unity3D研究院之Android全自动打包生成apk(六十九)

發布時間:2025/4/5 Android 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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(六十九)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。