[{"data":1,"prerenderedAt":1568},["ShallowReactive",2],{"\u002F2015-08-01-ue4-package-logs-android":3},{"id":4,"title":5,"body":6,"date":1545,"description":12,"extension":1546,"meta":1547,"navigation":119,"path":1561,"seo":1562,"stem":1563,"tags":1564,"__hash__":1567},"blogs\u002F_legacy\u002F2015\u002F2015-08-01-ue4-package-logs-android.md","UE4游戏Package记录（Android）",{"type":7,"value":8,"toc":1539},"minimark",[9,13,16,20,31,34,44,52,55,58,61,64,67,70,73,76,79,82,1450,1453,1459,1462,1465,1468,1476,1479,1485,1488,1491,1502,1505,1508,1511,1514,1522,1529,1532,1535],[10,11,12],"p",{},"Android的打包比Windows下要稍微麻烦一些，因为使用的编译器不同导致的问题也就多了起来。",[10,14,15],{},"当前使用的UE4版本为4.10.1。",[17,18,19],"h2",{"id":19},"基本步骤",[10,21,22,23,30],{},"UE4打包Android的教程官方是有提供的，可以看",[24,25,29],"a",{"href":26,"rel":27},"https:\u002F\u002Fdocs.unrealengine.com\u002Flatest\u002FINT\u002FPlatforms\u002FAndroid\u002FGettingStarted\u002F",[28],"nofollow","这里","。",[10,32,33],{},"下面只是简单的做一下总结的感觉，首先需要进行的是相关环境的安装。android sdk、ndk以及很多其他的东西，直接使用引擎自带的安装器就可以一次性搞定了。安装器在引擎如下的目录中可以找到",[35,36,37],"blockquote",{},[10,38,39,43],{},[40,41,42],"span",{},"ENGINE INSTALL LOCATION","\\Engine\\Extras\\Android\\CodeWorksforAndroid-1R6u1-windows.exe",[10,45,46,47,51],{},"开发必备环境的设定可以看[",[24,48,29],{"href":49,"rel":50},"https:\u002F\u002Fdocs.unrealengine.com\u002Fen-us\u002FPlatforms\u002FAndroid\u002FReference",[28],"]。",[10,53,54],{},"根据网络情况的不同，安装时间可能会比较长。",[10,56,57],{},"安装好之后其实就可以进行Android打包了，如果之前进行过Windows打包的话，基本不需要额外的设置。",[17,59,60],{"id":60},"插件问题",[10,62,63],{},"Android打包过程中很容易遇到的问题是插件上的，例如，如果在项目中有使用FMod的话，就需要进行一些额外的工作。",[10,65,66],{},"首先我们需要的是排查工具，在Android的SDK中有提供可以用于错误排查的工具。路径位于sdk的tools目录中，使用monitor.bat即可。",[10,68,69],{},"为了使用方便，在LogCat中添加新的过滤器就可以方便的对UE4的输出记录进行排查了。",[10,71,72],{},"如果在项目中有使用FMod的话，游戏在Android上是无法直接打开的，查看输出记录可以看到。",[10,74,75],{},"FMod的库文件没有被正确的找到，其实这是由于没有正确的按照FMod官方的配置说明进行配置导致的。在FMod的文档中其实是有说明的，不过没有到打包这一步的时候也并不需要进行配置。",[10,77,78],{},"当前FMod的Android打包需要对UE4的打包设置进行修改才行，首先，我们需要去GitHub上下载源码版的引擎。",[10,80,81],{},"并对UEDeployAndroid.cs进行修改，在CopyPluginLibs函数的末尾，添加如下的代码：",[83,84,89],"pre",{"className":85,"code":86,"language":87,"meta":88,"style":88},"language-java shiki shiki-themes github-light-high-contrast github-dark monokai","Console.WriteLine(\"Plugin Deployment\");\n\nList\u003Cstring> PluginLibraryReferences = new List\u003Cstring>();\n\nforeach (PluginInfo Plugin in Plugins.ReadAvailablePlugins(UnrealBuildTool.GetUProjectFile()))\n\n{\n\n    string AndroidDirectory = Path.Combine(Plugin.Directory, \"Binaries\u002FAndroid\");\n\n    string DeployFile = Path.Combine(AndroidDirectory, \"deploy.txt\");\n\n    if (File.Exists(DeployFile))\n\n    {\n\n        Console.WriteLine(\"Using Plugin Deployment file '{0}'\", DeployFile);\n\n        string DestLibraryDirectory = Path.Combine(UE4BuildPath, \"libs\u002Farmeabi-v7a\");\n\n        string DestJarDirectory = Path.Combine(UE4BuildPath, \"libs\");\n\n        foreach (string Name in File.ReadAllLines(DeployFile))\n\n        {\n\n            Console.WriteLine(\"Have file entry '{0}'\", Name);\n\n            string PluginFileExt = Path.GetExtension(Name);\n\n            if (PluginFileExt == \".so\")\n\n            {\n\n                string SourceFile = Path.Combine(AndroidDirectory, Name);\n\n                string DestFile = Path.Combine(DestLibraryDirectory, Name);\n\n                Console.WriteLine(\"Copying plugin .so file '{0}' to '{1}'\", SourceFile, DestFile);\n\n                if (File.Exists(DestFile))\n\n                {\n\n                    File.Delete(DestFile);\n\n                }\n\n                File.Copy(SourceFile, DestFile);\n\n                \u002F\u002F Also remember it for GameActivity\n\n                PluginLibraryReferences.Add(Name);\n\n            }\n\n            else if (PluginFileExt == \".jar\")\n\n            {\n\n                string SourceFile = Path.Combine(AndroidDirectory, Name);\n\n                string DestFile = Path.Combine(DestJarDirectory, Name);\n\n                Console.WriteLine(\"Copying plugin .jar file '{0}' to '{1}'\", SourceFile, DestFile);\n\n                if (File.Exists(DestFile))\n\n                {\n\n                    File.Delete(DestFile);\n\n                }\n\n                File.Copy(SourceFile, DestFile);\n\n            }\n\n        }\n\n    }\n\n}\n\n\u002F\u002F Enter all .so references into GameActivity java file\n\nif (PluginLibraryReferences.Count != 0)\n\n{\n\n    Console.WriteLine(\"Adding Plugin Deployment library references\");\n\n    String GameActivityFileName = Path.Combine(UE4BuildPath, \"src\u002Fcom\u002Fepicgames\u002Fue4\u002FGameActivity.java\");\n\n    List\u003Cstring> ActivityContents = new List\u003Cstring>(File.ReadAllLines(GameActivityFileName));\n\n    int LoadLibraryIndex = -1;\n\n    for (int i = 1; i \u003C ActivityContents.Count; ++i)\n\n    {\n\n        if (ActivityContents\u003Ci>.Contains(\"System.loadLibrary\"))\n\n        {\n\n            LoadLibraryIndex = i;\n\n            break;\n\n        }\n\n    }\n\n    if (LoadLibraryIndex != -1)\n\n    {\n\n        \u002F\u002F Insert in reverse order\n\n        PluginLibraryReferences.Reverse();\n\n        foreach (string Reference in PluginLibraryReferences)\n\n        {\n\n            Console.WriteLine(\"Adding library reference {0} at line {1}\", Reference, LoadLibraryIndex);\n\n            string ShortName = Path.GetFileNameWithoutExtension(Reference);\n\n            if (ShortName.StartsWith(\"lib\")) \u002F\u002F Without the lib prefix\n\n            {\n\n                ShortName = ShortName.Substring(3);\n\n            }\n\n            ActivityContents.Insert(LoadLibraryIndex, String.Format(\"\\t\\tSystem.loadLibrary(\\\"{0}\\\");\", ShortName));\n\n        }\n\n    }\n\n    File.WriteAllLines(GameActivityFileName, ActivityContents.ToArray());\n\n}\n\n\u002F\u002F PLUGIN DEPLOYMENT END\n","java","",[90,91,92,114,121,159,164,194,199,205,210,233,238,258,263,278,283,289,294,310,315,335,340,359,364,384,389,395,400,416,421,437,442,460,465,471,476,491,496,511,516,532,537,550,555,561,566,578,583,589,594,606,611,618,623,634,639,645,650,668,673,678,683,696,701,715,720,734,739,750,755,760,765,774,779,784,789,798,803,808,813,819,824,830,835,841,846,852,857,875,880,885,890,905,910,932,937,970,975,995,1000,1033,1038,1043,1048,1080,1085,1090,1095,1106,1111,1119,1124,1129,1134,1139,1144,1160,1165,1170,1175,1181,1186,1198,1203,1216,1221,1226,1231,1246,1251,1267,1272,1294,1299,1304,1309,1330,1335,1340,1345,1386,1391,1396,1401,1406,1411,1429,1434,1439,1444],"code",{"__ignoreMap":88},[40,93,96,100,104,107,111],{"class":94,"line":95},"line",1,[40,97,99],{"class":98},"s0idv","Console.",[40,101,103],{"class":102},"scAT4","WriteLine",[40,105,106],{"class":98},"(",[40,108,110],{"class":109},"sZnmU","\"Plugin Deployment\"",[40,112,113],{"class":98},");\n",[40,115,117],{"class":94,"line":116},2,[40,118,120],{"emptyLinePlaceholder":119},true,"\n",[40,122,124,128,132,136,139,142,146,149,152,154,156],{"class":94,"line":123},3,[40,125,127],{"class":126},"ss1GH","List",[40,129,131],{"class":130},"suI3T","\u003C",[40,133,135],{"class":134},"sGZGq","string",[40,137,138],{"class":130},"> ",[40,140,141],{"class":98},"PluginLibraryReferences",[40,143,145],{"class":144},"sLXdl"," =",[40,147,148],{"class":144}," new",[40,150,151],{"class":126}," List",[40,153,131],{"class":98},[40,155,135],{"class":134},[40,157,158],{"class":98},">();\n",[40,160,162],{"class":94,"line":161},4,[40,163,120],{"emptyLinePlaceholder":119},[40,165,167,170,173,176,179,182,185,188,191],{"class":94,"line":166},5,[40,168,169],{"class":102},"foreach",[40,171,172],{"class":98}," (",[40,174,175],{"class":126},"PluginInfo",[40,177,178],{"class":126}," Plugin",[40,180,181],{"class":98}," in Plugins.",[40,183,184],{"class":102},"ReadAvailablePlugins",[40,186,187],{"class":98},"(UnrealBuildTool.",[40,189,190],{"class":102},"GetUProjectFile",[40,192,193],{"class":98},"()))\n",[40,195,197],{"class":94,"line":196},6,[40,198,120],{"emptyLinePlaceholder":119},[40,200,202],{"class":94,"line":201},7,[40,203,204],{"class":98},"{\n",[40,206,208],{"class":94,"line":207},8,[40,209,120],{"emptyLinePlaceholder":119},[40,211,213,216,219,222,225,228,231],{"class":94,"line":212},9,[40,214,215],{"class":98},"    string AndroidDirectory ",[40,217,218],{"class":144},"=",[40,220,221],{"class":98}," Path.",[40,223,224],{"class":102},"Combine",[40,226,227],{"class":98},"(Plugin.Directory, ",[40,229,230],{"class":109},"\"Binaries\u002FAndroid\"",[40,232,113],{"class":98},[40,234,236],{"class":94,"line":235},10,[40,237,120],{"emptyLinePlaceholder":119},[40,239,241,244,246,248,250,253,256],{"class":94,"line":240},11,[40,242,243],{"class":98},"    string DeployFile ",[40,245,218],{"class":144},[40,247,221],{"class":98},[40,249,224],{"class":102},[40,251,252],{"class":98},"(AndroidDirectory, ",[40,254,255],{"class":109},"\"deploy.txt\"",[40,257,113],{"class":98},[40,259,261],{"class":94,"line":260},12,[40,262,120],{"emptyLinePlaceholder":119},[40,264,266,269,272,275],{"class":94,"line":265},13,[40,267,268],{"class":144},"    if",[40,270,271],{"class":98}," (File.",[40,273,274],{"class":102},"Exists",[40,276,277],{"class":98},"(DeployFile))\n",[40,279,281],{"class":94,"line":280},14,[40,282,120],{"emptyLinePlaceholder":119},[40,284,286],{"class":94,"line":285},15,[40,287,288],{"class":98},"    {\n",[40,290,292],{"class":94,"line":291},16,[40,293,120],{"emptyLinePlaceholder":119},[40,295,297,300,302,304,307],{"class":94,"line":296},17,[40,298,299],{"class":98},"        Console.",[40,301,103],{"class":102},[40,303,106],{"class":98},[40,305,306],{"class":109},"\"Using Plugin Deployment file '{0}'\"",[40,308,309],{"class":98},", DeployFile);\n",[40,311,313],{"class":94,"line":312},18,[40,314,120],{"emptyLinePlaceholder":119},[40,316,318,321,323,325,327,330,333],{"class":94,"line":317},19,[40,319,320],{"class":98},"        string DestLibraryDirectory ",[40,322,218],{"class":144},[40,324,221],{"class":98},[40,326,224],{"class":102},[40,328,329],{"class":98},"(UE4BuildPath, ",[40,331,332],{"class":109},"\"libs\u002Farmeabi-v7a\"",[40,334,113],{"class":98},[40,336,338],{"class":94,"line":337},20,[40,339,120],{"emptyLinePlaceholder":119},[40,341,343,346,348,350,352,354,357],{"class":94,"line":342},21,[40,344,345],{"class":98},"        string DestJarDirectory ",[40,347,218],{"class":144},[40,349,221],{"class":98},[40,351,224],{"class":102},[40,353,329],{"class":98},[40,355,356],{"class":109},"\"libs\"",[40,358,113],{"class":98},[40,360,362],{"class":94,"line":361},22,[40,363,120],{"emptyLinePlaceholder":119},[40,365,367,370,373,376,379,382],{"class":94,"line":366},23,[40,368,369],{"class":102},"        foreach",[40,371,372],{"class":98}," (string ",[40,374,375],{"class":126},"Name",[40,377,378],{"class":98}," in File.",[40,380,381],{"class":102},"ReadAllLines",[40,383,277],{"class":98},[40,385,387],{"class":94,"line":386},24,[40,388,120],{"emptyLinePlaceholder":119},[40,390,392],{"class":94,"line":391},25,[40,393,394],{"class":98},"        {\n",[40,396,398],{"class":94,"line":397},26,[40,399,120],{"emptyLinePlaceholder":119},[40,401,403,406,408,410,413],{"class":94,"line":402},27,[40,404,405],{"class":98},"            Console.",[40,407,103],{"class":102},[40,409,106],{"class":98},[40,411,412],{"class":109},"\"Have file entry '{0}'\"",[40,414,415],{"class":98},", Name);\n",[40,417,419],{"class":94,"line":418},28,[40,420,120],{"emptyLinePlaceholder":119},[40,422,424,427,429,431,434],{"class":94,"line":423},29,[40,425,426],{"class":98},"            string PluginFileExt ",[40,428,218],{"class":144},[40,430,221],{"class":98},[40,432,433],{"class":102},"GetExtension",[40,435,436],{"class":98},"(Name);\n",[40,438,440],{"class":94,"line":439},30,[40,441,120],{"emptyLinePlaceholder":119},[40,443,445,448,451,454,457],{"class":94,"line":444},31,[40,446,447],{"class":144},"            if",[40,449,450],{"class":98}," (PluginFileExt ",[40,452,453],{"class":144},"==",[40,455,456],{"class":109}," \".so\"",[40,458,459],{"class":98},")\n",[40,461,463],{"class":94,"line":462},32,[40,464,120],{"emptyLinePlaceholder":119},[40,466,468],{"class":94,"line":467},33,[40,469,470],{"class":98},"            {\n",[40,472,474],{"class":94,"line":473},34,[40,475,120],{"emptyLinePlaceholder":119},[40,477,479,482,484,486,488],{"class":94,"line":478},35,[40,480,481],{"class":98},"                string SourceFile ",[40,483,218],{"class":144},[40,485,221],{"class":98},[40,487,224],{"class":102},[40,489,490],{"class":98},"(AndroidDirectory, Name);\n",[40,492,494],{"class":94,"line":493},36,[40,495,120],{"emptyLinePlaceholder":119},[40,497,499,502,504,506,508],{"class":94,"line":498},37,[40,500,501],{"class":98},"                string DestFile ",[40,503,218],{"class":144},[40,505,221],{"class":98},[40,507,224],{"class":102},[40,509,510],{"class":98},"(DestLibraryDirectory, Name);\n",[40,512,514],{"class":94,"line":513},38,[40,515,120],{"emptyLinePlaceholder":119},[40,517,519,522,524,526,529],{"class":94,"line":518},39,[40,520,521],{"class":98},"                Console.",[40,523,103],{"class":102},[40,525,106],{"class":98},[40,527,528],{"class":109},"\"Copying plugin .so file '{0}' to '{1}'\"",[40,530,531],{"class":98},", SourceFile, DestFile);\n",[40,533,535],{"class":94,"line":534},40,[40,536,120],{"emptyLinePlaceholder":119},[40,538,540,543,545,547],{"class":94,"line":539},41,[40,541,542],{"class":144},"                if",[40,544,271],{"class":98},[40,546,274],{"class":102},[40,548,549],{"class":98},"(DestFile))\n",[40,551,553],{"class":94,"line":552},42,[40,554,120],{"emptyLinePlaceholder":119},[40,556,558],{"class":94,"line":557},43,[40,559,560],{"class":98},"                {\n",[40,562,564],{"class":94,"line":563},44,[40,565,120],{"emptyLinePlaceholder":119},[40,567,569,572,575],{"class":94,"line":568},45,[40,570,571],{"class":98},"                    File.",[40,573,574],{"class":102},"Delete",[40,576,577],{"class":98},"(DestFile);\n",[40,579,581],{"class":94,"line":580},46,[40,582,120],{"emptyLinePlaceholder":119},[40,584,586],{"class":94,"line":585},47,[40,587,588],{"class":98},"                }\n",[40,590,592],{"class":94,"line":591},48,[40,593,120],{"emptyLinePlaceholder":119},[40,595,597,600,603],{"class":94,"line":596},49,[40,598,599],{"class":98},"                File.",[40,601,602],{"class":102},"Copy",[40,604,605],{"class":98},"(SourceFile, DestFile);\n",[40,607,609],{"class":94,"line":608},50,[40,610,120],{"emptyLinePlaceholder":119},[40,612,614],{"class":94,"line":613},51,[40,615,617],{"class":616},"sZdD5","                \u002F\u002F Also remember it for GameActivity\n",[40,619,621],{"class":94,"line":620},52,[40,622,120],{"emptyLinePlaceholder":119},[40,624,626,629,632],{"class":94,"line":625},53,[40,627,628],{"class":98},"                PluginLibraryReferences.",[40,630,631],{"class":102},"Add",[40,633,436],{"class":98},[40,635,637],{"class":94,"line":636},54,[40,638,120],{"emptyLinePlaceholder":119},[40,640,642],{"class":94,"line":641},55,[40,643,644],{"class":98},"            }\n",[40,646,648],{"class":94,"line":647},56,[40,649,120],{"emptyLinePlaceholder":119},[40,651,653,656,659,661,663,666],{"class":94,"line":652},57,[40,654,655],{"class":144},"            else",[40,657,658],{"class":144}," if",[40,660,450],{"class":98},[40,662,453],{"class":144},[40,664,665],{"class":109}," \".jar\"",[40,667,459],{"class":98},[40,669,671],{"class":94,"line":670},58,[40,672,120],{"emptyLinePlaceholder":119},[40,674,676],{"class":94,"line":675},59,[40,677,470],{"class":98},[40,679,681],{"class":94,"line":680},60,[40,682,120],{"emptyLinePlaceholder":119},[40,684,686,688,690,692,694],{"class":94,"line":685},61,[40,687,481],{"class":98},[40,689,218],{"class":144},[40,691,221],{"class":98},[40,693,224],{"class":102},[40,695,490],{"class":98},[40,697,699],{"class":94,"line":698},62,[40,700,120],{"emptyLinePlaceholder":119},[40,702,704,706,708,710,712],{"class":94,"line":703},63,[40,705,501],{"class":98},[40,707,218],{"class":144},[40,709,221],{"class":98},[40,711,224],{"class":102},[40,713,714],{"class":98},"(DestJarDirectory, Name);\n",[40,716,718],{"class":94,"line":717},64,[40,719,120],{"emptyLinePlaceholder":119},[40,721,723,725,727,729,732],{"class":94,"line":722},65,[40,724,521],{"class":98},[40,726,103],{"class":102},[40,728,106],{"class":98},[40,730,731],{"class":109},"\"Copying plugin .jar file '{0}' to '{1}'\"",[40,733,531],{"class":98},[40,735,737],{"class":94,"line":736},66,[40,738,120],{"emptyLinePlaceholder":119},[40,740,742,744,746,748],{"class":94,"line":741},67,[40,743,542],{"class":144},[40,745,271],{"class":98},[40,747,274],{"class":102},[40,749,549],{"class":98},[40,751,753],{"class":94,"line":752},68,[40,754,120],{"emptyLinePlaceholder":119},[40,756,758],{"class":94,"line":757},69,[40,759,560],{"class":98},[40,761,763],{"class":94,"line":762},70,[40,764,120],{"emptyLinePlaceholder":119},[40,766,768,770,772],{"class":94,"line":767},71,[40,769,571],{"class":98},[40,771,574],{"class":102},[40,773,577],{"class":98},[40,775,777],{"class":94,"line":776},72,[40,778,120],{"emptyLinePlaceholder":119},[40,780,782],{"class":94,"line":781},73,[40,783,588],{"class":98},[40,785,787],{"class":94,"line":786},74,[40,788,120],{"emptyLinePlaceholder":119},[40,790,792,794,796],{"class":94,"line":791},75,[40,793,599],{"class":98},[40,795,602],{"class":102},[40,797,605],{"class":98},[40,799,801],{"class":94,"line":800},76,[40,802,120],{"emptyLinePlaceholder":119},[40,804,806],{"class":94,"line":805},77,[40,807,644],{"class":98},[40,809,811],{"class":94,"line":810},78,[40,812,120],{"emptyLinePlaceholder":119},[40,814,816],{"class":94,"line":815},79,[40,817,818],{"class":98},"        }\n",[40,820,822],{"class":94,"line":821},80,[40,823,120],{"emptyLinePlaceholder":119},[40,825,827],{"class":94,"line":826},81,[40,828,829],{"class":98},"    }\n",[40,831,833],{"class":94,"line":832},82,[40,834,120],{"emptyLinePlaceholder":119},[40,836,838],{"class":94,"line":837},83,[40,839,840],{"class":98},"}\n",[40,842,844],{"class":94,"line":843},84,[40,845,120],{"emptyLinePlaceholder":119},[40,847,849],{"class":94,"line":848},85,[40,850,851],{"class":616},"\u002F\u002F Enter all .so references into GameActivity java file\n",[40,853,855],{"class":94,"line":854},86,[40,856,120],{"emptyLinePlaceholder":119},[40,858,860,863,866,869,873],{"class":94,"line":859},87,[40,861,862],{"class":144},"if",[40,864,865],{"class":98}," (PluginLibraryReferences.Count ",[40,867,868],{"class":144},"!=",[40,870,872],{"class":871},"stP0Q"," 0",[40,874,459],{"class":98},[40,876,878],{"class":94,"line":877},88,[40,879,120],{"emptyLinePlaceholder":119},[40,881,883],{"class":94,"line":882},89,[40,884,204],{"class":98},[40,886,888],{"class":94,"line":887},90,[40,889,120],{"emptyLinePlaceholder":119},[40,891,893,896,898,900,903],{"class":94,"line":892},91,[40,894,895],{"class":98},"    Console.",[40,897,103],{"class":102},[40,899,106],{"class":98},[40,901,902],{"class":109},"\"Adding Plugin Deployment library references\"",[40,904,113],{"class":98},[40,906,908],{"class":94,"line":907},92,[40,909,120],{"emptyLinePlaceholder":119},[40,911,913,916,919,921,923,925,927,930],{"class":94,"line":912},93,[40,914,915],{"class":126},"    String",[40,917,918],{"class":98}," GameActivityFileName",[40,920,145],{"class":144},[40,922,221],{"class":98},[40,924,224],{"class":102},[40,926,329],{"class":98},[40,928,929],{"class":109},"\"src\u002Fcom\u002Fepicgames\u002Fue4\u002FGameActivity.java\"",[40,931,113],{"class":98},[40,933,935],{"class":94,"line":934},94,[40,936,120],{"emptyLinePlaceholder":119},[40,938,940,943,945,947,949,952,954,956,958,960,962,965,967],{"class":94,"line":939},95,[40,941,942],{"class":126},"    List",[40,944,131],{"class":130},[40,946,135],{"class":134},[40,948,138],{"class":130},[40,950,951],{"class":98},"ActivityContents",[40,953,145],{"class":144},[40,955,148],{"class":144},[40,957,151],{"class":126},[40,959,131],{"class":98},[40,961,135],{"class":134},[40,963,964],{"class":98},">(File.",[40,966,381],{"class":102},[40,968,969],{"class":98},"(GameActivityFileName));\n",[40,971,973],{"class":94,"line":972},96,[40,974,120],{"emptyLinePlaceholder":119},[40,976,978,981,984,986,989,992],{"class":94,"line":977},97,[40,979,980],{"class":134},"    int",[40,982,983],{"class":98}," LoadLibraryIndex",[40,985,145],{"class":144},[40,987,988],{"class":144}," -",[40,990,991],{"class":871},"1",[40,993,994],{"class":98},";\n",[40,996,998],{"class":94,"line":997},98,[40,999,120],{"emptyLinePlaceholder":119},[40,1001,1003,1006,1008,1011,1014,1016,1019,1022,1024,1027,1030],{"class":94,"line":1002},99,[40,1004,1005],{"class":144},"    for",[40,1007,172],{"class":98},[40,1009,1010],{"class":134},"int",[40,1012,1013],{"class":98}," i",[40,1015,145],{"class":144},[40,1017,1018],{"class":871}," 1",[40,1020,1021],{"class":98},"; i ",[40,1023,131],{"class":144},[40,1025,1026],{"class":98}," ActivityContents.Count; ",[40,1028,1029],{"class":144},"++",[40,1031,1032],{"class":98},"i)\n",[40,1034,1036],{"class":94,"line":1035},100,[40,1037,120],{"emptyLinePlaceholder":119},[40,1039,1041],{"class":94,"line":1040},101,[40,1042,288],{"class":98},[40,1044,1046],{"class":94,"line":1045},102,[40,1047,120],{"emptyLinePlaceholder":119},[40,1049,1051,1054,1056,1058,1060,1063,1066,1069,1072,1074,1077],{"class":94,"line":1050},103,[40,1052,1053],{"class":144},"        if",[40,1055,172],{"class":98},[40,1057,951],{"class":126},[40,1059,131],{"class":144},[40,1061,1062],{"class":98},"i",[40,1064,1065],{"class":144},">",[40,1067,1068],{"class":98},".",[40,1070,1071],{"class":102},"Contains",[40,1073,106],{"class":98},[40,1075,1076],{"class":109},"\"System.loadLibrary\"",[40,1078,1079],{"class":98},"))\n",[40,1081,1083],{"class":94,"line":1082},104,[40,1084,120],{"emptyLinePlaceholder":119},[40,1086,1088],{"class":94,"line":1087},105,[40,1089,394],{"class":98},[40,1091,1093],{"class":94,"line":1092},106,[40,1094,120],{"emptyLinePlaceholder":119},[40,1096,1098,1101,1103],{"class":94,"line":1097},107,[40,1099,1100],{"class":98},"            LoadLibraryIndex ",[40,1102,218],{"class":144},[40,1104,1105],{"class":98}," i;\n",[40,1107,1109],{"class":94,"line":1108},108,[40,1110,120],{"emptyLinePlaceholder":119},[40,1112,1114,1117],{"class":94,"line":1113},109,[40,1115,1116],{"class":144},"            break",[40,1118,994],{"class":98},[40,1120,1122],{"class":94,"line":1121},110,[40,1123,120],{"emptyLinePlaceholder":119},[40,1125,1127],{"class":94,"line":1126},111,[40,1128,818],{"class":98},[40,1130,1132],{"class":94,"line":1131},112,[40,1133,120],{"emptyLinePlaceholder":119},[40,1135,1137],{"class":94,"line":1136},113,[40,1138,829],{"class":98},[40,1140,1142],{"class":94,"line":1141},114,[40,1143,120],{"emptyLinePlaceholder":119},[40,1145,1147,1149,1152,1154,1156,1158],{"class":94,"line":1146},115,[40,1148,268],{"class":144},[40,1150,1151],{"class":98}," (LoadLibraryIndex ",[40,1153,868],{"class":144},[40,1155,988],{"class":144},[40,1157,991],{"class":871},[40,1159,459],{"class":98},[40,1161,1163],{"class":94,"line":1162},116,[40,1164,120],{"emptyLinePlaceholder":119},[40,1166,1168],{"class":94,"line":1167},117,[40,1169,288],{"class":98},[40,1171,1173],{"class":94,"line":1172},118,[40,1174,120],{"emptyLinePlaceholder":119},[40,1176,1178],{"class":94,"line":1177},119,[40,1179,1180],{"class":616},"        \u002F\u002F Insert in reverse order\n",[40,1182,1184],{"class":94,"line":1183},120,[40,1185,120],{"emptyLinePlaceholder":119},[40,1187,1189,1192,1195],{"class":94,"line":1188},121,[40,1190,1191],{"class":98},"        PluginLibraryReferences.",[40,1193,1194],{"class":102},"Reverse",[40,1196,1197],{"class":98},"();\n",[40,1199,1201],{"class":94,"line":1200},122,[40,1202,120],{"emptyLinePlaceholder":119},[40,1204,1206,1208,1210,1213],{"class":94,"line":1205},123,[40,1207,369],{"class":102},[40,1209,372],{"class":98},[40,1211,1212],{"class":126},"Reference",[40,1214,1215],{"class":98}," in PluginLibraryReferences)\n",[40,1217,1219],{"class":94,"line":1218},124,[40,1220,120],{"emptyLinePlaceholder":119},[40,1222,1224],{"class":94,"line":1223},125,[40,1225,394],{"class":98},[40,1227,1229],{"class":94,"line":1228},126,[40,1230,120],{"emptyLinePlaceholder":119},[40,1232,1234,1236,1238,1240,1243],{"class":94,"line":1233},127,[40,1235,405],{"class":98},[40,1237,103],{"class":102},[40,1239,106],{"class":98},[40,1241,1242],{"class":109},"\"Adding library reference {0} at line {1}\"",[40,1244,1245],{"class":98},", Reference, LoadLibraryIndex);\n",[40,1247,1249],{"class":94,"line":1248},128,[40,1250,120],{"emptyLinePlaceholder":119},[40,1252,1254,1257,1259,1261,1264],{"class":94,"line":1253},129,[40,1255,1256],{"class":98},"            string ShortName ",[40,1258,218],{"class":144},[40,1260,221],{"class":98},[40,1262,1263],{"class":102},"GetFileNameWithoutExtension",[40,1265,1266],{"class":98},"(Reference);\n",[40,1268,1270],{"class":94,"line":1269},130,[40,1271,120],{"emptyLinePlaceholder":119},[40,1273,1275,1277,1280,1283,1285,1288,1291],{"class":94,"line":1274},131,[40,1276,447],{"class":144},[40,1278,1279],{"class":98}," (ShortName.",[40,1281,1282],{"class":102},"StartsWith",[40,1284,106],{"class":98},[40,1286,1287],{"class":109},"\"lib\"",[40,1289,1290],{"class":98},")) ",[40,1292,1293],{"class":616},"\u002F\u002F Without the lib prefix\n",[40,1295,1297],{"class":94,"line":1296},132,[40,1298,120],{"emptyLinePlaceholder":119},[40,1300,1302],{"class":94,"line":1301},133,[40,1303,470],{"class":98},[40,1305,1307],{"class":94,"line":1306},134,[40,1308,120],{"emptyLinePlaceholder":119},[40,1310,1312,1315,1317,1320,1323,1325,1328],{"class":94,"line":1311},135,[40,1313,1314],{"class":98},"                ShortName ",[40,1316,218],{"class":144},[40,1318,1319],{"class":98}," ShortName.",[40,1321,1322],{"class":102},"Substring",[40,1324,106],{"class":98},[40,1326,1327],{"class":871},"3",[40,1329,113],{"class":98},[40,1331,1333],{"class":94,"line":1332},136,[40,1334,120],{"emptyLinePlaceholder":119},[40,1336,1338],{"class":94,"line":1337},137,[40,1339,644],{"class":98},[40,1341,1343],{"class":94,"line":1342},138,[40,1344,120],{"emptyLinePlaceholder":119},[40,1346,1348,1351,1354,1357,1360,1362,1365,1369,1372,1375,1378,1380,1383],{"class":94,"line":1347},139,[40,1349,1350],{"class":98},"            ActivityContents.",[40,1352,1353],{"class":102},"Insert",[40,1355,1356],{"class":98},"(LoadLibraryIndex, String.",[40,1358,1359],{"class":102},"Format",[40,1361,106],{"class":98},[40,1363,1364],{"class":109},"\"",[40,1366,1368],{"class":1367},"sAO_F","\\t\\t",[40,1370,1371],{"class":109},"System.loadLibrary(",[40,1373,1374],{"class":1367},"\\\"",[40,1376,1377],{"class":109},"{0}",[40,1379,1374],{"class":1367},[40,1381,1382],{"class":109},");\"",[40,1384,1385],{"class":98},", ShortName));\n",[40,1387,1389],{"class":94,"line":1388},140,[40,1390,120],{"emptyLinePlaceholder":119},[40,1392,1394],{"class":94,"line":1393},141,[40,1395,818],{"class":98},[40,1397,1399],{"class":94,"line":1398},142,[40,1400,120],{"emptyLinePlaceholder":119},[40,1402,1404],{"class":94,"line":1403},143,[40,1405,829],{"class":98},[40,1407,1409],{"class":94,"line":1408},144,[40,1410,120],{"emptyLinePlaceholder":119},[40,1412,1414,1417,1420,1423,1426],{"class":94,"line":1413},145,[40,1415,1416],{"class":98},"    File.",[40,1418,1419],{"class":102},"WriteAllLines",[40,1421,1422],{"class":98},"(GameActivityFileName, ActivityContents.",[40,1424,1425],{"class":102},"ToArray",[40,1427,1428],{"class":98},"());\n",[40,1430,1432],{"class":94,"line":1431},146,[40,1433,120],{"emptyLinePlaceholder":119},[40,1435,1437],{"class":94,"line":1436},147,[40,1438,840],{"class":98},[40,1440,1442],{"class":94,"line":1441},148,[40,1443,120],{"emptyLinePlaceholder":119},[40,1445,1447],{"class":94,"line":1446},149,[40,1448,1449],{"class":616},"\u002F\u002F PLUGIN DEPLOYMENT END\n",[10,1451,1452],{},"这样一来就可以正常的进行运行工作了，不过由于使用了源码版，有时候编译时间就会比较长了。所以建议在项目打包的时候再进行设置。",[10,1454,1455,1456,30],{},"FMod还有一些其他需要注意的打包事项，例如Bank文件目录等的设定，由于没有使用到那些功能所以没有进行尝试，详情可参照",[40,1457,1458],{},"FMod官方文档",[17,1460,1461],{"id":1461},"目录访问",[10,1463,1464],{},"当前UE4在Android下默认是没有提供访问整个设备的文件的接口的，但是如果是音乐游戏之类的游戏的话，就会需要用到这样的功能。",[10,1466,1467],{},"在AndroidFile.cpp中，我们可以看到，所有的函数都有提供AllowLocal的参数，但是FAndroidPlatformFile在进行IPhysicalPlatformFile的接口实现时使用的却全部是默认的False。AllowLocal参数最终是传递给PathToAndroidPaths这个函数的，因此，直接在该函数中添加",[83,1469,1474],{"className":1470,"code":1472,"language":1473},[1471],"language-text","AllowLocal = true;\n","text",[90,1475,1472],{"__ignoreMap":88},[10,1477,1478],{},"强制打开本地路径访问即可。同时，这个文件中有开放两个在调试文件访问时比较实用的宏，有需要的时候可以打开",[83,1480,1483],{"className":1481,"code":1482,"language":1473},[1471],"#define LOG_ANDROID_FILE 1\n#define LOG_ANDROID_FILE_MANIFEST 1\n",[90,1484,1482],{"__ignoreMap":88},[10,1486,1487],{},"另外需要注意的是，FPaths提供的一些函数在Android下并不能很好的运行，经常返回不符合预期的结果。",[10,1489,1490],{},"目前观测到的有",[35,1492,1493,1496,1499],{},[10,1494,1495],{},"FPaths::ConvertRelativePathToFull需要使用IAndroidPlatformFile::GetPlatformPhysical().FileRootPath进行代替",[10,1497,1498],{},"FPaths::GetPath会对根目录返回空字符串",[10,1500,1501],{},"FPaths::IsDrive会对所有的一级目录返回True",[10,1503,1504],{},"使用的时候需要千万注意。",[17,1506,1507],{"id":1507},"功能限制",[10,1509,1510],{},"UE4在移动模式下是有很多功能限制的，如果游戏是面向移动平台的话，最好在添加新功能的时候使用移动平台模拟进行测试，否则到最后就可能真的积重难返了。",[10,1512,1513],{},"目前遇到的限制有：",[35,1515,1516,1519],{},[10,1517,1518],{},"APEX的破碎物体无法作用",[10,1520,1521],{},"部分粒子特效无法显示",[10,1523,1524,1525,30],{},"UE4对移动设备的兼容性也是需要在事先进行调查的，官方的说明在",[24,1526,29],{"href":1527,"rel":1528},"https:\u002F\u002Fdocs.unrealengine.com\u002Flatest\u002FINT\u002FPlatforms\u002FAndroid\u002FDeviceCompatibility\u002Findex.html",[28],[10,1530,1531],{},"引擎自带的示例项目在没有安装第三方插件的情况下，是可以直接通过的，用来测试环境的配置是否正确非常方便。",[10,1533,1534],{},"总体而言UE4的移动端表现还是非常不错的。",[1536,1537,1538],"style",{},"html pre.shiki code .s0idv, html code.shiki .s0idv{--shiki-default:#0E1116;--shiki-dark:#E1E4E8;--shiki-sepia:#F8F8F2}html pre.shiki code .scAT4, html code.shiki .scAT4{--shiki-default:#622CBC;--shiki-dark:#B392F0;--shiki-sepia:#A6E22E}html pre.shiki code .sZnmU, html code.shiki .sZnmU{--shiki-default:#032563;--shiki-dark:#9ECBFF;--shiki-sepia:#E6DB74}html pre.shiki code .ss1GH, html code.shiki .ss1GH{--shiki-default:#0E1116;--shiki-default-font-style:inherit;--shiki-dark:#E1E4E8;--shiki-dark-font-style:inherit;--shiki-sepia:#66D9EF;--shiki-sepia-font-style:italic}html pre.shiki code .suI3T, html code.shiki .suI3T{--shiki-default:#702C00;--shiki-dark:#E1E4E8;--shiki-sepia:#F8F8F2}html pre.shiki code .sGZGq, html code.shiki .sGZGq{--shiki-default:#A0111F;--shiki-default-font-style:inherit;--shiki-dark:#F97583;--shiki-dark-font-style:inherit;--shiki-sepia:#66D9EF;--shiki-sepia-font-style:italic}html pre.shiki code .sLXdl, html code.shiki .sLXdl{--shiki-default:#A0111F;--shiki-dark:#F97583;--shiki-sepia:#F92672}html pre.shiki code .sZdD5, html code.shiki .sZdD5{--shiki-default:#66707B;--shiki-dark:#6A737D;--shiki-sepia:#88846F}html pre.shiki code .stP0Q, html code.shiki .stP0Q{--shiki-default:#023B95;--shiki-dark:#79B8FF;--shiki-sepia:#AE81FF}html pre.shiki code .sAO_F, html code.shiki .sAO_F{--shiki-default:#A0111F;--shiki-dark:#79B8FF;--shiki-sepia:#AE81FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}html.sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}",{"title":88,"searchDepth":116,"depth":123,"links":1540},[1541,1542,1543,1544],{"id":19,"depth":116,"text":19},{"id":60,"depth":116,"text":60},{"id":1461,"depth":116,"text":1461},{"id":1507,"depth":116,"text":1507},"2015-08-01","md",{"layout":1548,"status":1549,"published":119,"author":1550,"author_login":1551,"author_email":1552,"author_url":1553,"wordpress_id":1554,"wordpress_url":1555,"date_gmt":1556,"excerpt":1557},"post","publish",{"display_name":1551,"login":1551,"email":1552,"url":1553},"chaoshikari","chaoshikari@gmail.com","\u002F",1463,"\u002F\u002F?p=1463","2015-08-01 11:27:14 +0000",{"type":7,"value":1558},[1559],[10,1560,12],{},"\u002F2015-08-01-ue4-package-logs-android",{"title":5,"description":12},"_legacy\u002F2015\u002F2015-08-01-ue4-package-logs-android",[1565,1566],"UE4","Package","LA841B_nk48EEoA1Vn8rmA1yi-rgmXfVCpbsWXUiUis",1788763180299]