美文网首页
Unity3D之android打包成aar

Unity3D之android打包成aar

作者: 圈圈猫 | 来源:发表于2018-01-08 17:01 被阅读1720次

    前言

          unity for Android相对于IOS比较特殊,IOS可以打包到xcode然后在code中修改和调试,虽然Android也可以build出数据,但是你看不到源码无法调试,现在很多开发者将Android源码打包成aar的方式放入到unity工程里,相对于以前的jar,aar可以将资源文件等打入使用,和IOS没有对比就没有伤害啊,调试是个麻烦的事,在这也有好多的坑,实话我是从0开始踩了好多坑。接下来我们开始搞事。

    1、首先在Android studio生成一个mudule(可以新建)

    怕有些事unity的哥们,没搞过Android那就从studio开始吧,我这里的IDE版本是2.3,最新的应该是3.1bate了。不过都基本一样的。能抓老鼠就是好猫,但是代码需要多理解去深究。
    ①、点击start a new Android studio project


    image.png
    ②、 image.png
    ③、 image.png
    ④、接下来是选择模板的,亲儿子就是亲儿子,可以给开发者写好基础的模板和控件 image.png
    ⑤、 image.png
    ⑥、从unity目录下拷贝出我们需要的classes.jar打Android项目中。
    下面是windows和mac下的classes.jar存放路径
    (Win path) C:\Program Files (x86)\Unity\Editor\Data\PlaybackEngines\androidplayer\bin\classes.jar  
      
    (Mac path) Unity.app(show packages)Applications\Unity(rightclick ShowPackageContent)PlaybackEngines\AndroidPlayer\Variations\mono\Release\Classes\ckasses.jar
    
    ⑦、将包引入 image.png

    ⑧、前面说那么可能大家都可能会,下面开始写代码了。

    编写Android代码(直接在MainActivity中开始修改)
    public class MainActivity extends UnityPlayerActivity {
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    //        setContentView(R.layout.activity_main);
        }
    
        public void ShowToast(final String msg){
            //保证运行在UI线程中
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    Toast.makeText(getApplicationContext(), msg, Toast.LENGTH_LONG).show();
                }
            });
        }
    
        //静态方法
        public static String GetUserInfo(){
            return "这个是静态方法的";
        }
    
        public String GetData(){
            return "这个不是静态方法";
        }
    }
    
    修改mainfest

    加了一个meta-data

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.example.hello.myapplication">
    
        <application
            android:allowBackup="true"
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name"
            android:roundIcon="@mipmap/ic_launcher_round"
            android:supportsRtl="true"
            android:theme="@style/AppTheme">
            <activity android:name=".MainActivity" >
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
                <meta-data
                    android:name="unityplayer.UnityActivity"
                    android:value="true" />
            </activity>
        </application>
    </manifest>
    
    修改app下或者说mudle的build.gradle

    ①、apply plugin: 'com.android.application' 修改为 apply plugin: 'com.android.library'
    ②、注释applicationId "com.example.hello.myapplication"
    修改后的gradle:

    //apply plugin: 'com.android.application'
    apply plugin:'com.android.library'
    android {
        compileSdkVersion 26
        buildToolsVersion "26.0.2"
        defaultConfig {
    //        applicationId "com.example.hello.myapplication"
            minSdkVersion 15
            targetSdkVersion 27
            versionCode 1
            versionName "1.0"
    //        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        }
        buildTypes {
            release {
                minifyEnabled false
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            }
        }
    }
    
    dependencies {
        compile fileTree(include: ['*.jar'], dir: 'libs')
        androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
            exclude group: 'com.android.support', module: 'support-annotations'
        })
        //如果需要v7包,需要下载V7的jar,然后引入,在gradle引入会报错说找不到class
    //    compile 'com.android.support:appcompat-v7:26.+'
        testCompile 'junit:junit:4.12'
        compile files('libs/classes.jar')
    }
    
    
    导出我们的aar包

    ①、可以使用Android studio中的菜单,Build->Build APK,生成aar文件
    ②、使用gradlew 命令生成./gradlew assemblerelease,或者./gradew build。在Android studio有命令行工具,这样就不需要切换目录,如果是自己系统的需要切换的工程下。
    命令如下:


    image.png

    编译报错了,说用到了资源,先把资源注释或者删除。


    image.png
    接下来就在得到aar文件
    image.png
    用压缩软件打开,删除aar下的libs下的classes.jar(重要)

    这个jar包就是我们刚开始导入的unity提供交互的一个classes.jar,这里打开不是指解压开,而是用压缩软件打开,然后找到libs下,将刚才的classes.jar删除,因为不这样做会在unity打包的时候出现重复添加包的错误。

    =====================上门是Android打包成aar=======================

    Unity中操作了

    1、在unity中的Assets下新建文件Plugins,在Plugins下新建Android,将aar和Manifest.xml放入。或者像我下面一样分开放
    image.png
    2、编写unity代码
    public class TestCtrol : MonoBehaviour
    {
        //unity中的显示控件
        public Text mShowInfo, mShowStaticInfo;
    
        AndroidJavaObject jo = null;
        AndroidJavaObject JO
        {
            get
            {
                if (jo == null)
                {
                    AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
                    jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
                }
                return jo;
            }
        }
        void Start () {
            //toast
            JO.Call("ShowToast", "成功了6666666");
            string msg = JO.Call<string>("GetData");
            string staticMsg = JO.CallStatic<string>("GetUserInfo");
            mShowInfo.text = msg.ToString();
            mShowStaticInfo.text = staticMsg.ToString();
        }
        
        // Update is called once per frame
        void Update () {
            
        }
    }
    
    3、编译打包
    image.png image.png

    4、点击build and run

    5、测试结果

    image.png

    新手上路遇到太多的坑了,希望给大家一些帮助,有不对地方还望指点,本人对unity也是新手一个。

    相关文章

      网友评论

          本文标题:Unity3D之android打包成aar

          本文链接:https://www.haomeiwen.com/subject/kdrdbxtx.html