工作之解讀py腳本

下面問題的描述不重要,想必每個(gè)公司都有它自己的一套客制化需求,主要是思路。
今天遇到個(gè)問題,就是訂單的版本號對應(yīng)不對,平常高通訂單版本號都是在config.mk文件改寫,找了很久沒有頭緒。后面直接在vendor(客制化,公司訂單客制化需求在這下面)下搜索文件錯誤的訂單版本號,搜索bash命令如下

 grep -rni --include="*" --exclude-dir=out "錯誤訂單版本號" ./

搜索到configwikoinfo.ini文件原來公司為Wiko的Unify,這個(gè)坑新接MR版本的我哪知道。原來fingerprint也是在這里面定義的(平常在buildinfo.sh文件里面),fingerprint固定的,我靠,MR與上一送測版本fingerprint一致,google是不會接受的直接打回來,差點(diǎn)背鍋。
configwikoinfo.ini

#內(nèi)部、外部版本號,產(chǎn)品名稱、品牌等等,fingerprint
TCUSTOM_BUILD_VERNO_FR = ...
CUSTOM_BUILD_VERNO_FR = ...
INTERNAL_BUILD_VERNO_FR = ...
WIK_PRODUCT_MODEL_FR = ...
WIK_PRODUCT_NAME_FR = ...
WIK_PRODUCT_DEVICE_FR = ...
WIK_PRODUCT_BOARD_FR = ...
#fixed BUILD_FINGERPRINT build number line
WIK_BUILD_FINGERPRINT_FR =  ...

然而這個(gè)文件又有什么用了,原來在另一個(gè)倉庫下有一個(gè)bwc.mk文件

# check configwikoinfo.ini path
ifeq ($(strip $(SUB_PROJECT_NAME)),)
wik_config_path := vendor/tinno/${TARGET_PRODUCT}/${PROJECT_NAME}/unify/configwikoinfo.ini
else
wik_config_path := vendor/tinno/${TARGET_PRODUCT}/${PROJECT_NAME}/SUB_PROJECTS/${SUB_PROJECT_NAME}/unify/configwikoinfo.ini
endif

$(warning "wik_config_path = $(wik_config_path)")
result := $(shell ./vendor/tinno/requirement/wik_common/unify/tools/BWC/buildwiko.py "${wik_config_path}" "WIKO" "$(PLATFORM_VERSION)" "$(BUILD_ID)" "$(TARGET_BUILD_VARIANT)" "release-keys")
$(warning "-- build wiko area --")  

由上bwc.mk文件可知得到configwikoinfo.ini文件路徑,然后運(yùn)行buildwiko.py腳本,傳入全局參數(shù)
buildwiko.py

#!/usr/bin/env python
#import commands
import ConfigParser
import sys,os
import commands

#configFile = "/home/android/WD_WORK/V3991_7.0/baseline/vendor/tinno/v3971/wik_fr/unify/configwikoinfo.ini"
writePath = "vendor/tinno/requirement/wik_common/unify/tools/BWC/"
#writePath = "./"
print "build wiko config version 1.0"


tmpBuffer = ""
index = 0
WIK_PRODUCT_BRAND = ""
WIK_PRODUCT_NAME = ""
PLATFORM_VERSION = ""
BUILD_ID = ""
BUILD_NUMBER = ""
TARGET_BUILD_VARIANT = ""
BUILD_VERSION_TAGS = ""
WIK_ASIA_UNIFY_CONFIG = "ro.internal.build.version="

propList = [
'ro.tcustom.build.version=',
'ro.custom.build.version=',
'ro.tinternal.build.version=',
'ro.product.model=',
'ro.product.name=',
'ro.product.device=',
'ro.product.board=',
'ro.build.fingerprint='
]

def add_config_fingerprint(buf):
    buf += "ro.build.fingerprint="
    buf += WIK_PRODUCT_BRAND
    buf += '/'
    buf += WIK_PRODUCT_NAME
    buf += '/'
    buf += WIK_PRODUCT_NAME+":"+PLATFORM_VERSION
    buf += '/'
    buf += BUILD_ID
    buf += '/'
    buf += BUILD_NUMBER
    buf += ':'
    buf += TARGET_BUILD_VARIANT
    buf += '/'
    buf += BUILD_VERSION_TAGS
    buf += '\n'

    print "add_config_fingerprint ...."
    return buf

def add_config_head(buf,area):
    buf += "# begin wiko properties\n"
    buf += "# WIKO_AREA:wik_"
    buf += area
    buf += "\n"
    return buf

def add_config_tail(buf):
    buf += "# end wiko properties\n"
    return buf

def write_config_to_file(buf, filepath):
    print "filepath = ",filepath
    with open(filepath, 'w') as file_object:
        file_object.write(buf)

def build_wiko_config(config_file_path):
    cf = ConfigParser.ConfigParser()
    try:
       cf.read(config_file_path)
    except:
       print "read ",config_file_path, "failed !"
       return None
    sections = cf.sections()
    print 'section:', sections

    for section in sections:
        print "section=",section
        tmpBuffer = ""
        index = 0
        tmpBuffer = add_config_head(tmpBuffer,section)
        writeFilePath = writePath + section
        options = cf.options(section)
        print "options = ",options
        global BUILD_NUMBER
        if section == "du":
           (status, BUILD_NUMBER) = commands.getstatusoutput('date +%s -d  \'+121 min\'')
        elif section == "fr":
           (status, BUILD_NUMBER) = commands.getstatusoutput('date +%s -d  \'+121 min\'')
        elif section == "vn":
           (status, BUILD_NUMBER) = commands.getstatusoutput('date +%s -d  \'+243 min\'')
        elif section == "id":
           (status, BUILD_NUMBER) = commands.getstatusoutput('date +%s -d  \'+365 min\'')
        elif section == "th":
           (status, BUILD_NUMBER) = commands.getstatusoutput('date +%s -d  \'+488 min\'')
        elif section == "my":
           (status, BUILD_NUMBER) = commands.getstatusoutput('date +%s -d  \'+610 min\'')
        elif section == "unify":
           unify = "INTERNAL_BUILD_VERNO_UNIFY"
           value = cf.get(section,unify)
           print "INTERNAL_BUILD_VERNO_UNIFY=",value
           if not value.strip():
              print "INTERNAL_BUILD_VERNO_UNIFY is not config, fatal exception"
              return
           global WIK_ASIA_UNIFY_CONFIG
           WIK_ASIA_UNIFY_CONFIG +=  value
           continue
        else:
           print 'unsupport area break out', section
           return
        BUILD_NUMBER = "android" + BUILD_NUMBER
        print "BUILD_NUMBER = ",BUILD_NUMBER

        # add ro.internal.build.version config
        if section != "fr":
           tmpBuffer += WIK_ASIA_UNIFY_CONFIG
           tmpBuffer += '\n'

        flag = "0"
        wik_product_name_tmp = "wik_product_name_" + section
        for option in options:
            print "option = ",option
            value = cf.get(section,option)
            print "value =",value, "  option = ",option, "wik_product_name=",wik_product_name_tmp
            if option == wik_product_name_tmp:
               global WIK_PRODUCT_NAME
               WIK_PRODUCT_NAME = value;

            print "WIK_PRODUCT_NAME = ", WIK_PRODUCT_NAME
            tmpBuffer += propList[index]
            tmpBuffer += value
            tmpBuffer += '\n'
            index = index + 1

            print "option=",option, "value=",value
            if (("wik_build_fingerprint" in option) and (value != "")):
               flag = "1"

        if flag == "0":
           tmpBuffer = add_config_fingerprint(tmpBuffer)

        tmpBuffer = add_config_tail(tmpBuffer)
        print "tmpBuffer = ",tmpBuffer
        write_config_to_file(tmpBuffer, writeFilePath)

if __name__ == "__main__":
     if len(sys.argv) != 7:
        print "please input configwikoinfo.ini path"

     WIK_PRODUCT_BRAND = sys.argv[2]
     PLATFORM_VERSION = sys.argv[3]
     BUILD_ID = sys.argv[4]
     TARGET_BUILD_VARIANT = sys.argv[5]
     BUILD_VERSION_TAGS = sys.argv[6]

     print "start build wiko config"
     build_wiko_config(sys.argv[1])

前幾天剛學(xué)過一點(diǎn)python,發(fā)揮一點(diǎn)余熱然后自行分析該腳本邏輯。腳本比較簡單易懂
1.先拿出參數(shù)賦值到變量中
2.然后通過傳進(jìn)來參數(shù)路徑解讀configwikoinfo.ini文件
3.然后就是判斷邏輯操作,組建字符串寫入相應(yīng)的文件中了。寫入文件的輸出路徑顯而易見,在本同腳本目錄下

解讀完腳本之后就會修改了,從邏輯上看,只要wik_build_fingerprint等于null,它就會根據(jù)產(chǎn)品信息和時(shí)間戳等信息生成fingerprint數(shù)值。前面已經(jīng)提到了我的需求,不與上一版本的fingerprint一樣。直接將onfigwikoinfo.ini的WIK_BUILD_FINGERPRINT_FR值注釋,這樣就解決了。之后還需要同意fingerprint。要求BUILD_NUMBER里面不包含android這個(gè)字符串,這也很簡單注釋掉BUILD_NUMBER = "android" + BUILD_NUMBER這條語句
bwc.mk除上面以外的還做了意見事情

PRODUCT_COPY_FILES += $(LOCAL_PATH)/unify/tools/BWC/du:system/vendor/wiko/du
PRODUCT_COPY_FILES += $(LOCAL_PATH)/unify/tools/BWC/fr:system/vendor/wiko/fr
PRODUCT_COPY_FILES += $(LOCAL_PATH)/unify/tools/BWC/id:system/vendor/wiko/id
PRODUCT_COPY_FILES += $(LOCAL_PATH)/unify/tools/BWC/my:system/vendor/wiko/my
PRODUCT_COPY_FILES += $(LOCAL_PATH)/unify/tools/BWC/th:system/vendor/wiko/th
PRODUCT_COPY_FILES += $(LOCAL_PATH)/unify/tools/BWC/vn:system/vendor/wiko/vn

把腳本生成的信息文件copy到Android手機(jī)system/vendor/wiko 目錄下,以備手機(jī)讀取其中的信息。

真正意義上了解了Python的用處與強(qiáng)大。


打完P(guān)atch跑GMS出現(xiàn)錯誤,Google對于GMS認(rèn)證要求是不斷更新,毫無疑問,項(xiàng)目越久要求越多
果然,跑玩一輪GMS準(zhǔn)備修改fail,又下面這種情況

Hi SPMs & TLs
根據(jù)谷歌最新的BTS(谷歌從6月份才強(qiáng)制check BTS測試)測試通知,要求fingerprint里的時(shí)間戳版本號要和ro.build.version.incremental的值保持一致,我們當(dāng)前很多項(xiàng)目因?yàn)椴灰恢聦?dǎo)致送測3PL被拒,各位請及時(shí)安排工程師進(jìn)行check和修改

*理解了這種模式其實(shí)修改起來十分簡單,首先查看buildinfo.sh文件 echo "ro.build.version.incremental=$BUILD_NUMBER" 由此可知,ro.build.version.incremental這個(gè)值是等于BUILD_NUMBER宏,具體值eng.android.{時(shí)間戳},具體構(gòu)造在build倉庫腳本下,懶得看了。
*由上面那個(gè)buildwiko.py腳本可知,BUILD_NUMBER這個(gè)值不是取的Android項(xiàng)目整個(gè)宏,而是自己在腳本中構(gòu)造的,部分代碼如下:

(status, BUILD_NUMBER) = commands.getstatusoutput('date +%s -d  \'+121 min\'') 

剛開始這就讓我十分頭疼了,腳本代碼生成的時(shí)間戳,毫無疑問不滿足Google最新BTS測試通知,如何修改就從這個(gè)腳本入手了,首先如何取得這個(gè)宏,如何去得到呢?對這方面毫無經(jīng)驗(yàn)
不過看到bwc.mk文件中

result := $(shell ./vendor/tinno/requirement/wik_common/unify/tools/BWC/buildwiko.py "${wik_config_path}" "WIKO" "$(PLATFORM_VERSION)" "$(BUILD_ID)" "$(TARGET_BUILD_VARIANT)" "release-keys")

這段,我猜想$(PLATFORM_VERSION)這種就是取得Android項(xiàng)目中的宏,然后當(dāng)做腳本參數(shù)傳入其中,抱著這種猜想,試試。

result := $(shell ./vendor/tinno/requirement/wik_common/unify/tools/BWC/buildwiko.py "${wik_config_path}" "WIKO" "$(PLATFORM_VERSION)" "$(BUILD_ID)" "$(TARGET_BUILD_VARIANT)" "release-keys" "$(BUILD_NUMBER)")

就改成這樣,然后依葫蘆畫瓢,在buildwiko.py中接收參數(shù) BUILD_NUMBER = sys.argv[7] ,然后對這個(gè)自行改造 BUILD_NUMBER = BUILD_NUMBER[12:],只截取時(shí)間戳的部分。既然BUILD_NUMBER是作為參數(shù)傳入,就不需要自己在腳本中構(gòu)造。build_wiko_config(config_file_path):函數(shù)中關(guān)于BUILD_NUMBER構(gòu)造全部都刪了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容