Android Studio Run專案出現Failure [INSTALL_FAILED_TEST_ONLY]

HappyCorn發表於2019-01-03

執行環境:
AS 版 本:Android Studio 3.2.1
手機型號:vivo Y85A
Android版本:8.1.0

換了一個新測試機,點選AS Run按鈕,執行專案,提示安裝失敗,錯誤資訊如下:

01/03 18:52:19: Launching app
$ adb push /Users/corn/AndroidStudioProjects/HappyCorn/app/build/outputs/apk/debug/app-debug.apk /data/local/tmp/com.happycorn
$ adb shell pm install -t -r "/data/local/tmp/com.happycorn"
Failure [INSTALL_FAILED_TEST_ONLY]
複製程式碼

網上搜尋,不少說法是install安裝時應該加上-t,對應含義是:允許安裝測試 APK
adb命令:
developer.android.com/studio/comm…

install [options] path	將軟體包(通過 path 指定)安裝到系統。
選項:
-l:安裝具有轉發鎖定功能的軟體包。
-r:重新安裝現有應用,保留其資料。
-t:允許安裝測試 APK。
-i installer_package_name:指定安裝程式軟體包名稱。
-s:在共享的大容量儲存(如 sdcard)上安裝軟體包。
-f:在內部系統記憶體上安裝軟體包。
-d:允許版本程式碼降級。
-g:授予應用清單中列出的所有許可權。
複製程式碼

但上述安裝錯誤日誌中實際上已經加上了-t引數,且直接cd到對應.../outputs/apk/debug/目錄下,執行adb install -r命令,依然出現相同錯誤提示,無法安裝。

網上 這篇部落格 中指出,Android Studio 3.0版本開始,直接點選AS Run按鈕時,會強制將android:testOnly屬性設定為true。

經實際Android Crack Tool反編譯app-debug.apk後,發現標籤中的屬性下確實被自動加入了testOnly屬性。

<application
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:testOnly="true"
    android:theme="@style/AppTheme">
    <activity android:name=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>
複製程式碼

於是自然想到如果在application中強制指定android:testOnly屬性為false,試一下。 結果發現依然出現相同錯誤提示,經反編譯後發現android:testOnly依然被強制改成了true。

繼續查一下Android官方文件,對應的testOnly含義。 developer.android.com/reference/a…

AndroidManifestApplication_testOnly
public static final int AndroidManifestApplication_testOnly
Option to indicate this application is only for testing purposes. For example, it may expose functionality or data outside of itself that would cause a security hole, but is useful for testing. This kind of application can not be installed without the INSTALL_ALLOW_TEST flag, which means only through adb install.

May be a boolean value, such as "true" or "false".
複製程式碼

文件中指出,testOnly為true,是用來指定在debug狀態下的,只能通過adb命令,且必須指定INSTALL_ALLOW_TEST falg,即對應的adb install -t引數。

考慮到其他手機上不存在此問題,先用其他手機分別試一下對應的adb命令安裝。 先試一下不帶-t引數:

adb install -r ~/AndroidStudioProjects/HappyCorn/app/build/outputs/apk/debug/app-debug.apk
複製程式碼

提示:

adb: failed to install /Users/corn/AndroidStudioProjects/HappyCorn/app/build/outputs/apk/debug/app-debug.apk: Failure [INSTALL_FAILED_TEST_ONLY: installPackageLI]
複製程式碼

再試一下帶-t引數:

adb install -r  -t  ~/AndroidStudioProjects/HappyCorn/app/build/outputs/apk/debug/app-debug.apk
Success
複製程式碼

由此可見,確實如文件中所說。

但vivo Y85A此機型使用adb install -t安裝依然失敗,應該是此機型針對-t(允許安裝測試 APK)此種情況做了進一步的嚴格安全限制。

為使其能夠能正常安裝成功,可以通過如下兩種方式:
1,不使用AS的Run按鈕直接安裝,改成使用build >> Build Bundle/Apk >> Build Apk方式生成安裝包並安裝;
2,專案根目錄下,配置gradle.properties配置項:

# testOnly設定為false
android.injected.testOnly=false
複製程式碼

重新點選AS的Run按鈕直接安裝,新生成的apk檔案,反編譯後發現標籤中的屬性android:testOnly屬性值已經被強制改為了false。

並且,此vivo Y85A手機也已經可以安裝成功。

相關文章