1.首先设置环境变量
export PATH=`pwd`/depot_tools:"$PATH";export XWALK_OS_ANDROID=1;export GYP_GENERATORS='ninja';
指定工具路径在工程目录的depot_tools下.
指定操作系统为ANDROID.
指定GYP_GENERATOR生成工具为ninja.
2.如果系统还没有安装相应工具,则执行 source ./build/install-build-deps-android.sh 安装相应的工具.
3.python xwalk/gyp_xwalk
整个crooswalk工程是以gyp/gn的方式构建的,gyp_xwalk文件是一个python脚本 ,里面指定了工具所以的.gyp文件.执行python xwalk/gyp_xwalk 就会使用python的gyp模块将所有的.gyp或者.gypi文件生成对应的.ninja文件. 生成的过程都是通过python脚本去解析指定的.gyp 或者.gypi文件. 所有的.gypi文件都是在xwalk.gyp文件中描述的,xwalk.gyp文件是整个工程gypi文件的入口,是通过解析xwalk.gyp文件才找到每个gypi文件的. 每个.gypi文件格包含 目标 , 依赖 , 规则等信息,它详细的描述了生成目标所需要的依赖,包括源文件等信息. 通过python的gyp脚本解析这些.gypi文件会生成.ninja文件,所有的.gypi文件都有对应的.ninja文件. 它也会把所有的源码文件都生成到src/out目录中去,也就是执行完后src/out目录下有了生成整个工程所需要的所有资源 , 所以如果有改动工程中的脚本想生效的话必须先 执行 python xwalk/gyp_walk命令使之生成新的.ninja文件到out目录下去.
总的.ninja文件入口为build.ninja文件,它描述了所有的.ninja文件.
4. 生成我们所需要的目标 ninja -C out/Release vodbrowser
工程有两个版本,一个是debug版本,一个release版本. vodbrowser是目标名,它会找到对应的 vodbrowser.ninja 文件,这个文件是通过解析.gypi生成的,如果一个.gypi的目标是vodbrowser,它就会生成对应的vodbrowser.ninja,也就是说.ninja文件的名称就对应了.gypi文件的目标名称,通过解析vodbrowser.ninja文件得到目标 , 依赖 ,规则等信息,规则等信息中会指定编译器,编译则等信息. 最终生成我们所需要的目标.
案例分析:
需求: 混淆浏览器APK.
方案: 在生成浏览器apk对应的skyworth_app.gypi文件中 'variables' 栏目加入变量.
'proguard_enabled': 'true', //开启混淆
'proguard_flags_paths': ['runtime/android/VodBrowser/proguard.flags'], // //指向混淆规则文件.
错误1: 因为依赖的jar包 是我们vendors/framework层所生成skyworthdigital.jar ,它的源码中有包名java.*开关的类. 编译apk时就会报错不能在非核心库中的类以java或javax 作为包名开头.
解决方法:本来想在编译的脚本中指定skyworthdigital.jar为核心库,但是找不到具体的位置. 最后在skyworth_app.gypi文件中改成以动态方法链接skyworthdigital.jar. 注释掉 之前静态链接的方法 , 在’variables’ 栏目加入 'library_jars_paths': ['runtime/android/VodBrowser/libs/skyworthdigital.jar'], 声明为动态链接方式链接这个jar包.
错误2: 编译完apk后在运行过程中报错java和c互调的地方找不到对应的方法.
解决方法: 找到所有java和c互调的位置,将它们加入不需要混淆的规则中去.在加入规则时需要注意,非基本类型中的数据,要写上包名+类的方式. 例子:
-keep class com.skyworthdigital.app.VodBrowser.Player.PlayerHead {
private static java.lang.String a; //本身是private String a; ,规则中要将String的包名 //java.lnag加上
}
错误3: 一些包中混淆之后一些运行时提示类找不到了,反编译apk确定找不到对应的类.
解决方法: 将相应的包设置为不混淆, -keep class org.xwalk.core.**{*;}. 但是还是没搞清楚为什么混淆这个包中的类会使一些类不见了,考虑到主要是为了混淆apk的源码,所以暂时这样处理.