#Android 应用编译打包 |
要打包出Android平台的应用程序apk
我们得了解apk里面的文件结构, 您可以尝试把一个apk文件的扩展名.apk改成.zip,然后就可以点开浏览到它里面的文件,
以下是一个较为简单的apk里的文件
assets 目录存放应用程序里需读取用到的资源, 比如图片音乐模型等.
lib 目录存放应用程序C/C++编写的程序动态链接库
META-INF 目录存放安装包密匙文件, 这些文件绑定关联了组成该安装包的所有文件,
一旦包里文件被修改或添加, 造成与密匙不匹配, 系统就会拒绝安装该程序, 您必需重新打包该程序便会一起生成新的密匙文件
res 目录存放应用程序图标文件 和一些Android系统原生界面的元素( GN应用程序有自己的界面系统, 所以一般不需要这些元素 )
AndroidManifest.xml 文件描述了应用程序的名称, 图标名, 使用到的权限, 打开方式(前后台), 所兼容到的系统版本, 和程序入口Java类等
classes.dex 文件为Java程序模块, Android应用程序打开时会先调用这个, 在GN引擎应用里这个相当于程序入口和框架
resources.arsc 文件是一个资源映射文件, 它包含了res目录中所有资源文件的索引和其他相关信息
了解以上文件体系后, 要编译出GN引擎程序的Android版本, 首先就是把C++代码编译成Android的动态链接库, 为符合该系统的访问规则,
动态链接库的文件名通常以前序 lib 和扩展为.so组成, 比如引擎通过Java入口程序调用到的首个C++动态链接库默认为 libMain.so 这也是必须编译的库,
您还可以放更多其它被 libMain.so 调用到所依赖的动态库在 lib 目录里.
要编译这些动态库, 您需要下载两个工具:
GN用到的编译器工具链NDK版本r16b下载 - 必须是这个版本, 否则容易程序运行中崩溃
https://dl.google.com/android/repository/android-ndk-r16b-windows-x86.zip
https://dl.google.com/android/repository/android-ndk-r16b-linux-x86_64.zip
https://dl.google.com/android/repository/android-ndk-r16b-darwin-x86_64.zip
按自己开发电脑系统选, 3选1(windows, linux, mac), 下载好后直接解压便是
编译调试工具 Vscode 下载
https://code.visualstudio.com/Download#
按自己开发电脑系统选, 列如 windows -> Installer.zip -> [x64]
下载好后安装然后打开, 如下图步骤点, 之后在搜索栏输入C++, 会列出很多插件, 您必须点选安装下图列出的这几个插件
为了可以显示中文, 您可以按快捷键【Ctrl+Shift+P】, 后弹出选择列表, 然后选择【Configure Display Language】如下图:选择【简体中文】, 如提示要重启程序就重启它
此后还需要配置 settings.json 文件内容, 在顶栏搜索框里输入 settings.json , 然后列出就选择它, 如下图:
在这个文件里加入或替换成如下字段, 然后到左上角选择菜单 ->文件->保存
{
"[cpp]": {
"editor.wordBasedSuggestions": "off",
"editor.suggest.insertMode": "replace",
"editor.semanticHighlighting.enabled": true
},
"git.ignoreLegacyWarning": true,
"files.encoding": "gb18030",
"files.autoGuessEncoding": true,
"C_Cpp.inlayHints.referenceOperator.enabled": true,
"editor.minimap.enabled": false,
}
此后便可以打开您要编译的源码目录, 以GN SDK的例子工程为例
到左上角选择菜单 ->文件->打开文件夹 浏览到您SDK所在目录, 并进入里面的子目录Sample/Test,
在这个目录下通常有个 .vscode 目录(里面装有项目的编译任务配置文件), 然后再对话筐右下方点 ->选择文件夹 确认后再点左上方的大文件图标如下图所示:
根据步骤(1)(2)(3)点到这里, 把tasks.json文件里如红框圈住的路径段, 全部替换成您的NDK存放目录路径就可以编译了,
如想换其他例子编译, 您可找到步骤(4)位置这个文件路径, 替换成想编译的文件路径, 这个相对路径起始为 Vscode 当前打开的文件夹, ../ 表示上一级目录,
您也可以在这里添加更多行路径, 以编译多个文件, 路径格式需按这个套路以" "来包围逗号为结尾,
tasks.json文件配置里包含了多个不同平台版本的编译任务, 以花括号 { } 分隔, 比如标签为
{
"label": "C/C++: aarch64-linux-android-c++.exe lib????.so", 表示编译Android 64位的动态链接库
...
},
{
"label": "C/C++: arm-linux-androideabi-c++.exe lib????.so", 表示编译Android 32位的动态链接库
...
},
其中标签 "command" 指定相关编译器路径,
标签 "args" 是传给编译器的命令行参数, 其中有个关键参数 GN_USING_OPENGLes_ANDROID_JAVA 指示SDK的编译分支为Android java框架 OpenGLes图形渲染,
您可以参考头文件 SDK/Include/_SysDef/GN_SysDef.h 里首部列出了很多系统平台选项, 带★号的为比较推荐的项, 通常适配得比较全面!
其它参数具体可以搜索 gcc 命令行参数 获取更多资讯!
有关如何详细配置tasks.json文件里的内容, 请在其他网上搜索 vscode tasks 配置 获取更多资讯!
都准备好后我们就可以开始编译, 点击顶边栏就会列出一些选项, 选择 ->运行任务 就会再列出刚才标签介绍到的这几个编译任务,
点选任务后就开始进入等待编译, 注意下面终端输出信息, 如有一些小错误, 需要修改一下再编译, 有时因为Windows下的Msvc编译器语法宽容度更高,
一些不标准的代码写法在gcc或其它编译器里会抛出错误, 需要排除!
如代码文件中文显示成乱码, 你可以点底边栏右侧的文件编码【UTF-8】,出现选择 Reopen with Encoding 再选 Simplified Chinese(GB 2312)
如您希望修改代码时能显示智能提示和自动补全, 可以打开 .vscode 目录里的 c_cpp_properties.json 文件, 把里面的路径段 D:/software/SDK/android-ndk-r16-beta1
全部替换成您的NDK存放目录路径, 然后保存文件就可以了.
成功编译后便会在 Vscode 当前打开的文件夹位置里生成这个动态库, 以本例为: 您的SDK目录/Sample/Test/libMain.so
得到这个动态库后, 您就可以把它和它所调用到的资源和引擎的动态库, 框架等一起打包为Android应用apk, 引擎支持两种方法来打包:
(1).用引擎配套的小工具软件打包,只需要点几步即可, 非常便捷简单!
打包小工具下载地址 即将公布!
(2).参考常规 Android 搭配 C++原生应用开发 流程, 该方法可扩展支持更多系统应用层的调用和第三方开发的Java包调用, 比如开启摄像头
该方法首先您需要把编译出的libMain.so和其他依赖库.so 和引擎SDK/Lib/android/对应处理器架构目录 里的动态库文件一起复制进应用工程的原生库目录下 列如 libs/arm64-v8a,
arm64-v8a存放64位的动态库, armeabi存放32位的动态库, 不可混放, 您可以两个目录都放齐备, 但您得确保两个目录里的动态库都是完整无缺的, 否则产生闪退, 当两个都放齐,
目标设备如能支持64位会优先调用64位的库, 否则只能调佣32位库, 这样虽然可以兼容更多低端设备, 但两套库占用存储空间, 况且现在的手机不是太老的基本都支持64位,
如今较好的策略是仅打包64位, 但您的产品真需要兼容那小数的老旧设备就再另外打包一个仅32位应用分开下载
还需要将引擎的程序入口框架Java代码在SDK/Lib/android/framework 里有, 复制至您的Android应用工程对应源码目录里, 也可以修改这些代码以扩展更多功能
这些Java框架代码, 是以Android API级别9 来编写的, 如编译打包时有错, 您需要小修改一下代码再编译,
或用打包工具里的SDK Manager来补充下载API级别9, 然后切换至API级别9来编译!
!!注意, 您还需要把该目录下每个源码文件首行里的 .gnc.sample 改成您的公司名和应用识别名, 不能用中文, 否则目标设备会以为这个应用是之前已安装同名应用的更新,
而不是新应用, 如修改这个后, 在libMain.so里的main.cpp文件找到引擎C++程序入口这行 GN_MAIN_COM(gnc,sample); 这两个相关参数名也修改为与刚才的一致
然后重新编译一下, 否则程序运行会闪退, Java端找不到C++的程序入口
另外该目录下有个 AndroidManifest.xml 文件里也有 .gnc.sample 字段, 也需要一起改, 字段"应用名"这个才是应用程序的名称, 改成您想要的
当您希望打包的是32位apk, 需要删除不兼容的字段 android:targetSdkVersion="26" 之后下面的是应用请求的权限, 这些权限的具体作用, 网上有很多相关讲解
还有指定放置好资源目录 assets, 为了符合引擎Android访问规则, 您的资源应该放到应用根目录下 assets/GN/YouSource.zip,
为了减少空间占用, 您的所有资源都需要压缩成.zip, 包括GN_system.zip, GN目录里可以放多个.zip文件, C++程序运行以这个为起始路径.
了解这些后便可以用以下其中一个工具来打包:
1.用 Android Studio 集成开发环境来打包 - 这个网上有很多 C++原生应用开发 相关教程, 这里不再啰嗦
2.用 Eclipse 来打包 - 这个软件体积相对较小, 而且也有Linux, Mac版本 这里详细讲解一下它的打包流程:
首先下载和配置好开发环境可以参考一下这篇文章 https://blog.51cto.com/u_16099246/9289477
之后新建Android项目, 单击菜单栏的"File"->把鼠标光标移动到"New"->在弹出的列表框中,如果直接能看到"Android Applicaion Project"选项项,
则直接单击此选项,否则选择最下面的"Other...",在弹出的窗口中,展开"Android"项,选择"Android Applicaion Project",然后"Next";
在新弹出的窗口中按下图提示找到蓝色注明的地方修改,其它可以保持默认值,一路“Next”,直到点击“Finish”,这样第一个Android程序就创建好了,
这时你会发现Eclipse左边多了一个你新创建的Android项目, 然后你按下图蓝色标记的地方拖入相关文件
放好后按F5键刷新项目, 再等一会, 如果有红色叹号有错, 您需要重启一下Eclipse, 打开后再按F5刷新一下,
如还有很多错, 一般是JDK编译版本不匹配问题, 你可以在项目主文件夹里右键鼠标, 弹出下拉菜单选择 -> Properties, 弹出窗口按下图点选蓝色把版本设置为1.6 确定后再刷新一下
如还有些错误, 通常是引擎框架java代码与当前API级别有些不兼容, 您可以补充下载 API 级别9后再按F5刷新(这个相当于编译), 也可以采用修改代码的方法除错
直到没错后, 就可以在项目主文件夹里右键鼠标, 弹出下拉菜单选择 -> Run As -> Android Application, 就生成了安装包在项目 libs 目录旁边的 bin 目录里的.apk,
但项目视图不会显示它, 您需要在外面找到它! 当你之前已经配置选定好了运行模拟器或用USB数据线连接上了真机, 就会一起安装上并启动程序.
如何配置连接真机来调试
1) 打开开发者选项:在设备上进入“设置” -> “关于手机”,连续点击“版本号”7次,直到出现“你现在处于开发者模式”的提示
2) 启用USB调试:在“设置” -> “系统更新” -> “开发者选项”中找到“USB调试”,并勾选该选项
3) 允许USB调试:当设备连接到电脑时,会弹出是否允许USB调试的提示,选择“确定”, 并选择传输文件
都设置好后, 如还无法联机启动应用, 可能是驱动没安装, 您可以安装一些手机助手的软件便会一起把驱动装上!
如真机运行中途闪退, 你希望查看日志, 需要开通应用存储访问权限!
步骤: 设置 -> 应用 -> 应用管理 找到您的应用点入 -> 权限 -> 存储 -> 允许, 可能有些手机选项不尽相同, 无论如何你找到开通存储权限即可!
那么在下次运行后有错误信息便会在 [手机存储] 主目录下生成 RunLog.txt 文件, 里面记录了出错信息!