在早期的 ARCore sdk 中独令,設(shè)備檢查是在 arcore_client.aar 中的 SupportedDevices.class赚哗,方法可以參考這里
我使用的是 1.1.0 版本嚎货,發(fā)現(xiàn)里面的變化很大,找不到 SupportedDevices 這個(gè)類了宽菜,于是看了半天里面的代碼盼理,發(fā)現(xiàn)設(shè)備校驗(yàn)是通過底層 so 庫做的,并且 sdk 里的 so 又調(diào)用了 ARCore 里的 so智亮,很復(fù)雜忆某,致使上面的反射方法失效
但是還不甘心,在把 ARCore sdk 捋了一遍后阔蛉,我又把 ARCore apk 解壓反編譯了弃舒,看了一下大致的代碼,然后在 apk 的 assets 目錄發(fā)現(xiàn)了一個(gè)叫 device_profile_database 的目錄状原,赫然發(fā)現(xiàn)里面記錄的是一個(gè)個(gè)設(shè)備信息聋呢,在里面發(fā)現(xiàn)了 device_profile_OnePlus5_slash_OnePlus5_colon_7.proto 和 device_profile_OnePlus5_slash_OnePlus5_colon_8.proto 兩個(gè)文件,用對(duì)比工具看了一下颠区,內(nèi)容完全一樣削锰,我覺得 一加 5 和 5t 硬件差別應(yīng)該不大,所以思路就有了毕莱,把這兩個(gè)文件分別拷貝一份器贩,把設(shè)備型號(hào) 改成 5T,然后重新打包安裝
安裝后 ARCore apk 后朋截,運(yùn)行官方 demo 提示的信息變了蛹稍,之前提示的是 "設(shè)備不支持" ,修改過后部服,提示 "創(chuàng)建 session 失敗" 唆姐,查看 logcat 發(fā)現(xiàn)一個(gè)錯(cuò)誤信息:簽名校驗(yàn)失敗,到這里廓八,我覺得有戲奉芦,可以再搞一搞,錯(cuò)誤信息是 native 報(bào)出來的剧蹂,但是我發(fā)現(xiàn)声功,檢查簽名其實(shí)是 java 層做的,在 SessionCreateJniHelper 的 checkApkSignature() 函數(shù)里
@UsedByNative("session_create.cc")
static boolean checkApkSignature(Context var0) throws NameNotFoundException {
PackageInfo var1;
try {
var1 = var0.getPackageManager().getPackageInfo("com.google.ar.core", 64);
} catch (NameNotFoundException var9) {
return true;
}
// xxx 是很長的 簽名值国夜,這里省略了
Signature var2 = new Signature("xxx");
Signature[] var3 = var1.signatures;
int var4 = var1.signatures.length;
for(int var5 = 0; var5 < var4; ++var5) {
Signature var6;
if ((var6 = var3[var5]).equals(var2)) {
return true;
}
String var7 = var2.toCharsString();
String var8 = var6.toCharsString();
Log.w("ARCore-SessionCreateJniHelper", (new StringBuilder(39 + String.valueOf(var7).length() + String.valueOf(var8).length())).append("Signature mismatch. Expected '").append(var7).append("' got '").append(var8).append("'").toString());
}
// 這里是重點(diǎn)
return var0.getPackageManager().getApplicationInfo(var0.getPackageName(), 128).metaData.getBoolean("com.google.ar.core.disable_security_check", false);
}
代碼的最后一行是重點(diǎn)减噪,即只要在 demo 工程的 AndroidManifest.xml 中的 application 節(jié)點(diǎn)內(nèi)添加如下內(nèi)容即可跳過簽名檢查
<!-- 跳過 SessionCreateJniHelper 簽名檢查 -->
<meta-data
android:name="com.google.ar.core.disable_security_check"
android:value="true" />
然后重新運(yùn)行 demo 就順利跑起來了
下面是運(yùn)行圖
白天剛搞完這個(gè),晚上 Google I/O 大會(huì)就發(fā)布了 ARCore 1.2 ,然后第二天試了上面的方法依然有效筹裕,ARCore 1.2 增加了 一加 3T 和 6 但是就是沒有 5T 很郁悶
ARCore 1.2 sdk 相對(duì)于 1.1 的變化:增加了 Augmented Image 相關(guān) api醋闭,并且做了代碼混淆
以上