SDK出包等学习笔记
(此文档为学习记录-待完善)
Android Studio
安装配置
-
配置环境
jdk1.8 配置环境
具体配置可见网络。
-
下载Android Studio
推荐版本为4.1.1,相对稳定。
推荐使用外接模拟器,暂使用的网易MuMu。
模拟器连接AS:新建txt
红框为模拟器adb文件所在路径。后方数字为模拟器连接端口,不同模拟器不同。
之后修改文件类型,转换为bat文件,每次打开AS工程和模拟器后,点击文件,AS中检索到相关模拟器即可。
结构
1、.gradle和.idea
这两个目录下都是AS自动生成的一些文件,我们不需要关心,也不要去手动编辑。
2、app
项目中的代码和资源文件都是放在这个文件下的,之后会对这个文件夹进行详解。
3、build
这个文件夹也无需关心,放的都是编译自动生成的文件。
4、gradle
这个目录下放置了gradle wrapper的配置文件,使用gradle wrapper的方式不需要提前将gradle下载好,而是会根据本地的情况自动决定是否要联网下载gradle。
5、.gitignore
这个与版本控制有关,用来将指定的文件或目录排除在版本控制之外的。
6、build.gradle
这是项目全局的gradle文件,通常也不需要改动,之后会详细介绍里面的内容;
7、gradle.properties
这是全局gradle文件的配置文件。
8、gradlew和gradlew.bat
用来在命令行界面中执行gradle,其中前者在linux和mac系统中使用,后者在windows中。
9、local.properties
指定android SDK的路径。
10、settings.gradle
指定项目中所有引入的模块,具体可看文件,通常模块的引入都是自动完成的,基本不需要手动处理。
Android&Unity混合开发
开发的两种方式
- Unity做好项目之后导出为Android Studio项目,导入到Android Studio中进行之后的功能开发。最后由Android Studio打包APK。即Unity辅助Android开发(Android开发为主),对Android技能要求较高。
- Android Sutido做好项目导出jar或aar包,导入到Unity中作为Unity的插件使用,最后由Unity打包APK。即Android辅助Unity开发(Unity开发为主),对Unity技能要求较高。
具体分析
-
导出Jar包+扩展MainActivity
经典方法,目前官方已经不推荐使用,但还是学一下。
Android studio工程,新建模块(注意SDK的选用),删除一同生成的activity_main.xml布局文件,之后的布局会由unity管理。模块中MainActivity中onCreate()里调用setContentView()方法也需要删除。
复制Unity下的classer.jar进libs目录下,Add as Library。
MainActivity,修改该类继承UnityPlayerActivity,此类中自定义方法,unity可调用。
bundles/debug目录右键Show in Explorer。删除debug/libs/classes.jar,把debug/classes.jar拖到debug/libs中(包含了刚新增的扩展方法的)。把libs和res这两个文件夹备份。
AndroidManifest.xml右键Show in Explorer导出,修改package包名为在Unity中想要的包名。
unity中要先切换到安卓平台,在Assets下新建文件夹Plugins/Android,将上述备份或导出的文件拖入文件夹下。在Unity的c#脚本中即可调用。
调用说明:
// 获得位于com.unity3d.player包下的UnityPlayer类,固定写法。 AndroidJavaClass _ajc = new AndroidJavaClass("com.unity3d.3dfish.UnityPlayer"); // 参数是包名+类名 // 获得_ajc所代表的类里的currentActivity对象,固定写法。是Unity提供的classes.jar中的功能,可通过currentActivity获取到安卓端代表MainActivty的对象。 AndroidJavaObject jo = _ajc.GetStatic<AndroidJavaObject>("currentActivity"); // 调用MainActivty中的自定义方法,如两个数相加。 text.text = jo.Call<int>("add", 1, 2).ToString();
Call说明:
Call<返回值类型(没有就不写)>(“函数名”,参数1,参数2,…(没参数就不写));
Assets文件夹下的Plugins/Android不可更改,为固定名。
PaPackage Name中的名字,需要和Unity中的Bundle Identifier名称保持一致。
-
Unity导出为android studio工程+java主导
Unity平台自带导出,可以导出为AS工程,注意sdk的选取。
直接将导出的Unity工程用android studio打开即可。
-
导出aar包 + 扩展MainActivity + java
官方推荐,Unity2017及以上版本推荐使用。
同方法一,新建Moudle作为一会导出的aar包(SDK版本不要太高)
PaPackage Name和unity包名无太大关系。
创建类,核心通信。通过Java的反射原理来获取本来导入class.jar类才能引用到的com.unity3d.player.UnityPlayer包下的currentActivity上下文。
此类中直接编写函数供Unity调用即可,(注:多数安卓底层调用均需要获取权限,要去AndroidManifest下获取权限。)
导出aar文件,有release和debug版本,release版本稍小,开发中一般使用debug版本。
直接将其拖入Android文件下即可。
调用说明:
/**
* 控制手机震动
* @param patter long数组 代表[等待时间,震动时间,等待时间,震动时间,...] (单位:毫秒)
* @param index 表示重复几次patter 一次设置为-1即可
*/
public void Shake(long[] patter,int index){
vibrator=(Vibrator)getActivity().getSystemService(Service.VIBRATOR_SERVICE);
vibrator.vibrate(patter,index);
}
AndroidJavaObject _ajc;
_ajc = new AndroidJavaObject("com.gg.thefishlib.UnityFishAndroid");
//若无返回值,call("方法名","参数")即可
long[] li = {500,1000};
_ajc.Call("Shake",li,-1);
-
aar包和jar包
-
jar
只包含了class文件与清单文件 ,不包含资源文件,如图片等所有res中的文件。
JAR(Java Archive,Java 归档文件)是与平台无关的文件格式,它允许将许多文件组合成一个压缩文件。
Jar的优点:安全性、减少下载时间、传输平台扩展、包密封、包版本控制、可移植性。
打jar包时,项目里的res文件是用不了的,若想用图片文件,可以将图片文件放进assets文件里面打进jar包再进行调用,但必须注意jar里面assets文件夹里面的文件不能和调用项目里面assets文件夹里面的文件重名。
-
aar
Android库项目的二进制归档文件,包含所有资源,class以及res资源文件全部包含。
将aar后缀改为.zip,再解压文件打开,看到每个aar解压后的内容不一致,但是都会包含AndroidManifest.xml,classes.jar,res,R.txt。
-
-
分析:若你只为简单的类库则使用生成的jar文件即可;如果你的是一个UI库,包含一些自己写的控件布局文件以及字体等资源文件那么就只能使用aar文件。(对本工程而言,用到地方较少,aar和jar区别不大。aar官方推荐,更简便,推荐使用aar+unity混合开发)。
(未完)
IOS
Unity ios混合开发
-
unity工程和ios混合开发的方式为,导出untiy工程为xcode工程,之后再xcode工程中编辑,出包等。
-
(未完)
出包
现出包
- jenkins配置
jenkins传入参数,执行shell脚本。
shell脚本执行在mac电脑上执行,若要新增.sh文件,要chmod a+x 给予权限。
一般情况下,均会更新svn后,根据mac上的unity工程进行出包。
选择android平台,则会由unity导出apk包,并上传jenkins。
选择ios平台,通过python文件,先生成xcode工程,再由xcode工程生成ipa。
xcode出包
-
总览:
ios端的出包主要为:Unity导出为xcode工程 => xcode工程build生成app => app再编译生成ipa供下载。
-
必要组件:
-
证书
其中包含了开发者账号,Mac信息,公钥,开发团队名等,当前项目使用的证书为99美元一年的开发者证书,可开发者账号上申请。
-
xcarchive文件
xcode8开始,以往的aipa生成指令逐渐更换,以往xcode再build时会生成一个app文件和一个dSYM文件。之后的xcode工程由xcodebuild -target变为xcodebuild archive,会生成一个xcarchive文件来替代原先的app和dYSM。
app本质是iOS编译以后生成的原始文件,实际是一个文件夹,里面包含各种资源文件(图片,第三方bundle,plist等文件),程序的可执行文件(二进制格式)以及对所有文件的签名记录。不能上传AppStore。
dSYM是生成app时的附属产物。本质是一个文件夹,其中只有一个最大的文件,作用是对iOS程序闪退后产生的log文件进行符号化(desymbolicate)。就是把无意义的内存地址变成可读的程序中的类和方法以及代码行数。不能上传AppStore。
xcarchive的本质是一个包含了app和dYSM的文件夹。是可以通过xcode上传AppStore的。
-
plist文件
plist文件时一种文件形式,用来存储用户数据,也可以用于存储捆绑的信息,该功能在旧式的Mac OS中是由资源分支提供的。由于Plist中存储的数据是抽象的,其采用的文件格式可以不止一种。
新版的xcode工程通过命令行出包要依赖plist文件,通常在app生成ipa后,会自带本次的plist文件。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WDI6tsqJ-1631699376318)(图\微信图片_202108311422405.jpg)]
建议在打包机上手动生成一次后,直接引用此plist文件。
若出包设置不变可继续引用。
-
-
手动出包注意事项:
-
build时Bundle Identifier应和Provisioning Profile保持一致
-
Archive
-
此处四个选项含义不同:
App Store Connect:导出的ipa可以发布到App Store或越狱的IOS设备上。
Ad Hoc:安装测试用,由udid限制。不能发布到AppStore上。
Enterprise:导出的ipa用于企业应用账号,个人账号不选。无udid限制。
Development:dev证书编译,类似第二个。
结合证书,测试当选择第四个。
-
命令行出包
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-93UUVrux-1631699376322)(图\Snipaste_2021-08-31_15-19-08.png)]
-
ipa
手动或命令行生成ipa后即可使用xcode或itools安装。
AppStore中ipa大小问题:
苹果会对二进制文件进行Apple FairPlay DRM加密,最后重新压缩成.ipa,所以大小会不一致。