Crosswalk 工程编译过程解析:


 

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 就会使用pythongyp模块将所有的.gyp或者.gypi文件生成对应的.ninja文件生成的过程都是通过python脚本去解析指定的.gyp 或者.gypi文件所有的.gypi文件都是在xwalk.gyp文件中描述的,xwalk.gyp文件是整个工程gypi文件的入口,是通过解析xwalk.gyp文件才找到每个gypi文件的每个.gypi文件格包含 目标 依赖 规则等信息,它详细的描述了生成目标所需要的依赖,包括源文件等信息通过pythongyp脚本解析这些.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时就会报错不能在非核心库中的类以javajavax 作为包名开头.

解决方法:本来想在编译的脚本中指定skyworthdigital.jar为核心库,但是找不到具体的位置最后在skyworth_app.gypi文件中改成以动态方法链接skyworthdigital.jar. 注释掉 之前静态链接的方法 ’variables’ 栏目加入 'library_jars_paths': ['runtime/android/VodBrowser/libs/skyworthdigital.jar'], 声明为动态链接方式链接这个jar

 

错误2: 编译完apk后在运行过程中报错javac互调的地方找不到对应的方法.   

解决方法找到所有javac互调的位置,将它们加入不需要混淆的规则中去.在加入规则时需要注意,非基本类型中的数据,要写上包名+类的方式例子

-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的源码,所以暂时这样处理

你可能感兴趣的:(Crosswalk 工程编译过程解析:)