江戸一番のジャスタウェイ職人のブログ

江戸一番のジャスタウェイ職人

デバッグビルド時だけ Permission Denial: starting Intent が発生するなぁと思ったら確認する事

デバッグビルドとリリースビルドを併用しようと applicationIdSuffix に .debug をつけた頃から設定画面からのアクティビティ呼び出しが失敗するようになった。

デバッグビルドとリリースビルドを併用する為に書いた記述
android {

    // ...

    buildTypes {
        debug {
            applicationIdSuffix ".debug"
        }
}
エラーログ
java.lang.SecurityException: Permission Denial: starting Intent { cmp=info.justaway/.MuteActivity } from ProcessRecord{430cc048 31038:info.justaway.debug/u0a171} (pid=31038, uid=10171) not exported from uid 10167
設定画面からアクティビティを呼び出すための記述
    <PreferenceScreen
        android:key="mute"
        android:title="@string/pref_title_notification">
        <intent
            android:action="android.intent.action.MAIN"
            android:targetPackage="info.justaway"
            android:targetClass="info.justaway.NotificationSettingsActivity"/>
    </PreferenceScreen>

エラーログを見るとどうも動作しているアプリのパッケージが info.justaway.debug なのに android:targetPackage が info.justaway のままなのが原因らしい

面倒だがデバッグ時だけ targetPackage が info.justaway.debug になるように様に書き換え

    <PreferenceScreen
        android:key="mute"
        android:title="@string/pref_title_notification">
        <intent
            android:action="android.intent.action.MAIN"
            android:targetPackage="@string/android_package_name"
            android:targetClass="info.justaway.NotificationSettingsActivity"/>
    </PreferenceScreen>

以下の様な文字列リソースを用意し事なきを得た。

main/res/values/strings.xml
<string name="android_package_name" translatable="false">info.justaway</string>
debug/res/values/strings.xml
<string name="android_package_name" translatable="false">info.justaway.debug</string>

translatable="false" の記述は言語環境でリソースを分けない事を明示する、values-ja/strings.xmlなど対応する言語環境用のリソースを用意している場合、「"values-ja/strings.xml"にも"android_package_name"居るんじゃないですか??」みたいな警告が出てうざい上、記述すると今度はdebug/res/側でもvalues-ja/strings.xmlを用意しないといけなくなるので注意が必要