一、环境:1)项目工程需使用android studio进行开发
2)需要在window系统开发(若使用苹果等系统的话,请自行修改相应脚本)
3)电脑需要安装python3
4)目前使用的gradle版本为gradle-4.1-all,安卓gradle插件版本为com.android.tools.build:gradle:3.0.0
二、配置:以下基于工程为as工程为前提(如果当前工程为eclipse项目,则跳到第四点转eclipse工程为as工程,然后再回到这里来看)
1)将工程切到Android,如果工程的module名称不是app,则先把module名称改为app。
2)查看该文件是否存在,如果不存在,则创建一个该文件,或者从已存在该文件的工程中复制一份放到这里,如下图为该文件里的配置:
1处为默认值,勿修改;
2处为SDK的简称;
3处为SDK的版本号;
4处为抽取资源的方式,值为1时为普通获取资源方式(就是直接从工程的res中复制资源到ForRes中,通常都是使用这种方式抽取资源。但是这种方式有个缺点,如果SDK方直接使用R.id.xx、R.drawable.xxx等R文件的方式获取资源的时候,使用我们打包工具打包会报错,原理自行摸索了解),值为2时是特别的方式抽取资源(就是通过apktool反编译接好SDK的apk,然后把反编译出的资源复制到ForRes中,理论上该方式可以适合所有的场景,但是它也有缺点,就是它很容易跟母包的资源id发生冲突,遇到资源id冲突的情况下我们可以手动去掉相应的资源id然后把文件发给游戏方进行打包。建议:遇到SDK方直接使用R.id.xx、R.drawable.xxx等R文件的方式获取资源的时候或者SDK方提供的是aar包或者combile的库含有大量资源文件的时候如v7包时,可以选用该方式);
5处创建新工程时用到,跟当前工程无关,但你需要生成一个新项目的时候才会使用到它。它后面的值,即是要创建的新工程的sdk简称。
3)检查module为app的build.gradle文件,
查看是否存在这些配置,如果不存在,则把以下代码复制到这个build.gradle文件中。
def rootPath = project.rootDir.getAbsolutePath()
def utilPath = rootPath.substring(0, rootPath.lastIndexOf('\\')) + "/PoolSdk_AsParent/app/util.gradle"
apply from:utilPath
4)检查project的build.gradle文件,查看里面的配置,看是否有下图圈到的,没有则添加。
三、使用该自动化系统:
使用方法:在android studio中的下输入相应命令。
1)一键抽取资源:gradlew OBC
(说明:根据第二步中的配置,SDK简称以及SDK版本号,直接在_SDK文件夹中生成资源文件)
2)dex文件修改:gradlew changeDex
(说明:如果项目中只是代码逻辑修改了或者jar包替换,资源文件不变,使用该方法可以快速修改之前以及生成的dex)
3)一步打开抽取出来的资源所在的文件夹:gradlew OSDK
(说明:该方式主要是为了快速打开到资源位置,而不需要一个一个文件夹的点开,无需人工一个个查找)
4)快捷生成新工程:gradlew CNP
(说明:在gradle.properties文件中配置的
,这里就可以用得上了,根据这个值我们可以生成一个名为PoolSdk_huoerlanTT的新工程。省去了到文件中找出脚本再生成工程的时间。)
5)更多的快捷方法请自行开发
四、转eclipse工程为as工程:
1)说明:由于历史原因,我们的工程既存在eclipse工程也存在as工程。由于我们的gradle抽取资源的系统是基于as的,所以推荐以后以as为开发工具。
2)步骤:
如上图所示,我们选到菜单栏的File–>New–>Import Project,然后选择eclipse工程,接着点OK,接着一直点next,最后点完成即可。
五、善后工作:
执行完一键抽取资源(gradlew OBC)之后,一般来说我们可以直接打压缩包将资源提交到公共后台了。但是有些文件(如:ForAssets中的某些文件参考YSDK的ysdkconf.ini,或者Formanifest.xml)是需要在打包工具进行打包的时候要替换某些值的,例如Formanifest.xml中的某个activity的方向设置,某个provider的主机名,又例如ysdkconf.ini文件中的QQ_APP_ID的值。由于这些都是动态的需求,所以目前该自动化系统无法处理这些。这种情况下我们就需要根据具体情况,或修改config.xml文件,或修改Formanifest.xml中的内容。具体可以参考文档
《打包工具配置相关》
六、modeType的选择以及问题处理:
在第二步(配置)中已经初步提到了两种方式的特点。
1)值为1的时候,资源的抽取是一种正常的方式,所以如果打包的时候出现资源冲突,我们可以根据打包工具的日志迅速查找到是什么资源冲突了,我们一般直接把SDK方的相应资源删掉,然后发给游戏替换即可。
2)值为2的时候,我们的资源抽取方式是使用了反编译后的资源,所以这里我们的资源会多次两个文件,一个是public.xml文件,另外一个是ids.xml文件。但使用这种方式进行资源抽取发生跟游戏的资源冲突的时候,我们一般可以把public.xml文件以及ids.xml文件中的冲突资源删掉,然后把这两个文件发给游戏方替换即可。
七、额外要求:
1)要求所有的资源要放到module为app的res文件夹中。
2)要求YSDK中使用到的微信相关文件,如WXEntryActivity.java需要放到module为app的的src下的任一个包中
八、自动抽取资源系统的原理:
该系统依赖于gradle自动化构建系统,辅以python脚本以及window的批语言。gradle插件的源码在util.gradle中可以查看。