CTS/GTS問題分析12
本文重點如何查看一個patch是否進了google system image
問題初探
測試命令:
run cts-on-gsi -m CtsOsTestCases -t android.os.cts.ParcelTest#testMaliciousMapWrite
fail: junit.framework.AssertionFailedError: Should have thrown a BadParcelableException
at junit.framework.Assert.fail(Assert.java:50)
at android.os.cts.ParcelTest.testMaliciousMapWrite(ParcelTest.java:3269)
at java.lang.reflect.Method.invoke(Native Method)
at junit.framework.TestCase.runTest(TestCase.java:168)
at junit.framework.TestCase.runBare(TestCase.java:134)
at junit.framework.TestResult$1.protect(TestResult.java:115)
at android.support.test.internal.runner.junit3.AndroidTestResult.runProtected(AndroidTestResult.java:73)
像這種問題很明顯就是google的安全補丁的問題,又因為我們刷了google system image,且CTS這條沒過,因此我們就可以懷疑google的patch沒進gsi
問題分析
首先找到相關(guān)的安全補丁如下:
那么補丁是否進了呢?
我們可以按照如下步驟進行處理:
1.解壓google提供的system.img(使用simg2img)
我們可以將其中的system/framework文件夾完整的拷出來
2.觀察這條補丁應(yīng)該在的問題,對于我們這條補丁而言,本來應(yīng)該在framework.jar里面
但是jar包里是空的,因此我們需要另想辦法
3.反編譯boot-framework.vdex
在O以前,我們可以通過baksmali.jar等工具來將odex->smali->dex→jar,根據(jù)這個路徑反編出大致的jar包
但是O之后不能這么做了,上面的步驟我們就不詳細介紹了
推薦使用https://github.com/anestisb/vdexExtractor 工具,通過反編vdex來查看
那么
vdexExtractor -i boot-framework.vdex -o . --deps -f -v 4
這樣,對于O的版本,這樣就可以直接解壓出dex文件了;但是對于Android P還要再增加一個步驟
4.將cdex轉(zhuǎn)換為dex
通過aosp的patch https://gist.github.com/anestisb/30265097ad9a5ea2f0ddf7e36db3f07d
編譯出compact_dex_converter工具
compact_dex_converter -w ./ ./boot-framework_classes2.cdex
會生成一個boot-framework_classes2.cdex.new文件,這個其實就是dex文件
- d2j-dex2jar.sh+010Editor dex→jar
如果magic header不對,用010Editor改一下,然后通過d2j-dex2jar.sh得到相應(yīng)的framework.jar
見boot-framework2.jar
查看其中的Parcel.class,發(fā)現(xiàn)patch果然沒進
public final void writeMap(Map paramMap)
{
writeMapInternal(paramMap);
}
void writeMapInternal(Map<String, Object> paramMap)
{
if (paramMap == null)
{
writeInt(-1);
return;
}
paramMap = paramMap.entrySet();
writeInt(paramMap.size());
paramMap = paramMap.iterator();
while (paramMap.hasNext())
{
Map.Entry localEntry = (Map.Entry)paramMap.next();
writeValue(localEntry.getKey());
writeValue(localEntry.getValue());
}
}
則有充足的理由申請waive
問題總結(jié)
該問題引申出如何查看gsi乃至友商機型system.img的方法
問題延伸
組內(nèi)老板的說法:
快捷點的話直接adb shell oatdump --oat-file=xxx.oat --export-dex-to=/tmp,不需要手動解析vdex/cdex/art/oat,應(yīng)該是不分Android版本的;(找機會試下!)