黄视频网站在线免费观看-黄视频网站在线看-黄视频网站在线观看-黄视频网站免费看-黄视频网站免费观看-黄视频网站免费

千鋒教育-做有情懷、有良心、有品質的職業教育機構

手機站
千鋒教育

千鋒學習站 | 隨時隨地免費學

千鋒教育

掃一掃進入千鋒手機站

領取全套視頻
千鋒教育

關注千鋒學習站小程序
隨時隨地免費學習課程

當前位置:首頁  >  技術干貨  > Unity使用Obb擴展包的正確姿勢

Unity使用Obb擴展包的正確姿勢

來源:千鋒教育
發布人:qyf
時間: 2022-08-18 17:35:00 1660815300

未命名圖片 (3)

  由于Google Play上不能上傳大于100M的包,所以需要將應用進行Obb分包,資源文件打包到Obb中,在Apk啟動的時候再從Obb擴展文件中加載資源。

  如何生成Obb擴展資源文件

  Unity可以自動為你進行分包操作,只需要你在發布安卓版本的時候進行簡單的設置,當然也可以自己根據需求通過以下命令進行分包。

  // jobb 命令在sdk\tools目錄下jobb -pn-pv-d \資源 -o G:\輸出包名(如main.1.com.google.obb)

  obb擴展文件的命名規則為:

  main文件:main...obb

  patch文件:patch...obb

  按照Unity分包的規則,主APK文件主要包括Java、Native代碼、游戲腳本、插件以及第一個場景包含的所有資源。Obb包主要是資源文件,在Unity打包Apk過程中,會把所有的資源文件(包括 streaming Assets)打包到Assets目錄下,而Obb分包后會將第一個場景以外的資源都打包到Obb目錄中,在Apk啟動后,會根據相應命名規則從Obb中加載資源文件。而在Unity里面為了安全性還封裝了一些校驗規則,下面會提取出相關的校驗規則供我們下載校驗(這只針對通過Unity直接打包會生成相關的校驗規則,如果你是導出工程然后再進行分包、打包那么Unity這套規則并不直接適用于你,為了安全性你可以自己實現一套類似的規則)。

  如何使用Obb擴展資源文件

  大多數情況下,當用戶從Google Play上下載應用時,Google Play會自動將APK文件和擴展文件同時下載下來,至于具體是哪些cases下Google Play無法下載擴展文件并沒有說明,此外即使Google Play正確的下載了擴展文件,但是由于擴展文件存放的目錄是可以被用戶和其他應用訪問的。但是Google Play并不總是保證一定會下載擴展文件,一般情況下我們需要將生成的apk以及obb下載下來的擴展文件有可能會被用戶或其他應用刪除。

  其次,我們的安裝包除了在Google Play平臺,也會在其他渠道上架,所以為了保證用戶下載簡潔可靠,我們需要在應用中自行實現擴展文件完整性檢查和下載的機制。

  如何手動下載Obb資源擴展文件

  1.如果你的Obb擴展文件上傳到Google平臺,那么你可以使用Android中提供的APK擴展文件下載庫Downloader Library來簡化擴展文件檢查和下載的邏輯,具體可以參考以及Google Play APK擴展文件機制及開發流程詳解,然而這種方式限制多多,需要支持google框架,不能應用于其他渠道等等...

  2.將擴展文件上傳到自己的服務器,原理上就可以適用于所有的渠道,需要的就是實現一個網絡下載器。

  手動校驗Obb是否已經下載完成

  UnityPlayer是一個UI場景類,在UnityPlayerActivity會初始化該類,在進入游戲前,這個類里面會讀取本地Obb文件生成校驗碼并與打包Apk時,配置在setting.xml中的校驗表對比,如果校驗失敗,則不會進入游戲場景,配置表如下:

  Assets/bin/Data/Setting.xml

<?xml version="1.0" encoding="UTF-8"?><settings>  <integer name="splash_mode">0</integer>  <bool name="useObb">True</bool>  <bool name="9f6f9912e7e5c791037078042be85f73">True</bool></settings>

  splash_mode:應該是定義啟動模式

  useObb:是否使用Obb,如果沒有使用Unity進行Obb分包,那么該選項始終是False。

  9f6f9912e7e5c791037078042be85f73:表示加密算法生成的校驗碼。

  項目中需要做的是在進入游戲后去進行一次Obb校驗,防止用戶重復下載Obb,如果校驗失敗就需要我們在游戲中自動去下載Obb包,我們把Unity中校驗Obb的步驟拎出來,一共三部。

  檢測Obb文件是否存在

  根據Obb文件生成校驗碼

  讀取setting.xml文件,并與校驗碼做對比

  下面的具體的一些代碼,主要規則來源于UnityPlayer。

  獲取Obb文件

  /**

  * 獲取應用obb位置

  * @param paramContext

  * @return

  */

  private static String[] getObbPath(Context paramContext) { String str1 = paramContext.getPackageName();

  VectorlocalVector = new Vector(); try {

  int i1 = paramContext.getPackageManager().getPackageInfo(str1, 0).versionCode; if (Environment.getExternalStorageState().equals("mounted")) {

  File localFile1 = Environment.getExternalStorageDirectory();

  File localFile2 = new File(localFile1.toString()

  + "/Android/obb/" + str1); if (localFile2.exists()) { if (i1 > 0) { String str3 = localFile2 + File.separator + "main."

  + i1 + "." + str1 + ".obb"; if (new File(str3).isFile()) {

  localVector.add(str3);

  }

  } if (i1 > 0) { String str2 = localFile2 + File.separator + "patch."

  + i1 + "." + str1 + ".obb"; if (new File(str2).isFile()) {

  localVector.add(str2);

  }

  }

  }

  } String[] arrayOfString = new String[localVector.size()];

  localVector.toArray(arrayOfString); return arrayOfString;

  } catch (PackageManager.NameNotFoundException localNameNotFoundException) {

  } return new String[0];

  }

  加密生成校驗碼算法:

  /**

  * 通過obb文件獲取加密MD5

  * @param paramString

  * @return

  */

  private static String getMd5(String paramString) { try {

  Log.d("WARX", "path = " + paramString);

  MessageDigest localMessageDigest = MessageDigest.getInstance("MD5");

  FileInputStream localFileInputStream = new FileInputStream(

  paramString); long lenght = new File(paramString).length();

  localFileInputStream.skip(lenght - Math.min(lenght, 65558L)); byte[] arrayOfByte = new byte[1024]; for (int i2 = 0; i2 != -1; i2 = localFileInputStream

  .read(arrayOfByte)) {

  localMessageDigest.update(arrayOfByte, 0, i2);

  }

  BigInteger bi = new BigInteger(1, localMessageDigest.digest());

  Log.d("WARX", "md5 = " + bi.toString(16)); return bi.toString(16);

  } catch (FileNotFoundException localFileNotFoundException) {

  } catch (IOException localIOException) {

  } catch (NoSuchAlgorithmException localNoSuchAlgorithmException) {

  } return null;

  }

  這里主要是根據文件的長度生成的一個md校驗碼。

  解析XML算法:

  private static Bundle getXml(Context context) {

  Bundle bundle = new Bundle();

  XmlPullParser localXmlPullParser; // int i1;

  String str; try {

  File localFile = new File(context.getPackageCodePath(), "assets/bin/Data/settings.xml"); Object localObject1; if (localFile.exists())

  localObject1 = new FileInputStream(localFile); else

  localObject1 = context.getAssets()

  .open("bin/Data/settings.xml");

  XmlPullParserFactory localXmlPullParserFactory = XmlPullParserFactory

  .newInstance();

  localXmlPullParserFactory.setNamespaceAware(true);

  localXmlPullParser = localXmlPullParserFactory.newPullParser();

  localXmlPullParser.setInput((InputStream) localObject1,null);

  int type = localXmlPullParser.getEventType(); Object localObject2 = null;

  str = null; while (type!=1) { switch (type) { case 2: if (localXmlPullParser.getAttributeCount()==0) {

  type = localXmlPullParser.next(); continue;

  }

  str = localXmlPullParser.getName();

  localObject2 = localXmlPullParser.getAttributeName(0); if (!localXmlPullParser.getAttributeName(0).equals("name")){

  type = localXmlPullParser.next(); continue;

  }

  localObject2 = localXmlPullParser.getAttributeValue(0); if (str.equalsIgnoreCase("integer")) {

  bundle.putInt((String) localObject2,

  Integer.parseInt(localXmlPullParser.nextText()));

  } else if (str.equalsIgnoreCase("string")) {

  bundle.putString((String) localObject2,

  localXmlPullParser.nextText());

  } else if (str.equalsIgnoreCase("bool")) {

  bundle.putBoolean((String) localObject2, Boolean

  .parseBoolean(localXmlPullParser.nextText()));

  } else if (str.equalsIgnoreCase("float")) {

  bundle.putFloat((String) localObject2,

  Float.parseFloat(localXmlPullParser.nextText()));

  } break; default: break;

  }

  type = localXmlPullParser.next();

  }

  } catch (Exception localException) {

  localException.printStackTrace();

  } return bundle;

  }

  這里將xml中的數據讀取到一個Bundle中進行保存,Bundle內部實現是Map。最后我們可以將生成的校驗碼與setting.xml中獲取的校驗碼進行對比,如果校驗失敗就可以啟動下載流程了,下載完成后重啟Activity,重新讀取Obb文件并加載資源。

  /**

  * 重啟Activity

  * @param context

  */

  public static void restartApplication(Activity context) {

  PackageManager packageManager = context.getPackageManager();

  Intent intent = packageManager.getLaunchIntentForPackage(context.getPackageName());

  ComponentName componentName = intent.getComponent();

  Intent mainIntent = IntentCompat.makeRestartActivityTask(componentName);

  mainIntent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);

  context.startActivity(mainIntent);

  System.exit(0);

  }

  關于使用obb所涉及到的權限問題

  最近需要把應用所用的權限最小化,那么獲取obb是否需要權限,這是一個非??拥臇|西,先看看官方的文檔。

  從文檔上可以看出來,是android 6.0需要權限,除了6.0都無需權限,但是使用我們手里的6.0設備去嘗試沒有權限都可以下載obb正常進行游戲,但是使用google play下載之后部分6.0機型讀取bugly上報訪問obb路徑被拒絕了,使用測試機也發現是偶發現象,下載了多次游戲,第一次的時候出現了訪問路徑拒絕,這就非常的蛋疼了。加上權限是肯定不會出問題的,我們剔除權限前游戲從未上報過這個問題,目前我們是增加了用戶讀取內存權限解決問題。

  更多關于unity培訓的問題,歡迎咨詢千鋒教育在線名師。千鋒教育擁有多年IT培訓服務經驗,采用全程面授高品質、高體驗培養模式,擁有國內一體化教學管理及學員服務,助力更多學員實現高薪夢想。

tags:
聲明:本站稿件版權均屬千鋒教育所有,未經許可不得擅自轉載。
10年以上業內強師集結,手把手帶你蛻變精英
請您保持通訊暢通,專屬學習老師24小時內將與您1V1溝通
免費領取
今日已有369人領取成功
劉同學 138****2860 剛剛成功領取
王同學 131****2015 剛剛成功領取
張同學 133****4652 剛剛成功領取
李同學 135****8607 剛剛成功領取
楊同學 132****5667 剛剛成功領取
岳同學 134****6652 剛剛成功領取
梁同學 157****2950 剛剛成功領取
劉同學 189****1015 剛剛成功領取
張同學 155****4678 剛剛成功領取
鄒同學 139****2907 剛剛成功領取
董同學 138****2867 剛剛成功領取
周同學 136****3602 剛剛成功領取
相關推薦HOT
欧美大片aaaa一级毛片| 麻豆午夜视频| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 日本伦理片网站| 一本高清在线| 国产高清在线精品一区a| 国产网站在线| 成人av在线播放| 九九免费精品视频| 午夜在线亚洲| 国产激情一区二区三区| 久久成人亚洲| 欧美激情中文字幕一区二区| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 高清一级片| 一 级 黄 中国色 片| 一级女性全黄生活片免费| 91麻豆tv| 久久久久久久男人的天堂| 二级特黄绝大片免费视频大片| 日韩男人天堂| 毛片高清| 美女免费精品视频在线观看| 日韩在线观看视频网站| 成人免费高清视频| 精品国产一区二区三区精东影业 | 国产精品1024在线永久免费| 成人a大片高清在线观看| 午夜欧美成人香蕉剧场| 成人免费网站视频ww| 美女被草网站| 国产亚洲男人的天堂在线观看| 尤物视频网站在线观看| 成人a大片在线观看| 一本高清在线| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 欧美激情一区二区三区视频高清 | 九九热国产视频| 午夜家庭影院| 天天色成人| 国产精品自拍在线观看| 国产精品免费精品自在线观看| 国产韩国精品一区二区三区| 国产美女在线观看| 亚洲第一色在线| 亚洲第一色在线| 九九久久99综合一区二区| 亚洲第一页乱| 日本在线不卡视频| 人人干人人草| 久久99欧美| 99久久精品国产高清一区二区| 欧美大片毛片aaa免费看| 国产原创中文字幕| 一级女性大黄生活片免费| 一本高清在线| 亚洲爆爽| 色综合久久天天综线观看| 欧美a级片免费看| 国产国语对白一级毛片| 国产一区二区精品久久91| 九九久久99| 久久久久久久久综合影视网| 久久99欧美| 国产一区精品| 韩国毛片免费大片| 日韩中文字幕在线播放| 日本免费看视频| 欧美1区| 成人免费高清视频| 一级毛片视频免费| 99久久视频| 日本在线www| 久草免费在线色站| 成人免费高清视频| 精品久久久久久免费影院| 欧美激情中文字幕一区二区| 可以免费看毛片的网站| 午夜久久网| 国产成a人片在线观看视频| 韩国三级视频在线观看| 国产不卡在线观看视频| 97视频免费在线观看| 国产一区免费在线观看| 日日夜人人澡人人澡人人看免| 九九精品久久| 一级毛片看真人在线视频| 国产91精品一区二区| 亚洲爆爽| 青青青草影院 | 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 毛片高清| 一级女人毛片人一女人| 久久精品店| 99色播| 国产伦久视频免费观看视频| 日本在线播放一区| 91麻豆精品国产综合久久久| 欧美日本免费| 天天做日日爱夜夜爽| 国产激情一区二区三区| 麻豆污视频| 国产视频久久久久| 四虎影视库国产精品一区| 人人干人人草| 国产成人精品综合| 中文字幕一区二区三区精彩视频| 亚洲精品影院| 精品国产亚一区二区三区| 久久国产精品自由自在| 国产福利免费视频| 九九精品影院| 成人a大片高清在线观看| 精品在线观看一区| 日韩综合| 免费国产在线观看| 成人av在线播放| 国产精品自拍亚洲| 久久精品店| 超级乱淫伦动漫| 国产视频一区二区在线观看 | 精品国产亚洲人成在线| 国产国语对白一级毛片| 精品毛片视频| 日韩专区一区| 一本高清在线| 韩国三级一区| 日韩欧美一二三区| 国产一区二区精品久久91| 国产视频在线免费观看| 97视频免费在线观看| 九九久久99| 麻豆网站在线看| 亚洲第一色在线| 成人免费网站久久久| 欧美激情伊人| 成人影院一区二区三区| 中文字幕一区二区三区精彩视频| 国产成人女人在线视频观看| 国产伦理精品| 国产亚洲男人的天堂在线观看| 青青青草视频在线观看| 香蕉视频一级| 欧美另类videosbestsex高清| 成人免费网站视频ww| 美女免费精品视频在线观看| 亚洲天堂在线播放| 韩国三级香港三级日本三级| 日日日夜夜操| 欧美a免费| 久久久久久久免费视频| 午夜激情视频在线观看| 高清一级做a爱过程不卡视频| 日韩一级黄色片| 麻豆系列 在线视频| 欧美激情一区二区三区中文字幕| 日韩免费在线视频| 欧美激情一区二区三区在线播放 | 在线观看成人网| 99久久精品国产麻豆| 成人a大片在线观看| 欧美爱色| 精品久久久久久中文| 欧美a级大片| 国产91丝袜高跟系列| 九九免费精品视频| 久草免费在线视频| 国产亚洲男人的天堂在线观看| 国产成人精品综合| 国产网站免费观看| 国产高清视频免费| 天天做日日爱夜夜爽| 日韩在线观看免费完整版视频| 亚洲爆爽| 精品国产一区二区三区久| 亚洲天堂免费| 国产亚洲免费观看| 日韩在线观看视频网站| 日韩欧美一及在线播放| 日本在线www| 韩国三级香港三级日本三级la| 午夜在线影院| 日日日夜夜操| 一级女人毛片人一女人| 深夜做爰性大片中文| 日韩在线观看网站| 欧美国产日韩一区二区三区| 国产91精品一区| 一级女人毛片人一女人| 国产一区二区精品在线观看| 国产精品自拍在线观看| 精品国产亚洲一区二区三区| 亚欧成人乱码一区二区| 青青久久国产成人免费网站| 黄视频网站免费| 免费国产在线观看| 久久精品道一区二区三区| 日韩男人天堂| 高清一级做a爱过程不卡视频| 国产极品精频在线观看|