上一篇中,简单了解了用python编译一个apk的脚本实现。
Android开发-利用python实现java代码的条件编译(上)
本篇中,实现通过python来修改java代码,从而实现“根据编译条件来控制代码执行”的目的,
类似于C/C++中的#define。
需求描述:
我们来修改MyApplication.java中的代码,修改Current_Car_Factory的值,将“BYD_Factory”改为“Chery_Factory”,从而影响到代码的执行(执行Chery的分支)。
MyApplication.java中的代码如下:
public class MyApplication extends Application {
private static final String TAG = "MyApplication";
public static final String Current_Car_Factory = "BYD_Factory";
@Override public void onCreate() {
super.onCreate();
showCarName();
}
public void showCarName() {
if (Current_Car_Factory.contains("BYD")) {
Log.i(TAG, "[showCarName]===Current_Car_Factory====" + "比亚迪:" + Current_Car_Factory);
}else if (Current_Car_Factory.contains("Chery")) {
Log.i(TAG, "[showCarName]===Current_Car_Factory====" + "奇瑞:" + Current_Car_Factory);
}
}
}
运行结果:
I/MyApplication: [showCarName]===Current_Car_Factory====比亚迪:BYD_Factory
编写Python,实现代码替换和编译:
python代码如下:
#!/usr/bin/env python3
import os
import sys
pwd = os.path.abspath('.')
build_dir = os.path.join(pwd)
sys.path.append(build_dir)
#代码替换
def replease_car(car):
fstr = pwd + '/app/src/main/java/com/test/myglibtestapp/MyApplication.java';
print("java file:")
print(fstr)
old_str = "BYD_Factory"
new_str = "Chery_Factory"
sed_cmd = "sed -i " + "\"" + "\""+ " "+ "\"" + "s/" + old_str + "/" + new_str + "/g" + "\"" + " " + fstr
print("sed_cmd:" + sed_cmd)
status=os.system(sed_cmd)
#编译apk
def build_apk():
#为了简化,只编译debug版本
print("begin compile...")
cmd = './gradlew assembleDebug'
os.system(cmd)
#main函数
if __name__ == '__main__':
print("main==begin===")
print("sys.argv[1]:")
print(sys.argv[1])
if sys.argv[1] == "C": #Chery
replease_car("Chery_Factory");
build_apk();
运行python脚本:
MyApplication的代码已经被修改,并且编译出了新的apk。
修改后的代码:
public static final String Current_Car_Factory = "Chery_Factory";
新的apk的执行结果:
I/MyApplication: [showCarName]===Current_Car_Factory====奇瑞:Chery_Factory
可见,达到了我们预期的效果:修改代码成功;分支执行成功。