原文: Android項目實戰(三十九):Android內建Unity3D項目(圖文詳解)
需求:
Unity3D 一般用于做遊戲 而且是跨平台的。原本設計是Android 應用端A(原生開發)進行一些業務處理,最後由A 打開Android 應用端B(Unity3D 遊戲開發)進行遊戲操作。
這樣導緻的問題:
1、A應用打開B應用 , 資料之間的傳遞不友善
2、正常關閉,異常關閉的互動及技術上處理麻煩
3、版本疊代,需要分開考慮
4、體驗差
5. ......................
最終要合并成一個Android應用 , 提高使用者體驗。 實作思路即 Android工程繼承(引入)Unity3D項目(依賴的Android項目 生成一個類庫)。
下面開始詳細步驟:
一、Unity3D 工程師 将 項目生成一個類庫
這個不多說,讓Unity3D 工程師去做 ,我們隻需要這個類庫就行
二、Android工程導入類庫

注:三個都要選中
導入成功之後 ,會有一些錯誤,要進行修改
三、修改
(1)、找到類庫目錄下的build.gradle檔案
将第一行: apply plugin: 'com.android.application' 改為: apply plugin: 'com.android.library'
将 compileSdkVersion 和 buildToolsVersion 改為和 app目錄的下build.gradle 一緻
将defaultConfig{}下的 applicationId 一行删除
Sync Now...
最終如下:
(2)、找到類庫目錄下的AndroidManifest.xml 檔案
删除application 下的幾條屬性
android:debuggable="false"
android:label=""
android:theme=""
android:icon="@mipmap/ic_launcher"
找到主入口Activity 即有 <intent-filter></intent-filter> 的 ,添加一條屬性:android:process="e.unity3d",這是讓Unity3D的主Activity退出的時候 可以回到Android部分,否則會有異常問題
然後删除<intent-filter>内部的所有部分 , 這一部分是标注該Activity作為主入口 并且 在手機桌面上顯示的,去掉了,不在桌面顯示,因為Android部分調用這個進入Unity3D部分,是以預設具有主入口的功能。
效果如下:
<application android:allowBackup="true"
android:name="com.xxxxx.SensorS.XApplication"
android:supportsRtl="true"
android:isGame="true">
<activity
android:configChanges="orientation|keyboardHidden|screenSize"
android:name="com.xxxxx.SensorS.MainActivity"
android:process="e.unity3d"
android:screenOrientation="landscape">
</activity>
//... 注意
// 打開MainActivity界面是在一個新的程序中的, 見參數android:process="e.unity3d"
// 如果其他的服務 或 activity 界面 需要在同一個程序 也需要添加 android:process="e.unity3d"
</application>
(3)、依賴該類庫
選擇類庫依賴
(4)、Android部分調打開Unity3D主Activity , 即打開類庫中的某個Activity
Intent intent = new Intent();
// unity3d部分的主activity
intent.setClass(TaskListActivity.this,MainActivity.class);
startActivity(intent);
另:可能出現的錯誤
1、你的硬體不支援!
這個出現的幾率比較大,首先看一下unity3d類庫的檔案目錄 , 隻有armeabi-v7a 和 x86 兩個檔案夾
是以我們要解決的就是 檢視一下app目錄下的 和 所有類庫下的 libs檔案夾或者jniLibs檔案夾下 也隻能有這兩個檔案夾 , 多的需要删除
還要注意:
如果你的app目錄或者module目錄下的build.gradle檔案夾中有如下代碼:
ndk {
//選擇要添加的對應cpu類型的.so庫。
abiFilters 'armeabi-v7a' ,'x86'
}
記得也必須隻能有這兩個,多的也要删除。
隻要保持一緻,這個問題就解決了。
2、jar包沖突的問題,這個屬于常見問題,類庫和app中保留一個就行,不多說了。
3、BuildConfig.class 檔案沖突
Error:Execution failed for task ':ipark2:transformClassesWithJarMergingForDebug'.
> com.android.build.api.transform.TransformException: java.util.zip.ZipException: duplicate entry: com/xxxxx/xxxxx/xxxx/BuildConfig.class
這個就說你的 com/xxxxx/xxxxx/xxxx/ 目錄下的BuildConfig.class 檔案沖突了 。 一般是在類庫中,jar包下有這麼一個檔案,而原來項目中是沒有的,是生成類庫的時候系統給生成的。
解決方法就是 把該檔案從 jar包中删除。
舉例:
1、現在有一個jar包
2、打開該檔案所在的目錄 , 按Shift + 滑鼠右鍵 選擇 ‘從此處打開指令視窗’
輸入指令: jar xf SensorS.jar 注:SensorS 即你的jar包的名字
執行指令之後 會發現目錄下多了一個jar包解壓後的檔案,在該檔案夾下按目錄找到BuildConfig.class 檔案, 删除
3、重新把處理後的檔案夾壓縮成jar包
jar cvf SensorSSS.jar com 注:SensorSSS 即重新生成的jar包的名字 , com即 要被壓縮成jar包的檔案夾(即原先jar包解壓縮出來的檔案并删除BuildConfig.class檔案)
最後将處理後的jar包替換原來的即可