13
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

AndroidP対応をしたので、そこで出た影響まとめ

Posted at

最初に行うこと

  1. buildSDKVersion/targetSdkVersionを28にあげる
  2. supportLibraryを最新版にする
    最新版はmaven参照
    (https://mvnrepository.com/artifact/com.android.support/support-v4)
  3. ビルドをかける

以下、対応内容

Canvasクラス周り

以下の変数が使えなくなっている

Canvas.HAS_ALPHA_LAYER_SAVE_FLAG
Canvas.FULL_COLOR_LAYER_SAVE_FLAG

原因

@removedされているから(おそらく、Api27~28から)
基本的には
Canvas.ALL_SAVE_FLAGを使え!とのこと

また、

Canvas.saveLayer(@Nullable RectF bounds, @Nullable Paint paint, @Saveflags int saveFlags);

がApi26からdeplicatedなので、

Canvas.saveLayer(@Nullable RectF bounds, @Nullable Paint paint);

こっちに変更。


古いOSSの突然の死

(使ってるこっちが悪いんですが・・・)
こういうLogで落ちる()

java.lang.NoClassDefFoundError: Failed resolution of: Lorg/apache/http/ProtocolVersion;

原因

Google曰く(https://developer.android.com/about/versions/pie/android-9.0-changes-all#apache-nonp)

Apache HTTP client deprecation affects apps with non-standard ClassLoader
With Android 6.0, we removed support for the Apache HTTP client. This change has no effect on the great majority of apps that do not target Android 9 or higher. However, the change can affect certain apps that use a nonstandard ClassLoader structure, even if the apps do not target Android 9 or higher.

An app can be affected if it uses a non-standard ClassLoader that explicitly delegates to the system ClassLoader. These apps need to delegate to the app ClassLoader instead when looking for classes in org.apache.http.*. If they delegate to the system ClassLoader, the apps will fail on Android 9 or higher with a NoClassDefFoundError, because those classes are no longer known to the system ClassLoader. To prevent similar problems in the future, apps should in general load classes through the app ClassLoader rather than accessing the system ClassLoader directly.

↓Google先生曰く(翻訳)↓

Android 6.0では、Apache HTTPクライアントのサポートを削除しました。 この変更は、Android 9以降をターゲットとしていない大部分のアプリには影響しません。 ただし、Android 9以降をターゲットにしていないアプリであっても、非標準ClassLoader構造を使用する特定のアプリに影響を与える可能性があります。

システムClassLoaderに明示的に委譲する非標準ClassLoaderを使用すると、アプリケーションに影響を与えることがあります。 これらのアプリはorg.apache.http。*のクラスを探すときにアプリClassLoaderに委譲する必要があります。 彼らがシステムClassLoaderに委任すれば、NoClassDefFoundErrorを使ってAndroid 9以降でアプリケーションは失敗します。なぜなら、それらのクラスはもはやシステムのClassLoaderに知られていないからです。 将来的に同様の問題が発生するのを防ぐため、アプリはClassLoaderシステムに直接アクセスするのではなく、アプリClassLoaderを介してクラスをロードする必要があります。

原因の詳細
  • おそらくClassLoaderを継承した、NewWoarkClassLoaderをアプリに委譲させないで(OSSが勝手に)使ったのが原因。
  • ちなみに他にも色々候補となるものがある  
  • Google公式(Class説明)

https://developer.android.com/reference/java/lang/ClassLoader

  • classLoaderとは

https://www.symmetric.co.jp/blog/archives/106

解決方法

AndroirManifest.xmlapplicationタグ内に以下を追加

<uses-library android:name="org.apache.http.legacy"/>

HTTP通信の無効化

http通信をしているところが、通信エラーになっていた。
こんなエラーが出力される

java.io.IOException: Cleartext HTTP traffic (ドメイン)

端的に言うとATSみたいな対応が必要だった。

原因

http通信してるものに対して接続許可する設定を行なっていなかった

対処方法

  1. res/xmlに接続を許可するドメインを指定したxmlを配置する
  2. AndroidManifest.xmlapplicationタグでandroid:networkSecurityConfig="@xml/1のxml名"を設定する
ドメイン指定のやり方
  • 別々に指定する
<?xml version="1.0" encoding="utf-8"?>
<!-- http通信を許可するドメインリスト -->
<network-security-config>
    <domain-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">接続許可するドメイン</domain>
    </domain-config>
</network-security-config>
  • 一括指定する
<?xml version="1.0" encoding="utf-8"?>
<!-- http通信を許可するドメインリスト -->
<network-security-config>
    <base-config cleartextTrafficPermitted="true" />
</network-security-config>

参考記事


フォアグラウンドサービスのcrash

ローカル通知でcrash発生

Caused by: java.lang.SecurityException: Permission Denial: startForeground from pid=27952, uid=10244 requires android.permission.FOREGROUND_SERVICE
        at android.os.Parcel.createException(Parcel.java:1961)
        at android.os.Parcel.readException(Parcel.java:1927)
        at android.os.Parcel.readException(Parcel.java:1877)
        at android.app.IActivityManager$Stub$Proxy.setServiceForeground(IActivityManager.java:5198)
        at android.app.Service.startForeground(Service.java:695)

原因

パーミッションを指定しないで、startForegroundしていたのが原因

解決方法

AndroidManifest.xmlmanifestタブ内に以下のパーミッションの追加

<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>

crash対応

Googleさんが治してくれなかったので・・・(期待してたのに(´・ω・`))

現象

Activityに対して、themeswindowIsTranslucenttrueにしてる時、以下の条件でcrashする

  • Android8.0
  • 回転に関わるメソッドを呼び出す。setRequestedOrientation等(ただ、透明処理が悪いかも)
  • targetSDK27以上

原因

わかりません。ちなみに8.0限定で8.1以降の端末は発生しない

対処方法

  • windowIsTranslucentを使用しない
  • 透過が消えちゃうので、背景色に白でもいれる

以上となります。

もっと色々調べれば粗がたくさん出そうだけど・・・調査した結果としてはこのあたりの問題がでました。

13
8
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?