下面問題的描述不重要,想必每個(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)造全部都刪了。