本文中studio指Rose Studio。
不论iOS还是Android,可说都要基于一个模板工程去生成,考虑到总须要studio,这个模板工程就是studio。但考虑完整性等原因,模板不是studio的直接复制。
一、Windows
1.1 如何生成模板
Windows的模板除了要让生成已有的项目,还要让生成新建项目。
- 移除除3rdparty、3rdparty2、4lib*、applet、libbasic、studio外所有项目。
- 对applet。删除aplt_leagor_basic、rose_lua外的所有内容。
- 移除gui/dialogs组下除了home.cpp、home.hpp外所有内容。
- 移除Header Files组下所有内容。
- 移除Source Files组下除了main.cpp外所有内容。
- 把vc下的apps.sln、applet.vcxproj、applet.vcxproj.filters、applet.vcxproj.user、libbasic.vcxproj、libbasic.vcxproj.filters、libbasic.vcxproj.user、studio.vcxproj、studio.vcxproj.filters、studio.vcxproj.user复制到windows-prj。
小程序libleagor_basic.vcproj、libleagor_basic.vcproj.filters
- 移除除Header Files、Source Files外的那些组。
- 移除Header Files组下所有内容。
- 移除Source Files组下除了main.cpp外所有内容。
- 把vc下的libleagor_basic.vcproj、libleagor_basic.vcproj.filters复制到windows-prj。
1.2 如何由模板生成app项目文件
假设要生成的app是“blesmart”,bundle_id是com.leagor.blesmart。复制阶段已复制了以下文件。
- librose.vcxproj
- librose.vcxproj.filters
- blesmart.vcxproj
- blesmart.vcxproj.filters
生成vc/blesmart.sln。
- 从blesmart.vcxproj提取出guid,即“<ProjectGuid>{”“}</ProjectGuid>”中的部分,记为guid_str。
- 以只读方式打开<windows-prj>/apps.sln
- 把文件中所有字符串studio替换为blesmart。
- 把文件中所有字符串3641E31E-36BF-4E03-8879-DE33ADC07D68替换为guid_str,即blesmart的guid。(3641E31E-36BF-4E03-8879-DE33ADC07D68是studio的guid)
- 把修改出的数据保存到vc/studio.sln。
生成vc/blesmart.vcxproj.user。
- 以只读方式打开<windows-prj>/studio.vcxproj.user。
- 把文件中所字符串apps-res替换为blesmart-res。
- 把修改出的数据保存到vc/blesmart.vcxproj.user。
1.3 如何新建项目
假设新建项目的id是hello,guid是11111111-2222-3333-4444-555555555555。
生成hello.vcxproj
- 打开<windows-prj>/studio.vcxproj。
- 把文件中所有字符串studio替换为hello。
- 把文件中所有字符串3641E31E-36BF-4E03-8879-DE33ADC07D68替换为hello的guid。
- 把修改出的数据保存到vc/hello.vcxproj。
生成hello.vcxproj.filters。
- 打开<windows-prj>/studio.vcxproj.filters。
- 把文件中所有字符串studio替换为hello。
- 把修改出的数据保存到vc/hello.vcxproj.filters。
生成hello.vcxproj.user。
- 复制<windows-prj>/studio.vcxproj.user到vc目录,并改名为hello.vcxproj.user。注:不用改此文件内容,新项目是加到工作包,当中资源包路径是“apps-res”。
修改vc/apps.sln,让增加新建的hello项目。
- 向Global外增加以下内容。
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "hello", "hello.vcxproj", "{11111111-2222-3333-4444-555555555555}" EndProject
- 向GlobalSection块内增加以下内容。
{11111111-2222-3333-4444-555555555555}.Debug|Win32.ActiveCfg = Debug|Win32 {11111111-2222-3333-4444-555555555555}.Debug|Win32.Build.0 = Debug|Win32 {11111111-2222-3333-4444-555555555555}.Release|Win32.ActiveCfg = Release|Win32 {11111111-2222-3333-4444-555555555555}.Release|Win32.Build.0 = Release|Win32
1.4 增加、删除*.hpp、*.cpp
增加、删除文件涉及到studio.vcxproj、studio.vcxproj.filters。
Visual Studio把文件分为两类,需要编译的(ClCompile Include)和不需要编译的(ClInclude Include)。但不论哪种,它们都放在<ItemGroup>块。
studio.vcxproj指示项目有哪些文件,studio.vcxproj.filters指示这些文件放在哪个filter。
增加文件时,可能需要动态增加<ItemGroup>。举个例子,当前没有(ClInclude Include),可要增加*.hpp,这时就需要增加<ItemGroup>。同理,删除文件时如果<ItemGroup>已没有文件,那就需要删除。
Studio在处理增加*.hpp、*.cpp分两步。
1.4.1 判断是否能增加
studio.vcxproj。存在<ItemGroup>,<ClCompile Include="..\..\studio\main.cpp"
studio.vcxproj.filters。存在1)<ItemGroup>,存在<Filter Include="gui\dialogs">。2)<ItemGroup>,<ClCompile Include="..\..\studio\main.cpp"
1.4.2 执行增加
studio.vcxproj。 <ClCompile Include="..\..\studio\gui\dialogs\control_setting.cpp"> <ObjectFileName Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(IntDir)gui\dialogs\</ObjectFileName> <ObjectFileName Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(IntDir)gui\dialogs\</ObjectFileName> <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> </ExcludedFromBuild> </ClCompile> studio.vcxproj.filters。 <ClCompile Include="..\..\studio\gui\dialogs\control_setting.cpp"> <Filter>gui\dialogs</Filter> </ClCompile>
二、Android
2.1 如何生成模板
- .idea/modules.xml
项目需要两个iml文件,.idea/modules.xml写了这两文件位置。
<module fileurl="file://$PROJECT_DIR$/android.iml" filepath="$PROJECT_DIR$/android.iml" /> <module fileurl="file://$PROJECT_DIR$/app/app.iml" filepath="$PROJECT_DIR$/app/app.iml" /> android.iml是项目iml,此项目名叫android,位在项目根下。 app.iml是模块iml,此模块名叫app,位在模块根下。
这两文件较复杂,生成模板时删除,由Android Studio自动生成。但在自动生成时随机出现过生成失败,失败时在.idea/modules.xml又加了一个android.iml。
- gradle/wrapper/gradle-wrapper.properties
模板使用的gradle版本是3.3,它写在<android>/gradle/wrapper/gradle-wrapper.properties。这文件直接写有gradle的版本号,生成模板时删除整个gradle目录。 - build.gradle
中间要依赖com.android.tools.build:gradle:2.3.3。gradle的版本号可能在变。生成模板时不能删这文件,一旦删除会打开会报以下错误。
The project 'xxxx' is not a Gradle-based project.
- app/build.gradle
中间写compileSdkVersion、buildToolsVersion、targetSdkVersion。必须指定compileSdkVersion、buildToolsVersion的版本号。
2.2 如何由模板生成app项目文件
假设要生成的app是“blesmart”,bundle_id是com.leagor.blesmart。复制阶段已复制了以下文件。
- 复制<apps-src>/apps/projectfiles/android-prj目录,改名为android。
- 处理/app/src/main/AndroidManifest.xml。
1.1 定位package="后的com.leagor.studio,把它替换为com.leagor.blesmart。
1.2 如果ble=true,添加和蓝牙相关权限。
- 生成/app/src/main/java/com/leagor/blesmart/app.java。
3.1:打开/app/src/main/java/com/leagor/studio/app.java。
3.2:定位package="后的com.leagor.studio,把它替换为com.leagor.blesmart。
3.3:新建/app/src/main/java/com/leagor/blesmart目录,把app.java复制到处目录。
3.4:删除/app/src/main/java/com/leagor/studio目录。(这里要根据com.leagor.blesmart、com.leagor.studo开始出现的不同段选择删除哪目录)
- 处理/app/build.gradle。
4.1:定位package="后的applicationId,把它替换为com.leagor.blesmart。 - 处理/app/src/main/res/values/strings.xml
5.1:把文件中所有字符串studio替换为blesmart。 - 处理/app/jni/Android.mk
6.1:把/app/jni/Android.mk文件名改为Android.mk.tmp。
6.2:把文件中所有字符串studio替换为blesmart。
6.3:修改过的内容存入Android.mk。
6.4:删除Android.mk.tmp。
- 生成<app_src>/scripts/android_set_variable.bat
7.1:打开<app_src>/scripts/android_set_variable.tpl。
7.3:%_APP_SRC%替换为c:\ddksample\blesmart-src。
三、iOS
3.1 如何生成模板
- 增加Health Kit。
- 移除src组下的所有内容。
3.2 如何由模板生成app项目文件
假设要生成的app是“blesmart”,bundle_id是com.leagor.blesmart。
- 复制<apps-src>/apps/projectfiles/ios-prj目录。
- 把<Xcode-iOS>/stduio目录名改为<ios>/blesmart。
- 把<Xcode-iOS>/studio.xcodeproj目录名改为blesmart.xcodeproj。
- 把<Xcode-iOS>/blesmart.xcodeproj/project.pbxproj文件名改为project.pbxproj.tmp。
- 处理project.pbxproj.tmp。
5.1 如果healthkit=false,1)删除所有包含字符串studio.entitlements的行。2)删除SystemCapabilities = { }。
5.2 把文件中所有字符串studio替换为blesmart。
5.3 把文件中所有以PRODUCT_BUNDLE_IDENTIFIER = 为前缀和“;”之间部分替换为com.leagor.blesmart。
- 删除project.pbxproj.tmp。
- 处理<Xcode-iOS>/blesmart/studio.entitlements文件。如果healthkit=true,把它改名为blesmart.entitlements,否则删除该文件。