同名掘金博文:https://juejin.im/post/5c2e0c496fb9a049a711f09ahtml
運行環境:
AS 版 本:Android Studio 3.2.1
手機型號:vivo Y85A
Android版本:8.1.0android
換了一個新測試機,點擊AS Run按鈕,運行項目,提示安裝失敗,錯誤信息以下:shell
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命令:
https://developer.android.com/studio/command-line/adb
android-studio
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。app
經實際Android Crack Tool反編譯app-debug.apk後,發現
<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。post
繼續查一下Android官方文檔,對應的testOnly含義。
https://developer.android.com/reference/android/R.styleable#AndroidManifestApplication_testOnly測試
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參數。gradle
考慮到其餘手機上不存在此問題,先用其餘手機分別試一下對應的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文件,反編譯後發現
而且,此vivo Y85A手機也已經能夠安裝成功。