[Android]教你如何擷取未安裝應用的ResolveInfo,androidresolveinfo

來源:互聯網
上載者:User

[Android]教你如何擷取未安裝應用的ResolveInfo,androidresolveinfo
原理:查看了下安卓源碼,明白瞭解析過程,只是自己的話就要移植安卓的源碼,有人解析成功了,但是我覺得太麻煩。大概說下安卓的解析過程吧。

    public PackageInfo getPackageArchiveInfo(String archiveFilePath, int flags) {        PackageParser packageParser = new PackageParser(archiveFilePath);        DisplayMetrics metrics = new DisplayMetrics();        metrics.setToDefaults();        final File sourceFile = new File(archiveFilePath);        PackageParser.Package pkg = packageParser.parsePackage(                sourceFile, archiveFilePath, metrics, 0);        if (pkg == null) {            return null;        }        if ((flags & GET_SIGNATURES) != 0) {            packageParser.collectCertificates(pkg, 0);        }        return PackageParser.generatePackageInfo(pkg, null, flags, 0, 0);    }

這裡是源碼,首先通過PackageParser解析,然後通過PackageParser.generatePackageInfo返回PackageInfo,但是PackageInfo裡卻把intent-filter給去掉了,不知道為啥,不過既然知道了這段代碼那麼就好好辦了。那就是通過反射把PackageParser.Package得到,然後再封裝成intentfilter。解決方案:直接上代碼把。因為完全就是通過反射又重寫了一次代碼。
  try {   // 先得到解析類PackageParser並執行個體化   Class packageParserClass = Class.forName("android.content.pm.PackageParser");   Object packageParser = packageParserClass.getConstructor(String.class).newInstance(dexPath);   // 構建參數   DisplayMetrics metrics = new DisplayMetrics();   metrics.setToDefaults();   File sourceFile = new File(dexPath);   // 調用PackageParser的parsePackage解析資料   Method method = packageParserClass.getDeclaredMethod("parsePackage", File.class, String.class, DisplayMetrics.class, int.class);   method.setAccessible(true);   Object Package = method.invoke(packageParser, sourceFile, dexPath, metrics, 0);   // 反射得到結果   Field activities = Package.getClass().getDeclaredField("activities");   activities.setAccessible(true);   ArrayList filters = (ArrayList) activities.get(Package);   for (int i = 0; i < filters.size(); i++) {    Object activity = filters.get(i);    Field intentsField = activity.getClass().getField("intents");    intentsField.setAccessible(true);    ArrayList<IntentFilter> intents = (ArrayList<IntentFilter>) intentsField.get(activity);    for (int j = 0; j < intents.size(); j++) {     if (intents.iterator().hasNext()) {      String actionString = intents.get(0).getAction(0);      String categoryString = intents.get(0).getCategory(0);      System.out.println(actionString + " " + categoryString);     }    }   }  } catch (Exception e) {  }
dexPath就是你要解析的APK的路徑。intentfilter裡有action和category。這樣就實現了得到一個activity的ResolveInfo,至於為什麼要類型轉來轉去,那就具體看安卓源碼吧。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.