As my apk is generated I execute the command aapt dump badging
on it. I keep receiving the following error:
application: label='Name' icon='res/drawable/icon_128x128.png'
application-debuggable launchable-activity: name='co.package.name.MainActivity' label='Name' icon='' ERROR getting 'android:name' attribute: attribute is not a string value
I've tried to add a label name for all activities and remove all other values-xxx folders under /res but in vain. However, if I create a whole new project and generate a new APK, the APK can be executed with the aapt dump badging
command successfully.
I compared the printed message of both APK and found a main difference:
Message of Success apk:
application-label:'AppLabel'
application-icon-160:'res/drawable-xhdpi/icon_128x128.png'
application-icon-240:'res/drawable-xhdpi/icon_128x128.png'
application-icon-320:'res/drawable-xhdpi/icon_128x128.png'
application: label='AppLabel' icon='res/drawable-xhdpi/icon_128x128.png'
application-debuggable
launchable-activity: name='com.demo.testApp.MainActivity' label='' icon='
Message of Failed apk:
application-label:'MyApp'
application-label-ja:'MyApp'
application-label-de:'MyApp'
application-label-he:'MyApp'
application-label-zh:'MyApp'
application-label-fi:'MyApp'
application-label-nl:'MyApp'
..
.. (all languages would be attached, and finally the error occurs)
..
application: label='MyApp' icon='res/drawable/icon_128x128.png'
application-debuggable
launchable-activity: name='com.name.myapp.MainActivity' label='MyApp' icon=''
ERROR getting 'android:name' attribute: attribute is not a string value
----- Edit ------
I found there's no relevance to "Language" issue. I modified my Manifest file and make sure there is no such "application-label-XX" printed out, and the error is still the same.
Below is my Manifest file
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="co.package.name"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="17" />
<supports-screens android:anyDensity="true" />
<uses-permission android:name="android.permission.SEND_SMS" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<!-- Location -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<!-- Camera -->
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-feature
android:name="android.hardware.camera"
android:required="true" />
<uses-feature
android:name="android.hardware.camera.front"
android:required="false" />
<uses-feature
android:name="android.hardware.camera.autofocus"
android:required="false" />
<!-- GCM Necessary -->
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<permission
android:name="co.package.name.permission.C2D_MESSAGE"
android:protectionLevel="signature" />
<uses-permission android:name="co.package.name.permission.C2D_MESSAGE" />
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<!-- Calendar R/W -->
<uses-permission android:name="android.permission.READ_CALENDAR" />
<uses-permission android:name="android.permission.WRITE_CALENDAR" />
<application
android:allowBackup="true"
android:icon="@drawable/icon_128x128"
android:label="@string/app_name"
>
<!-- GCM meta-data -->
<meta-data
android:name="com.arrownock.push.SERVICE_TYPE"
android:value="GCM" />
<meta-data
android:name="com.arrownock.push.gcm.SENDER_ID"
android:value="@string/gcm_project_id" />
<meta-data
android:name="com.arrownock.push.APP_KEY"
android:value="@string/light_appkey" />
<meta-data
android:name="com.facebook.sdk.ApplicationId"
android:value="@string/fb_id" />
<activity
android:name=".Main"
android:launchMode="singleTask"
android:screenOrientation="portrait"
android:theme="@android:style/Theme.NoTitleBar.Fullscreen" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name="co.package.name.SplashHP"
android:screenOrientation="portrait"
android:theme="@android:style/Theme.NoTitleBar.Fullscreen" >
</activity>
<activity
android:name="co.package.name.SettingsHP"
android:screenOrientation="portrait"
android:theme="@android:style/Theme.NoTitleBar.Fullscreen" >
<intent-filter>
<action android:name="android.intent.action.DEFAULT" />
</intent-filter>
</activity>
<activity
android:name="co.package.name.LocationSelect"
android:screenOrientation="portrait"
android:theme="@android:style/Theme.NoTitleBar.Fullscreen" >
<intent-filter>
<action android:name="android.intent.action.DEFAULT" />
</intent-filter>
</activity>
<activity
android:name="co.package.name.SettingOptionAlarm"
android:screenOrientation="portrait"
android:theme="@android:style/Theme.NoTitleBar.Fullscreen" >
</activity>
<activity
android:name="co.package.name.SettingOptionNotify"
android:screenOrientation="portrait"
android:theme="@android:style/Theme.NoTitleBar.Fullscreen" >
</activity>
<activity
android:name="co.package.name.SettingOptionShare"
android:launchMode="singleTask"
android:screenOrientation="portrait"
android:theme="@android:style/Theme.NoTitleBar.Fullscreen" >
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data
android:host="settingshare"
android:scheme="oauth" />
</intent-filter>
</activity>
<activity
android:name="co.package.name.HpCalendar"
android:screenOrientation="portrait"
android:theme="@android:style/Theme.NoTitleBar.Fullscreen" >
</activity>
<activity
android:name="co.package.name.SMSList"
android:screenOrientation="portrait"
android:theme="@android:style/Theme.NoTitleBar.Fullscreen" >
</activity>
<activity
android:name="co.package.name.SMSEditor"
android:screenOrientation="portrait"
android:theme="@android:style/Theme.NoTitleBar.Fullscreen" >
</activity>
<activity
android:name="co.package.name.SMSChooseToSend"
android:screenOrientation="portrait"
android:theme="@android:style/Theme.NoTitleBar.Fullscreen" >
</activity>
<activity
android:name="co.package.name.ShareToFB"
android:screenOrientation="portrait"
android:theme="@android:style/Theme.NoTitleBar.Fullscreen" >
</activity>
<activity
android:name="co.package.name.ActPOI"
android:screenOrientation="portrait"
android:theme="@android:style/Theme.NoTitleBar.Fullscreen" >
</activity>
<activity
android:name="com.facebook.LoginActivity"
android:screenOrientation="portrait"
android:theme="@android:style/Theme.NoTitleBar.Fullscreen" >
</activity>
<activity
android:name="co.package.name.LogInOutFB"
android:screenOrientation="portrait"
android:theme="@android:style/Theme.NoTitleBar.Fullscreen" >
</activity>
<activity
android:name="co.package.name.LoginTwitter"
android:launchMode="singleTask"
android:screenOrientation="portrait"
android:theme="@android:style/Theme.NoTitleBar.Fullscreen" >
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data
android:host="t4jsample"
android:scheme="oauth" />
</intent-filter>
</activity>
<receiver
android:name="co.package.name.AlarmReceiver"
android:exported="true" >
<intent-filter>
<action android:name="@string/action_alarm" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</receiver>
<!-- GCM Service -->
<receiver
android:name="com.arrownock.push.AnPushGCMReceiver"
android:permission="com.google.android.c2dm.permission.SEND" >
<intent-filter>
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
<action android:name="com.google.android.c2dm.intent.REGISTRATION" />
<category android:name="co.package.name" />
</intent-filter>
</receiver>
<service android:name="com.arrownock.push.GCMIntentService" />
<receiver
android:name="co.package.name.ExtendedReceiver"
android:exported="true"
android:icon="@drawable/icon_128x128"
android:label="Receiver" >
<intent-filter>
<action android:name="com.arrownock.push.PushService.MSG_ARRIVAL" />
</intent-filter>
</receiver>
</application>
</manifest>
Maybe there's a wrong format or typo in my Manifest file?
------ Edit ----
I also consider maybe it's a issue of decoding. In my environment I use utf-8. Maybe something is wrong within the build process of transforming XML to binary file?
If there's anything unreasonable suspect on above I sincerely apologize. I've stuck on this issue three days and really can't reach a progress. Tried a lot of things and the error is always the same. Any suggestion or comment would be really appreciated.
Do you mean this may also be caused by a broken aapt tool?
Sure. The Android tools have had plenty of bugs, historically, and there's no reason to assume that aapt dump badging
is somehow perfect. In fact, your very issue has already been filed as a bug. So, unless you are also seeing some problem in your app's execution that might be tied in here, I'd assume that aapt dump badging
is the item with the issue, not necessarily your app.
If you have not yet updated to the R22 tools, you might do so, to see if this bug has been fixed and they simply have not closed the issue. If you are on the R22 tools, you might add a comment to that issue, pointing this out, and include a link to this SO question, so the tools team has another data point in terms of the problem.
Same story here. I got this message when I uploaded a working apk to google play. I was able to reproduce it with the aapt command (in ...\android-sdk\platform-tools). It turned out to be a String resource in the name for an intent filter, and was fixed by hard coding it.
It would have taken me a loooooong time to debug this without this answer :)
If you are using Gradle and you want your substitution to be based on one of your build flavors, you can use a custom substitution string instead of using Android @string references. (http://tools.android.com/tech-docs/new-build-system/user-guide/manifest-merger#TOC-Placeholder-support)
In your build.gradle file, define a value for each build flavor in a "manifestPlaceholders" section:
productFlavors {
pro {
manifestPlaceholders = [
proFreeString:"my.pro.string"
]
}
free {
manifestPlaceholders = [
proFreeString:"my.free.string"
]
}
}
Then you can use "proFreeString" as a substitution in your Manifest file:
<intent-filter>
<action android:name="com.foo.${proFreeString}.ACTION_1" />
</intent-filter>
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With