New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Shazam APK failing when decoding and building with Apktool #1097

Closed
ACATTAN opened this Issue Dec 7, 2015 · 3 comments

Comments

Projects
None yet
2 participants
@ACATTAN

ACATTAN commented Dec 7, 2015

Hi,
I'd like to report an issue with Apktool which can be reproduced using the shazam APK.
Steps to reproduce:

  1. Decode shazam apk with apktool
  2. Build it back with apktool from the decoded folder
  3. Install the new apk on a device and run. It will crash, reporting the following:
android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.VIEW dat=shazam_activity://sign_up flg=0x10000000 pkg=com.shazam.android (has extras) }

It seems that a manual change in the decoded AndroidManifest.xml file solves this issue - if the intent-filter of the SignUpActivity is changed from a reference to @strings into a concrete raw string, the app doesn't crash. Specifically changing this:

<activity android:configChanges="locale|fontScale|keyboard|keyboardHidden|mcc|mnc|navigation|orientation|screenLayout|screenSize|smallestScreenSize|touchscreen|uiMode" android:launchMode="singleTask" android:name="com.shazam.android.activities.account.SignUpActivity" android:theme="@style/Theme.Shazam.Dark">
        <intent-filter>
            <action android:name="android.intent.action.VIEW"/>
            <category android:name="android.intent.category.DEFAULT"/>
            <data android:host="sign_up" android:scheme="@string/scheme_shazam_activity"/>
        </intent-filter>
    </activity>

Into this:

<activity android:configChanges="locale|fontScale|keyboard|keyboardHidden|mcc|mnc|navigation|orientation|screenLayout|screenSize|smallestScreenSize|touchscreen|uiMode" android:launchMode="singleTask" android:name="com.shazam.android.activities.account.SignUpActivity" android:theme="@style/Theme.Shazam.Dark">
        <intent-filter>
            <action android:name="android.intent.action.VIEW"/>
            <category android:name="android.intent.category.DEFAULT"/>
            <data android:host="sign_up" android:scheme="shazam_activity"/>
        </intent-filter>
    </activity>

solves the issue. However it's not clear why, as it seems that in the original manifest the android:scheme is set as a string reference and not a raw string.

Thanks,
Ariel

@iBotPeaches

This comment has been minimized.

Show comment
Hide comment
@iBotPeaches

iBotPeaches Dec 7, 2015

Owner

Yes, this is quite the can of worms. We have hit this before and hacked around it. Now might be the time to start thinking for a real solution.

The problem is actually a solution for a different problem.

As you may or may not know, when AAPT builds an application it assigns resource ids to all private resources. Then while the .dex file is built, those resources are referenced with the automated R.java file which is automatically created from those resources. My explanation might be a bit rough, so this stack response does it justice - http://stackoverflow.com/a/9357813/455008

However, with a decoded application we don't have the pleasure of a re-generated R.java file. We have multiple R${type}.smali files which contain the mapping of id to value.

For example, take the first resource in R$id.smali.

.field public static final action0:I = 0x7f0c0068

Then find that resource id in res/values/public.xml.

<public type="id" name="action0" id="0x7f0c0068" />

As you can see, the public.xml file helps keep action0 as 0x7f0c0068. For demo purposes, lets remove the res/values/public.xml file and let AAPT generate its own resource ids. We build this application and leverage aapt to find the resource id.

ibotpeaches@tombstone:~/Desktop/app-release/dist$ aapt d resources app-release.apk | grep 'action0'
      spec resource 0x7f09003a com.example.ibotpeaches.issue1074:id/action0: flags=0x00000000
        resource 0x7f09003a com.example.ibotpeaches.issue1074:id/action0: t=0x12 d=0x00000000 (s=0x0008 r=0x00)

As you can see, the resource id moved from 0x7f0c0068 to 0x7f09003a which would break the application badly.

So our solution is the public.xml file, which maintains those ids. However, at the price of making those resources public. Since a resource that has a static id is not private, even though its on the private (0x7f) package id.

We hit this exact problem before except with the android:authorities attribute in the AndroidManifest.xml file. There seems to be a hidden security requirement to have non-public resources for the reference provided there. This, as your bug report shows is obviously the same requirement for android:scheme.

So yes, we could adapt the same fix I did before (https://github.com/iBotPeaches/Apktool/pull/911/files) here, but its hacky and not clean at all.

I wonder if it might be time to explore automated remapping of resources again. dexlib2 has come out and additionally proved via this pull request (JesusFreke/smali#19) that you can read/modify resource ids easily vs the dexlib1 method of ugly regex.

So the "perfect" fix, might be this.

  1. Decode application recording the resource names and ids (the data in public.xml would suffice).
  2. Rebuild just the resources.arsc, without using public.xml file. Recording the new resource ids.
    2a. Not sure yet how to obtain the new resource ids, short of leveraging aapt or decoding again.
  3. Build classes.dex providing the old (public.xml) and new (some file`) to do the old to new mapping of resources.

This was first attempted years ago (#244) but wasn't possible due to the amount of replacement via regex required. We have dexlib2 now, which probably can be used.

Owner

iBotPeaches commented Dec 7, 2015

Yes, this is quite the can of worms. We have hit this before and hacked around it. Now might be the time to start thinking for a real solution.

The problem is actually a solution for a different problem.

As you may or may not know, when AAPT builds an application it assigns resource ids to all private resources. Then while the .dex file is built, those resources are referenced with the automated R.java file which is automatically created from those resources. My explanation might be a bit rough, so this stack response does it justice - http://stackoverflow.com/a/9357813/455008

However, with a decoded application we don't have the pleasure of a re-generated R.java file. We have multiple R${type}.smali files which contain the mapping of id to value.

For example, take the first resource in R$id.smali.

.field public static final action0:I = 0x7f0c0068

Then find that resource id in res/values/public.xml.

<public type="id" name="action0" id="0x7f0c0068" />

As you can see, the public.xml file helps keep action0 as 0x7f0c0068. For demo purposes, lets remove the res/values/public.xml file and let AAPT generate its own resource ids. We build this application and leverage aapt to find the resource id.

ibotpeaches@tombstone:~/Desktop/app-release/dist$ aapt d resources app-release.apk | grep 'action0'
      spec resource 0x7f09003a com.example.ibotpeaches.issue1074:id/action0: flags=0x00000000
        resource 0x7f09003a com.example.ibotpeaches.issue1074:id/action0: t=0x12 d=0x00000000 (s=0x0008 r=0x00)

As you can see, the resource id moved from 0x7f0c0068 to 0x7f09003a which would break the application badly.

So our solution is the public.xml file, which maintains those ids. However, at the price of making those resources public. Since a resource that has a static id is not private, even though its on the private (0x7f) package id.

We hit this exact problem before except with the android:authorities attribute in the AndroidManifest.xml file. There seems to be a hidden security requirement to have non-public resources for the reference provided there. This, as your bug report shows is obviously the same requirement for android:scheme.

So yes, we could adapt the same fix I did before (https://github.com/iBotPeaches/Apktool/pull/911/files) here, but its hacky and not clean at all.

I wonder if it might be time to explore automated remapping of resources again. dexlib2 has come out and additionally proved via this pull request (JesusFreke/smali#19) that you can read/modify resource ids easily vs the dexlib1 method of ugly regex.

So the "perfect" fix, might be this.

  1. Decode application recording the resource names and ids (the data in public.xml would suffice).
  2. Rebuild just the resources.arsc, without using public.xml file. Recording the new resource ids.
    2a. Not sure yet how to obtain the new resource ids, short of leveraging aapt or decoding again.
  3. Build classes.dex providing the old (public.xml) and new (some file`) to do the old to new mapping of resources.

This was first attempted years ago (#244) but wasn't possible due to the amount of replacement via regex required. We have dexlib2 now, which probably can be used.

@iBotPeaches iBotPeaches added the Accepted label Dec 7, 2015

@ACATTAN

This comment has been minimized.

Show comment
Hide comment
@ACATTAN

ACATTAN Dec 7, 2015

Thank you for the excellent detailed answer! I wasn't aware of the public resource IDs and the fact that some entries in the manifest cannot have a public resource ID.
dexlib2 is indeed an amazing library and easy to use. However I assume that doing the "perfect fix" would require some amount of time, right? Looking at the smali code it looks something like this:

const v3, 0x7f090211
invoke-virtual {v2, v3}, Landroid/content/res/Resources;->getString(I)Ljava/lang/String;

I guess you would need to scan all instructions in all methods and look for the invocation of Resources.getString(int), and then look for a previous instruction moving a const into the register being passed to getString(). This is in order to avoid replacing a totally different ID that might happen to be in the application code for a totally different purpose.
Another small drawback of the "perfect fix" approach is that it will prolong the execution time of the tool.

I must say that the "dirty" fix is not so bad :-). Would it be too much to ask that, until the "perfect fix" is available, to issue a patch that handles android:scheme the same way you handled android:authorities?

And thanks again for your above explanation!
Ariel

ACATTAN commented Dec 7, 2015

Thank you for the excellent detailed answer! I wasn't aware of the public resource IDs and the fact that some entries in the manifest cannot have a public resource ID.
dexlib2 is indeed an amazing library and easy to use. However I assume that doing the "perfect fix" would require some amount of time, right? Looking at the smali code it looks something like this:

const v3, 0x7f090211
invoke-virtual {v2, v3}, Landroid/content/res/Resources;->getString(I)Ljava/lang/String;

I guess you would need to scan all instructions in all methods and look for the invocation of Resources.getString(int), and then look for a previous instruction moving a const into the register being passed to getString(). This is in order to avoid replacing a totally different ID that might happen to be in the application code for a totally different purpose.
Another small drawback of the "perfect fix" approach is that it will prolong the execution time of the tool.

I must say that the "dirty" fix is not so bad :-). Would it be too much to ask that, until the "perfect fix" is available, to issue a patch that handles android:scheme the same way you handled android:authorities?

And thanks again for your above explanation!
Ariel

@iBotPeaches

This comment has been minimized.

Show comment
Hide comment
@iBotPeaches

iBotPeaches Aug 6, 2016

Owner

Sorry this took so long. Thought I was going to do the perfect fix and hook into dexlib, but holding off on all of that until I see how aapt2 and Android Nougat changes things.

So here is before

➜  Bug1097 aapt d xmltree shazam.apk AndroidManifest.xml | grep scheme
            A: android:scheme(0x01010027)="package" (Raw: "package")
            A: android:scheme(0x01010027)=@0x7f08023a
            A: android:scheme(0x01010027)="content" (Raw: "content")
            A: android:scheme(0x01010027)="content" (Raw: "content")
            A: android:scheme(0x01010027)="content" (Raw: "content")
            A: android:scheme(0x01010027)="content" (Raw: "content")
            A: android:scheme(0x01010027)="http" (Raw: "http")
            A: android:scheme(0x01010027)="https" (Raw: "https")
            A: android:scheme(0x01010027)="http" (Raw: "http")
            A: android:scheme(0x01010027)="http" (Raw: "http")
            A: android:scheme(0x01010027)="http" (Raw: "http")
            A: android:scheme(0x01010027)="http" (Raw: "http")
            A: android:scheme(0x01010027)="http" (Raw: "http")
            A: android:scheme(0x01010027)="http" (Raw: "http")
            A: android:scheme(0x01010027)="http" (Raw: "http")
            A: android:scheme(0x01010027)="http" (Raw: "http")
            A: android:scheme(0x01010027)="http" (Raw: "http")
            A: android:scheme(0x01010027)="http" (Raw: "http")
            A: android:scheme(0x01010027)="https" (Raw: "https")
            A: android:scheme(0x01010027)="https" (Raw: "https")
            A: android:scheme(0x01010027)=@0x7f08023a
            A: android:scheme(0x01010027)=@0x7f08023a
            A: android:scheme(0x01010027)=@0x7f08023a
            A: android:scheme(0x01010027)=@0x7f08023a
            A: android:scheme(0x01010027)=@0x7f080238
            A: android:scheme(0x01010027)=@0x7f080238
            A: android:scheme(0x01010027)=@0x7f080238
            A: android:scheme(0x01010027)=@0x7f080238
            A: android:scheme(0x01010027)=@0x7f080238
            A: android:scheme(0x01010027)=@0x7f080238
            A: android:scheme(0x01010027)=@0x7f080238
            A: android:scheme(0x01010027)=@0x7f080238
            A: android:scheme(0x01010027)=@0x7f080238
            A: android:scheme(0x01010027)="https" (Raw: "https")
            A: android:scheme(0x01010027)=@0x7f08023a
            A: android:scheme(0x01010027)=@0x7f080238
            A: android:scheme(0x01010027)=@0x7f080238
            A: android:scheme(0x01010027)="chart" (Raw: "chart")
            A: android:scheme(0x01010027)=@0x7f080238
            A: android:scheme(0x01010027)="content" (Raw: "content")
            A: android:scheme(0x01010027)=@0x7f080238
            A: android:scheme(0x01010027)="videoplayer" (Raw: "videoplayer")
            A: android:scheme(0x01010027)=@0x7f080238
            A: android:scheme(0x01010027)=@0x7f080238
            A: android:scheme(0x01010027)=@0x7f080238
            A: android:scheme(0x01010027)=@0x7f080238
            A: android:scheme(0x01010027)=@0x7f080238
            A: android:scheme(0x01010027)=@0x7f080238
            A: android:scheme(0x01010027)="playlist_chart" (Raw: "playlist_chart")
            A: android:scheme(0x01010027)="playlist_my_tags" (Raw: "playlist_my_tags")
            A: android:scheme(0x01010027)=@0x7f080238
            A: android:scheme(0x01010027)=@0x7f080238
            A: android:scheme(0x01010027)=@0x7f080238
            A: android:scheme(0x01010027)=@0x7f08023a
            A: android:scheme(0x01010027)=@0x7f080238
            A: android:scheme(0x01010027)=@0x7f08023a
            A: android:scheme(0x01010027)=@0x7f080238
            A: android:scheme(0x01010027)=@0x7f080238
            A: android:scheme(0x01010027)=@0x7f080238
            A: android:scheme(0x01010027)="shazaminternal" (Raw: "shazaminternal")
            A: android:scheme(0x01010027)="content" (Raw: "content")
            A: android:scheme(0x01010027)="content" (Raw: "content")
            A: android:scheme(0x01010027)="wear" (Raw: "wear")

Most of the android:schemes are literally text with a few references. The references work because they are private, then apktool makes them public to keep the IDs constant, thus breaking it. So with the included patch, we get the literal value during build, so the above output becomes.

➜  dist aapt d xmltree shazam.apk AndroidManifest.xml | grep scheme
            A: android:scheme(0x01010027)="package" (Raw: "package")
            A: android:scheme(0x01010027)="shazam" (Raw: "shazam")
            A: android:scheme(0x01010027)="content" (Raw: "content")
            A: android:scheme(0x01010027)="content" (Raw: "content")
            A: android:scheme(0x01010027)="content" (Raw: "content")
            A: android:scheme(0x01010027)="content" (Raw: "content")
            A: android:scheme(0x01010027)="http" (Raw: "http")
            A: android:scheme(0x01010027)="https" (Raw: "https")
            A: android:scheme(0x01010027)="http" (Raw: "http")
            A: android:scheme(0x01010027)="http" (Raw: "http")
            A: android:scheme(0x01010027)="http" (Raw: "http")
            A: android:scheme(0x01010027)="http" (Raw: "http")
            A: android:scheme(0x01010027)="http" (Raw: "http")
            A: android:scheme(0x01010027)="http" (Raw: "http")
            A: android:scheme(0x01010027)="http" (Raw: "http")
            A: android:scheme(0x01010027)="http" (Raw: "http")
            A: android:scheme(0x01010027)="http" (Raw: "http")
            A: android:scheme(0x01010027)="http" (Raw: "http")
            A: android:scheme(0x01010027)="https" (Raw: "https")
            A: android:scheme(0x01010027)="https" (Raw: "https")
            A: android:scheme(0x01010027)="shazam" (Raw: "shazam")
            A: android:scheme(0x01010027)="shazam" (Raw: "shazam")
            A: android:scheme(0x01010027)="shazam" (Raw: "shazam")
            A: android:scheme(0x01010027)="shazam" (Raw: "shazam")
            A: android:scheme(0x01010027)="shazam_activity" (Raw: "shazam_activity")
            A: android:scheme(0x01010027)="shazam_activity" (Raw: "shazam_activity")
            A: android:scheme(0x01010027)="shazam_activity" (Raw: "shazam_activity")
            A: android:scheme(0x01010027)="shazam_activity" (Raw: "shazam_activity")
            A: android:scheme(0x01010027)="shazam_activity" (Raw: "shazam_activity")
            A: android:scheme(0x01010027)="shazam_activity" (Raw: "shazam_activity")
            A: android:scheme(0x01010027)="shazam_activity" (Raw: "shazam_activity")
            A: android:scheme(0x01010027)="shazam_activity" (Raw: "shazam_activity")
            A: android:scheme(0x01010027)="shazam_activity" (Raw: "shazam_activity")
            A: android:scheme(0x01010027)="https" (Raw: "https")
            A: android:scheme(0x01010027)="shazam" (Raw: "shazam")
            A: android:scheme(0x01010027)="shazam_activity" (Raw: "shazam_activity")
            A: android:scheme(0x01010027)="shazam_activity" (Raw: "shazam_activity")
            A: android:scheme(0x01010027)="chart" (Raw: "chart")
            A: android:scheme(0x01010027)="shazam_activity" (Raw: "shazam_activity")
            A: android:scheme(0x01010027)="content" (Raw: "content")
            A: android:scheme(0x01010027)="shazam_activity" (Raw: "shazam_activity")
            A: android:scheme(0x01010027)="videoplayer" (Raw: "videoplayer")
            A: android:scheme(0x01010027)="shazam_activity" (Raw: "shazam_activity")
            A: android:scheme(0x01010027)="shazam_activity" (Raw: "shazam_activity")
            A: android:scheme(0x01010027)="shazam_activity" (Raw: "shazam_activity")
            A: android:scheme(0x01010027)="shazam_activity" (Raw: "shazam_activity")
            A: android:scheme(0x01010027)="shazam_activity" (Raw: "shazam_activity")
            A: android:scheme(0x01010027)="shazam_activity" (Raw: "shazam_activity")
            A: android:scheme(0x01010027)="playlist_chart" (Raw: "playlist_chart")
            A: android:scheme(0x01010027)="playlist_my_tags" (Raw: "playlist_my_tags")
            A: android:scheme(0x01010027)="shazam_activity" (Raw: "shazam_activity")
            A: android:scheme(0x01010027)="shazam_activity" (Raw: "shazam_activity")
            A: android:scheme(0x01010027)="shazam_activity" (Raw: "shazam_activity")
            A: android:scheme(0x01010027)="shazam" (Raw: "shazam")
            A: android:scheme(0x01010027)="shazam_activity" (Raw: "shazam_activity")
            A: android:scheme(0x01010027)="shazam" (Raw: "shazam")
            A: android:scheme(0x01010027)="shazam_activity" (Raw: "shazam_activity")
            A: android:scheme(0x01010027)="shazam_activity" (Raw: "shazam_activity")
            A: android:scheme(0x01010027)="shazam_activity" (Raw: "shazam_activity")
            A: android:scheme(0x01010027)="shazaminternal" (Raw: "shazaminternal")
            A: android:scheme(0x01010027)="content" (Raw: "content")
            A: android:scheme(0x01010027)="content" (Raw: "content")
            A: android:scheme(0x01010027)="wear" (Raw: "wear")
Owner

iBotPeaches commented Aug 6, 2016

Sorry this took so long. Thought I was going to do the perfect fix and hook into dexlib, but holding off on all of that until I see how aapt2 and Android Nougat changes things.

So here is before

➜  Bug1097 aapt d xmltree shazam.apk AndroidManifest.xml | grep scheme
            A: android:scheme(0x01010027)="package" (Raw: "package")
            A: android:scheme(0x01010027)=@0x7f08023a
            A: android:scheme(0x01010027)="content" (Raw: "content")
            A: android:scheme(0x01010027)="content" (Raw: "content")
            A: android:scheme(0x01010027)="content" (Raw: "content")
            A: android:scheme(0x01010027)="content" (Raw: "content")
            A: android:scheme(0x01010027)="http" (Raw: "http")
            A: android:scheme(0x01010027)="https" (Raw: "https")
            A: android:scheme(0x01010027)="http" (Raw: "http")
            A: android:scheme(0x01010027)="http" (Raw: "http")
            A: android:scheme(0x01010027)="http" (Raw: "http")
            A: android:scheme(0x01010027)="http" (Raw: "http")
            A: android:scheme(0x01010027)="http" (Raw: "http")
            A: android:scheme(0x01010027)="http" (Raw: "http")
            A: android:scheme(0x01010027)="http" (Raw: "http")
            A: android:scheme(0x01010027)="http" (Raw: "http")
            A: android:scheme(0x01010027)="http" (Raw: "http")
            A: android:scheme(0x01010027)="http" (Raw: "http")
            A: android:scheme(0x01010027)="https" (Raw: "https")
            A: android:scheme(0x01010027)="https" (Raw: "https")
            A: android:scheme(0x01010027)=@0x7f08023a
            A: android:scheme(0x01010027)=@0x7f08023a
            A: android:scheme(0x01010027)=@0x7f08023a
            A: android:scheme(0x01010027)=@0x7f08023a
            A: android:scheme(0x01010027)=@0x7f080238
            A: android:scheme(0x01010027)=@0x7f080238
            A: android:scheme(0x01010027)=@0x7f080238
            A: android:scheme(0x01010027)=@0x7f080238
            A: android:scheme(0x01010027)=@0x7f080238
            A: android:scheme(0x01010027)=@0x7f080238
            A: android:scheme(0x01010027)=@0x7f080238
            A: android:scheme(0x01010027)=@0x7f080238
            A: android:scheme(0x01010027)=@0x7f080238
            A: android:scheme(0x01010027)="https" (Raw: "https")
            A: android:scheme(0x01010027)=@0x7f08023a
            A: android:scheme(0x01010027)=@0x7f080238
            A: android:scheme(0x01010027)=@0x7f080238
            A: android:scheme(0x01010027)="chart" (Raw: "chart")
            A: android:scheme(0x01010027)=@0x7f080238
            A: android:scheme(0x01010027)="content" (Raw: "content")
            A: android:scheme(0x01010027)=@0x7f080238
            A: android:scheme(0x01010027)="videoplayer" (Raw: "videoplayer")
            A: android:scheme(0x01010027)=@0x7f080238
            A: android:scheme(0x01010027)=@0x7f080238
            A: android:scheme(0x01010027)=@0x7f080238
            A: android:scheme(0x01010027)=@0x7f080238
            A: android:scheme(0x01010027)=@0x7f080238
            A: android:scheme(0x01010027)=@0x7f080238
            A: android:scheme(0x01010027)="playlist_chart" (Raw: "playlist_chart")
            A: android:scheme(0x01010027)="playlist_my_tags" (Raw: "playlist_my_tags")
            A: android:scheme(0x01010027)=@0x7f080238
            A: android:scheme(0x01010027)=@0x7f080238
            A: android:scheme(0x01010027)=@0x7f080238
            A: android:scheme(0x01010027)=@0x7f08023a
            A: android:scheme(0x01010027)=@0x7f080238
            A: android:scheme(0x01010027)=@0x7f08023a
            A: android:scheme(0x01010027)=@0x7f080238
            A: android:scheme(0x01010027)=@0x7f080238
            A: android:scheme(0x01010027)=@0x7f080238
            A: android:scheme(0x01010027)="shazaminternal" (Raw: "shazaminternal")
            A: android:scheme(0x01010027)="content" (Raw: "content")
            A: android:scheme(0x01010027)="content" (Raw: "content")
            A: android:scheme(0x01010027)="wear" (Raw: "wear")

Most of the android:schemes are literally text with a few references. The references work because they are private, then apktool makes them public to keep the IDs constant, thus breaking it. So with the included patch, we get the literal value during build, so the above output becomes.

➜  dist aapt d xmltree shazam.apk AndroidManifest.xml | grep scheme
            A: android:scheme(0x01010027)="package" (Raw: "package")
            A: android:scheme(0x01010027)="shazam" (Raw: "shazam")
            A: android:scheme(0x01010027)="content" (Raw: "content")
            A: android:scheme(0x01010027)="content" (Raw: "content")
            A: android:scheme(0x01010027)="content" (Raw: "content")
            A: android:scheme(0x01010027)="content" (Raw: "content")
            A: android:scheme(0x01010027)="http" (Raw: "http")
            A: android:scheme(0x01010027)="https" (Raw: "https")
            A: android:scheme(0x01010027)="http" (Raw: "http")
            A: android:scheme(0x01010027)="http" (Raw: "http")
            A: android:scheme(0x01010027)="http" (Raw: "http")
            A: android:scheme(0x01010027)="http" (Raw: "http")
            A: android:scheme(0x01010027)="http" (Raw: "http")
            A: android:scheme(0x01010027)="http" (Raw: "http")
            A: android:scheme(0x01010027)="http" (Raw: "http")
            A: android:scheme(0x01010027)="http" (Raw: "http")
            A: android:scheme(0x01010027)="http" (Raw: "http")
            A: android:scheme(0x01010027)="http" (Raw: "http")
            A: android:scheme(0x01010027)="https" (Raw: "https")
            A: android:scheme(0x01010027)="https" (Raw: "https")
            A: android:scheme(0x01010027)="shazam" (Raw: "shazam")
            A: android:scheme(0x01010027)="shazam" (Raw: "shazam")
            A: android:scheme(0x01010027)="shazam" (Raw: "shazam")
            A: android:scheme(0x01010027)="shazam" (Raw: "shazam")
            A: android:scheme(0x01010027)="shazam_activity" (Raw: "shazam_activity")
            A: android:scheme(0x01010027)="shazam_activity" (Raw: "shazam_activity")
            A: android:scheme(0x01010027)="shazam_activity" (Raw: "shazam_activity")
            A: android:scheme(0x01010027)="shazam_activity" (Raw: "shazam_activity")
            A: android:scheme(0x01010027)="shazam_activity" (Raw: "shazam_activity")
            A: android:scheme(0x01010027)="shazam_activity" (Raw: "shazam_activity")
            A: android:scheme(0x01010027)="shazam_activity" (Raw: "shazam_activity")
            A: android:scheme(0x01010027)="shazam_activity" (Raw: "shazam_activity")
            A: android:scheme(0x01010027)="shazam_activity" (Raw: "shazam_activity")
            A: android:scheme(0x01010027)="https" (Raw: "https")
            A: android:scheme(0x01010027)="shazam" (Raw: "shazam")
            A: android:scheme(0x01010027)="shazam_activity" (Raw: "shazam_activity")
            A: android:scheme(0x01010027)="shazam_activity" (Raw: "shazam_activity")
            A: android:scheme(0x01010027)="chart" (Raw: "chart")
            A: android:scheme(0x01010027)="shazam_activity" (Raw: "shazam_activity")
            A: android:scheme(0x01010027)="content" (Raw: "content")
            A: android:scheme(0x01010027)="shazam_activity" (Raw: "shazam_activity")
            A: android:scheme(0x01010027)="videoplayer" (Raw: "videoplayer")
            A: android:scheme(0x01010027)="shazam_activity" (Raw: "shazam_activity")
            A: android:scheme(0x01010027)="shazam_activity" (Raw: "shazam_activity")
            A: android:scheme(0x01010027)="shazam_activity" (Raw: "shazam_activity")
            A: android:scheme(0x01010027)="shazam_activity" (Raw: "shazam_activity")
            A: android:scheme(0x01010027)="shazam_activity" (Raw: "shazam_activity")
            A: android:scheme(0x01010027)="shazam_activity" (Raw: "shazam_activity")
            A: android:scheme(0x01010027)="playlist_chart" (Raw: "playlist_chart")
            A: android:scheme(0x01010027)="playlist_my_tags" (Raw: "playlist_my_tags")
            A: android:scheme(0x01010027)="shazam_activity" (Raw: "shazam_activity")
            A: android:scheme(0x01010027)="shazam_activity" (Raw: "shazam_activity")
            A: android:scheme(0x01010027)="shazam_activity" (Raw: "shazam_activity")
            A: android:scheme(0x01010027)="shazam" (Raw: "shazam")
            A: android:scheme(0x01010027)="shazam_activity" (Raw: "shazam_activity")
            A: android:scheme(0x01010027)="shazam" (Raw: "shazam")
            A: android:scheme(0x01010027)="shazam_activity" (Raw: "shazam_activity")
            A: android:scheme(0x01010027)="shazam_activity" (Raw: "shazam_activity")
            A: android:scheme(0x01010027)="shazam_activity" (Raw: "shazam_activity")
            A: android:scheme(0x01010027)="shazaminternal" (Raw: "shazaminternal")
            A: android:scheme(0x01010027)="content" (Raw: "content")
            A: android:scheme(0x01010027)="content" (Raw: "content")
            A: android:scheme(0x01010027)="wear" (Raw: "wear")

@iBotPeaches iBotPeaches added this to the 2.2.0 milestone Aug 6, 2016

@iBotPeaches iBotPeaches self-assigned this Aug 6, 2016

iBotPeaches added a commit that referenced this issue Aug 6, 2016

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment