Android开发-利用python实现java代码的条件编译(下)

上一篇中,简单了解了用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

可见,达到了我们预期的效果:修改代码成功;分支执行成功。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

liranke

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值