步骤
- 制作androidproject
- 修改build.gradle配置
- 打包aar
- 1.混淆打包aar
- 2.jar包导出
- 3.在其他的android工程引入aar
- 导入unity项目
- 运行unity3d输出apk包
新建一个project
打开AS,新建–>project
![]()
切换到project项目下面
找到app Moudle
找到libs,将unity3d 提供的jar包拷贝到libs下面,右键 ->open Moudle setting ,选择Moudle ,点击dependence
![]()
添加lib
选择拷贝到libs下面的文件unity_class.jar
MainAvtivity extends UnityPlayerActivity
注意要将setContentView()注释掉,不加载界面
终于到设置build.gradle
打开app的build.gradle,将apply plugin: ‘com.android.application’修改为apply plugin: ‘com.android.library’,并且删除applicationId “com...*”
如果需要混淆打包配置buildtypes
buildTypes {
release {
// Set minifyEnabled to true if you want to run ProGuard on your project
minifyEnabled true
//对齐
zipAlignEnabled true
//移除无用的resource 文件
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-unity.txt'
}
}
不需要混淆打包就设置minifyenable false;
修改完gradle 点击Sync Now,完成之后找到 gradle project窗口,找到app(本Moudle的gradle),右键 refresh external project,打开build,找到build命令,运行,生成aar文件,文件一般声称在outputs->aar里面,debug是没有混淆的,release是混淆的。
但是但是,我们不需要混淆所有的类文件,这就需要找到gradle里面的这句话
proguardFiles getDefaultProguardFile(‘proguard-android.txt’), ‘proguard-unity.txt’
,这里的混淆的规则文件在proguard-unity.txt 里面
-keep是不混淆
-keep class *.R
不混淆R文件
-keep class com.example.zhcase.unity3d.MainActivity{*;}
不混淆MainActivity类
-keep class com.example.zhcase.unity3d.BLEDeviceManager{*;}
-keep class com.example.zhcase.unity3d.BleDevice{*;}
-dontwarn com.unity3d.player.**
-keep class com.unity3d.player.UnityPlayerActivity{*;}
-keep class com.unity3d.player.* {;}
不混淆com.unity3d.player包下面所有的类
大概就是这样子 不明白的可以查下百度
类似的文章还是蛮多的
打成jar包
*在build.gradle 加入
//task makeJar(type: Copy) {
// delete ‘build/libs/mysdk.jar’
// from(‘build/intermediates/bundles/release/’)
// into(‘build/libs/’)
// include(‘classes.jar’)
// rename (‘classes.jar’, ‘mysdk.jar’)
//}
//
//makeJar.dependsOn(build)*
大概的意思就是新建一个task,删除旧的mysdk.jar包将jar包拷贝到libs下面,mysdk是导出的jar的包名。
还是Sync Now,在gradle project界面的other的下面找到exportjar,运行输出jar包,要是minifyEnabled还是true,输出的jar包还是混淆的。
为了测试自己导出的aar包是否可用,我自己新建了一个android project,就做一个简单的界面。
在As project中引用aar 还是需要将aar拷贝到libs文件夹,在gradle的dependencies 中加入
compile(name:’app-release’, ext:’aar’)
name后面的是aar包的包名,
rebuild project,成功的话在project会在build->intermediates下面看到explored-aar中含有这个包
然后按照普通的libs包用就可以了
导入到unity3d之前需要将原来引入的unity3d_classes.jar文件删除,因为unity3d编译时会生成自己的jar包,要是混淆打包的aar就有一个问题,需要-keep class 所有的jar文件不被混淆,然后用解压工具删除classes.jar的包含的unity3d_classes的文件。
在unity工程中Assets->plugins->android
Mainfest的文件是从As中项目拷贝过来的,unity的projectname和Mianfest的packagename一致
Unity调用android的方法
AndroidJavaClass jc = new AndroidJavaClass(“com.unity3d.player.UnityPlayer”);
AndroidJavaObject jo = jc.GetStatic(“currentActivity”);
jo.CallStatic(“StarScane”);
带参数
public void connect(string address)
{
#if UNITY_ANDROID
text.text += “连接设备”;
AndroidJavaClass jc = new AndroidJavaClass(“com.unity3d.player.UnityPlayer”);
AndroidJavaObject jo = jc.GetStatic(“currentActivity”);
jo.CallStatic(“connect”,address);
#endif
}
最后build&run,我在这一步还是遇到很多问题,配置SDK路径,显示platforms的Api is 0 ,这类错误基本是SDK路径错误,或者去AS下面的SDKManager更新下SDk版本,也可能会和build tools有关系,反正觉得有问题的你都下载吧 我就是这么解决的,JDK的路径和AS的一样就好
build&run运行到手机就可以
[TOC]
感谢http://www.cnblogs.com/xtqqkss/p/6387271.html的分享,大家可以看看,一步步做,慢慢查问题,还是可以做出来的,虽然我打个包花了我好几天
再见