1. 程式人生 > >Android 7.0上app所需高階許可權的解除限制的方法

Android 7.0上app所需高階許可權的解除限制的方法

---- by Shengwen.Wei

一、    概述

        隨著移動網際網路的發展,使用者對於自身的資訊保安越來越重視,基於此,android系統對於使用者自身的資訊保安特別是android M(6.0)以後,對於許可權的管理尤為嚴格。

二、    高階許可權的使用限制及解限

        目前,android系統按照安全級別大致將許可權分兩種:一般許可權、危險許可權。

對於一般許可權,該類許可權基本不會涉及使用者的使用資訊,如藍芽、NFC等許可權;對於這類許可權,開發者只需在AndroidMenifest.xml中註冊即可;

而對於危險許可權,如讀寫聯絡人、讀寫簡訊等等涉及到使用者隱私資訊的開發者不僅僅要在AndroidMenifest.xml中註冊,還需要在程式碼中動態註冊然後由使用者決定是否允許程序是否能支援該種許可權的使用甚至很多許可權需要拿到系統許可權才能使用,這裡不做累述,下面介紹的是有部分高階許可權即使apk有系統許可權,google依然會將其列入黑名單中,影響的系統版本從android M以後開始;

        比如<uses-permission android:name="android.permission.INSTALL_PACKAGES"/> ,這類許可權即使App得到了系統級的管理許可權,若apk預置於/system/app或/system/pri-app/目錄下,還是會有其他問題的存在,如CTS、GTS通不過,那這類情況該如何解決呢?

        這裡就以筆者專案中用到的INSTALL_PACKAGES自動安裝的許可權來說明。

        由於專案需求,在無憂換機app中使用了INSTALL_PACKAGES自動安裝App的許可權,起初並沒有覺得什麼不對,因為許可權可以正常使用,APP也可以正常自動安裝,但是隨著專案的進行,當進行CTS、GTS的時候發現GTS並不能通過,log如下:

GtsInstallPackagesWhitelistDeviceTestCases

-           com.google.android.installpackageswhitelist.gts.GtsInstallPackagesWhitelistDeviceTest#testInstallerPackagesAgainstWhitelist

 com.google.android.installpackageswhitelist.gts.GtsInstallPackagesWhitelistDeviceTest#testInstallerPackagesAgainstWhitelistfail: junit.framework.AssertionFailedError: Packageshave INSTALL_PACKAGES permission not on whitelist:

com.tpv.transfer0bb9346f747777bb613560a9a4d7d5c6b2dab5601b6640ca71e2cf9fa25b6918

atjunit.framework.Assert.fail(Assert.java:50)

at junit.framework.Assert.assertTrue(Assert.java:20)

atcom.google.android.installpackageswhitelist.gts.GtsInstallPackagesWhitelistDeviceTest.checkInstallerPackageApps(GtsInstallPackagesWhitelistDeviceTest.java:159)

at com.google.android.installpackageswhitelist.gts.GtsInstallPackagesWhitelistDeviceTest.testInstallerPackagesAgainstWhitelist(GtsInstallPackagesWhitelistDeviceTest.java:165)

at java.lang.reflect.Method.invoke(NativeMethod)

at android.test.InstrumentationTestCase.runMethod(InstrumentationTestCase.java:220)

atandroid.test.InstrumentationTestCase.runTest(InstrumentationTestCase.java:205)

atjunit.framework.TestCase.runBare(TestCase.java:134)

atjunit.framework.TestResult$1.protect(TestResult.java:115)

at android.support.test.internal.runner.junit3.AndroidTestResult.runProtected(AndroidTestResult.java:77)

atjunit.framework.TestResult.run(TestResult.java:118)

atandroid.support.test.internal.runner.junit3.AndroidTestResult.run(AndroidTestResult.java:55)

at junit.framework.TestCase.run(TestCase.java:124)

atandroid.support.test.internal.runner.junit3.NonLeakyTestSuite$NonLeakyTest.run(NonLeakyTestSuite.java:63)

atandroid.support.test.internal.runner.junit3.AndroidTestSuite$1.run(AndroidTestSuite.java:97)

at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:428)

atjava.util.concurrent.FutureTask.run(FutureTask.java:237)

atjava.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)

atjava.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)

atjava.lang.Thread.run(Thread.java:761)

        看log大致的意思就是INSTALL_PACKAGES並沒有在google白名單中註冊,當時筆者覺得很不解,按照往常的邏輯,將APP放在/system/app下或者/system/pri-app目錄下應該這些許可權的使用應該是沒問題了,於是嘗試將apk置於/system/prio-app/目錄下之後,問題依然存在,

        沒辦法了,多跑幾次看下log還有沒有什麼有用的資訊吧。通過幾次的gts測試都看到有這麼一條log:

        由於執行GTS測試的電腦不能訪問google的緣故,會自動嘗試download了三次(估計沒有這三次的嘗試,我也不會注意這個),於是想辦法科學上網訪問該網址,顯示如下:

{

 "dynamicConfigEntries": {

   "specific_pairs": {

     "configValues": [

       "com.google.android.packageinstaller197f667ae126af53a8a891b5d5c81d7c0e48223b3e828e51870a4aeadd9e8d9d",

       "com.android.vendingf0fd6c5b410f25cb25c3b53346c8972fae30f8ee7411df910480ad6b2d60db83",

       "com.qiku.android.clone36001ae96ce24dd446df20f6fd60eb60ce1e53ca13fb0d5dd1c946af8309aeb8a9b",

       "com.kidoz.acer033457d5fa83daafe39103158447aaf39a5d96455435f63a84e283892b482a79",

       "com.rock.gota 03bad484485761ec066909dcd6e1dff2db81aee11e604dc5f6562a2b7f2c6260",

       "com.zui.factorymode04785ca9b6927b557aa779e5b68991c1510921d5f59404f84d436e5e3afdbc62",

       "com.zui.auservice04785ca9b6927b557aa779e5b68991c1510921d5f59404f84d436e5e3afdbc62",

       "com.mobilturk.scocuk 04c26c690897c90ca87c54a7ddf5649d8a49c39947496dff3c54148411dc8956",

......

        "com.huawei.android.launcher 30cd8d5918af4263e7b3b908ab691cee03814e8d683b09c0c62baf9c1d302014",

  "com.huawei.android.thememanager 30cd8d5918af4263e7b3b908ab691cee03814e8d683b09c0c62baf9c1d302014",
]
    },
    "any": {
      "configValues": [
        "android",
        "com.android.packageinstaller",
        "com.android.shell",
        "com.android.managedprovisioning",
        "com.customermobile.preload.vzw",
        "com.google.android.retaildemo",
        "com.mediatek.datatransfer",
        "com.motorola.autopackageinstaller",
        "com.google.android.tungsten.setupwraith",
        "com.coloros.speechassist",
        "com.nearme.deamon"
      ]
    }
  }
}

        前半部分看著像是包名,後面一串字元看著眼熟,感覺問題的答案很接近但是卻又觸碰不到,沒有更多想法情況下,看google官網文件吧,發現如下這段文字:

Adding the whitelists

Permissionwhitelists for applications can be listed in a single or multiple XML fileslocated in the frameworks/base/etc/permissions directory, asfollows:

·       /etc/permissions/privapp-permissions-<OEM_NAME>.xml

·       /etc/permissions/privapp-permissions-<DEVICE_NAME>.xml.

There is nostrict rule for organizing content, it can be decided by the device implementeras long as all applications from /system/priv-app arewhitelisted. For example, Google has a single whitelist for all privilegedapplications developed by Google.

The followingorganization is recommended:

·       Permissions for apps that are alreadyincluded in AOSP tree are listed in this file: /etc/permissions/privapp-permissions-platform.xml

·       Permissions for Google applications arelisted in this file: /etc/permissions/privapp-permissions-google.xml

·       For other applications, use files of theform: /etc/permissions/privapp-permissions-<device_name>.xml

        然而這些方法我都已經試過了無效,最終了解到需要向google申請將該app的許可權需求註冊到他們的白名單列表中(就是上一個表),需要提供包名、簽名sh256,原來如此,那個表格的後半部分就是apk簽名的sh256水印,

檢視方法:keytool -list -v-keystore 簽名檔案;需要注意的是提供給google的sh256數字資訊是將檢視到的內容去掉“:”的小寫字串。

待申請通過後,再跑GTS即可順利通過。