北京時間2019年3月14日にGoogleが正式にAndroidのQベータ1とプレビューSDK、Androidの開発者は、毎年恒例の適応作業の新しいバージョンでの到来を告げることを約あったという手段を発表しました。な折りたたみなど、多くの新機能を持って、開発者のためのAndroidのQ オーバーレイ画面強化アイテム、新しいネットワーク接続API、新しいメディアデコーダ、カメラ、新機能、NNAPI展開、バルカン1.1グラフィックスがサポートする というように。
1.追加の権限
<用途許可は、Android:名前= "android.permission.ACCESS_BACKGROUND_LOCATIONが" />
<用途許可は、Android:名= "android.permission.READ_PRIVILEGED_PHONE_STATE" />
<用途許可は、Android:名= "android.permission.CAMERA" / >
<用途許可アンドロイド:名=「QRアプリケーション」/>
2. [変更コンパイルされたバージョンとターゲットバージョン
compileSdkVersion 29(28+)
targetSdkVersion 29(28+)
3. [パーミッションの問題アルバム画像
次のラベルのアプリケーションを追加します。
アンドロイド:requestLegacyExternalStorage =「true」を
4.取得フォルダのパス
文字列関数savepath = Environment.getExternalStorageDirectory()+「/ DownFile /」。
上記方法は、そうでなければ失敗する取得下記置換される
文字列関数savepath = getExternalCacheDirを()+「 / DownFile /」。
5. AndroidのQの動作の変更:すべてのアプリケーション
ユーザーのプライバシー権の変更を更新することで、最大そのうち紹介するすべてのアプリケーション、これは大規模で重要なの一部であるため、:行動Qの変化とは無関係に、これらの文書の公式な一部。以下のように変更に特定の権限は以下のとおりです。
技量 | 影響を受けるアプリケーション | (影響力の球)を有効にする方法 |
---|---|---|
ストレージ権 | アプリケーションへのアクセスや共有外部ストレージデバイスファイル | ADBシェルのSMセット孤立ストレージ(後述)に |
ポジショニング権 | バックグラウンドのアプリケーションのアクセスユーザの位置情報要求 | AndroidのQ上のこのアクセス許可ポリシーは常に有効になっています |
活動が背景から始まりました | これは、活動のアプリケーションを起動するユーザーの操作を必要としません。 | 閉じるシステムが限界まで開発を可能にするために、バックグラウンド活性のオプションを実行することができます |
デバイス識別子(デバイスID) | アクセス機器のシリアル番号またはIMEIアプリケーション | デバイスのアプリケーションは、実装のAndroid Qに取り付けられました |
ワイヤレススキャン権限 | BluetoothのAPIと使用してWLAN APIアプリケーション | ターゲットプラットフォーム用のAndroid Qと |
します。https://developer.android.com/preview/privacy/background-activity-少ない変化が背景2つの権限からのスタート活動の許可及び無線スキャン許可に影響を与え、この記事では、あなたは、公式ドキュメントを参照してください詳細を表示することができません説明します開始するには
(例えば、マイクロチャネル着陸許可など)活性を開始する唯一の状況で、ユーザとの対話の背景変化から活動許可を開始します。
この記事では、ストレージ権利、権限と変化と適応位置決めデバイス識別子3つの許可に焦点を当てます。
外部記憶装置にAndroidのQは、各アプリケーションの「サンドボックス分離ストレージ」(例えば、/ SDカード)を提供します。他のアプリケーションは、直接サンドボックスファイル、アプリケーションにアクセスすることはできません。あなたがアクセスするすべての権限を必要とし、外部記憶装置にそのファイルを保存しないようにファイルので、プライベートファイルのアプリケーションです。この変更は、それが簡単にユーザーファイルのプライバシーを確保するために行い、アプリケーションで必要なアクセス許可の数を減らすことができますされます。
Googleの公式に推奨されるアプリケーションファイルは、用のアドレスサンドボックスに保存されContext.getExternalFilesDir()
たフォルダ内のファイル。例えば、画像を格納することが配置されるべきContext.getExternalFilesDir(Environment.DIRECTORY_PICTURES)
です。
ターゲットファイルのアドレスの次は、アクセス適応する方法について説明します:
-
あなたのファイルアクセス:きめ細かいメディア固有の権限を持つQを交換し、キャンセル
READ_EXTERNAL_STORAGE
やWRITE_EXTERNAL_STORAGE
権限、およびアプリケーションがサンドボックスに自分のファイルにアクセスすることができ、権限付与の必要はありません。 -
システムのメディアファイルへのアクセス:あなたがサンドボックス外のファイルを共有メディアにアクセスしたい場合は、Qは、などの写真、音楽、ビデオ、など、新しいメディア権を申請する必要があると、メディアファイルの共有セットの新しい定義が導入されています
READ_MEDIA_IMAGES
、READ_MEDIA_VIDEO
、READ_MEDIA_AUDIO
、同じを適用します元店舗の権限。 -
ファイルシステムへのアクセスをダウンロード:ダウンロードフォルダシステムへのアクセスを、一時的な制限は、しかし、アクセス他のアプリケーションでどのファイルに、システムは、ユーザーがアプリケーションファイルを選択するために、ファイル選択を使用できるようにする必要がありません。
-
アクセス他のアプリケーションは、ファイルをサンドボックス化:アプリケーションが他のアプリケーションを使用してファイルをクリックして、サンドボックス内の他のアプリケーションで作成したファイルを使用する必要がある場合は、この記事では説明しません。
だから、アプリケーションがQプラットフォーム上で実行されてください裁判官は、2つのREAD_EXTERNAL_STORAGEとWRITE_EXTERNAL_STORAGE許可の申請を取り消します。また、新しいメディア固有のアクセス許可で置き換えます。
以下の各条件が満たされた場合、オープン互換モード、すなわち、記憶装置を開けないが許可Qを変化させます。
- アプリケーションtargetSDK <= P.
- AndroidのPにインストールされたアプリケーションは、Android Qデバイスからアップグレードします。
(更新)を再インストールするために適用される場合、ありませんストア権限の変更が有効になり、互換モードを再び開きます。
したがって、公式文書によると、ストレージアダプタを変更する許可を申請しなければなりません、かどうかに関係なくtargetSDK Qの、と述べました。
テストではtargetSDK <= Pは、古い右Q Beat1版の2つのアプリケーションが自動的つの新しい権限を適用するように変更する場合、アプリケーションは、通常の使用には影響しませんが、targetSDK == Q、アプリケーションが古い権利を失敗したときにアプリケーションの通常の使用に影響を与えます。
ユーザーに位置情報へのアプリケーションのアクセスをより細かく制御するには、AndroidのQは、新しい場所の許可を紹介します ACCESS_BACKGROUND_LOCATION
。
既存 ACCESS_FINE_LOCATION
および ACCESS_COARSE_LOCATION
権限、新しい権限は、バックグラウンドで実行中のアプリケーションの位置情報へのアクセスに影響します。アクティビティ・アプリケーションは、可視またはアプリケーションがフロントを実行していない限り、そうでなければ、アプリケーションは、バックグラウンドで考えます。
iOSのシステムと同様に、Qも追加背景場所当局は、ACCESS_BACKGROUND_LOCATION
アプリケーションがバックグラウンドで(例えば滴など)、ユーザーの場所を得るために必要とされている場合、あなたは動的に適用する必要がACCESS_BACKGROUND_LOCATION
アクセスします。
それが必要とされない場合はもちろん、何も変更せずにアプリケーション、およびGoogleがtargetSDKの用途に応じて異なる処理を行います。
targetSDK <= Pアプリケーションを要求場合ACCESS_FINE_LOCATION
や ACCESS_COARSE_LOCATION
許可は、Qデバイスは自動的にあなたが適用するのに役立ちますACCESS_BACKGROUND_LOCATION
許可。
AndroidのQの起動、アプリケーションが持っている必要があります READ_PRIVILEGED_PHONE_STATE
(IMEIとシリアル番号が含まれている)デバイスにアクセスするための署名権限をリセット不可能識別子を。
あなたのこの権限のないアプリケーションが、あなたはまだ識別子情報を照会しようとする場合は、NULL値またはエラーを返します。
デバイス固有の識別子は、特別な注意が必要である、オリジナルのREAD_PHONE_STATE
権限はIMEIとシリアルを得ることができませんでした。
デバイスID Q上の次のコードを使用してデバイスを得るために
((TelephonyManager)getActivity().getSystemService(Context.TELEPHONY_SERVICE)).getDeviceId()
- 1
上記のコードは、ヌル値(targetSDK <= P)またはエラー(targetSDK == Q)を返すために実行されます。そして、関係者は語っREAD_PRIVILEGED_PHONE_STATE
許可がシステムアプリなので、この方法ではない作品にのみ使用可能です。
Googleの関係者は機器固有IDのベストプラクティスを与えたが、変数ID与えられたこの方法は、特定の特定のニーズに合わせて解決することができます。この記事では、実質的に一定で再現方法UUIDを与えます:
public static String getUUID() {
String serial = null;
String m_szDevIDShort = "35" +
Build.BOARD.length() % 10 + Build.BRAND.length() % 10 +
Build.CPU_ABI.length() % 10 + Build.DEVICE.length() % 10 +
Build.DISPLAY.length() % 10 + Build.HOST.length() % 10 +
Build.ID.length() % 10 + Build.MANUFACTURER.length() % 10 +
Build.MODEL.length() % 10 + Build.PRODUCT.length() % 10 +
Build.TAGS.length() % 10 + Build.TYPE.length() % 10 +
Build.USER.length() % 10; //13 位
try {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
serial = android.os.Build.getSerial();
} else {
serial = Build.SERIAL;
}
//API>=9 使用serial号
return new UUID(m_szDevIDShort.hashCode(), serial.hashCode()).toString();
} catch (Exception exception) {
//serial需要一个初始化
serial = "serial"; // 随便一个初始化
}
//使用硬件信息拼凑出来的15位号码
return new UUID(m_szDevIDShort.hashCode(), serial.hashCode()).toString();
}
変更は)(一意の識別子機関android.os.Build.getSerialにつながるものの、未知返しますが、戦いはm_szDevIDShortハードウェア情報outが、あるので、そう、まだ独自性と耐久性UUIDを確認してください。
次のようにテスト出力結果であります
上記の方法は、そのようなandroidIDなどの他のプログラムとオンラインだけでなく、繰り返してもよいときとまったく同じでテストされていますが、androidIDが考えるには二つの方法のどちらかを選択するので、多くの、上の理由により、ヌルモデルを返す場合があります。デバイスIDのバージョンを取得する良い方法の歓迎があることがあれば、バージョンよりも厳しいです。
AndroidのQ、アンドロイド6.0(APIレベル23)を持つユーザーが最初に実行する任意のアプリケーション・ターゲット・プラットフォームの次のバージョンでは、Androidプラットフォームは、ユーザーに警告を発行します。
アプリケーションがアクセス権を付与するユーザーを必要とする場合は、システムが最初にこのアプリケーションを許可すると、最初に実行される前にアプリケーションのアクセス許可を調整する機会をユーザーに提供します。
6. AndroidのQの動作の変更:ターゲット・プラットフォーム・アプリケーションのためのAndroidのQ
非限定的なインターフェースのSDKはAndroidのP、Qに提案され、しかし、インターフェースは大きな変化の分類に制限されています。
安定性とアプリケーションの互換性を確保するためには、Androidプラットフォームは、アプリケーションがAndroidの9中で非SDK(APIレベル28)インタフェースを使用することができます制限し始めました。SDKインターフェイスリストが更新AndroidのQを含んでいる非制限(内部テストと開発者とAndroidの間で最新のコラボレーションに基づきます)。
SDKには、このようなプライベートメソッドとして、SDKでいくつかのプライベートメソッドであるインターフェース、あなたはJavaリフレクションなどで呼び出しを得る非限定的な、コールは、対象となります> = Pまたはターゲット> = Qは、デバイス上での使用に限定されていますあなたはこれらのメソッドを使用するとき、私たちは文句を言うでしょう
取得方法 | エラーメッセージ |
---|---|
フィールドを参照のDalvik命令 | NoSuchFieldError投げ |
方法を参照のDalvik命令 | NoSuchMethodError投げ |
Class.getDeclaredField()またはClass.getField介して反射() | ないNoSuchFieldExceptionがスロー |
Class.getDeclaredMethod()、Class.getMethod()を介して反射 | ないNoSuchMethodExceptionがスロー |
Class.getDeclaredFields()、Class.getFields介して反射() | 結果における非SDKのメンバーではありません |
Class.getDeclaredMethods()、Class.getMethods介して反射() | 結果における非SDKのメンバーではありません |
env-> GetFieldID経由JNI() | NULLが返され、NoSuchFieldError投げ |
env-> GetMethodIDメソッドを介したJNI() | NULLが返され、NoSuchMethodError投げ |
あなたのアプリケーションが非SDKインターフェイスを使用するかどうかわからない場合、あなたは確認するためにアプリケーションをテストすることができます。あなたは非SDKインターフェイスを呼び出すと同様のアクセス隠されたXXXログになります。
Accessing hidden field Landroid/os/Message;->flags:I (light greylist, JNI)
- 1
しかし、最終的にこれらのメソッドの使用は、コードに依存していると見てログを検討大きなプロジェクトは、Googleの公式もどこ非SDKインターフェイスの使用のapkを検出するために使用される公式インスペクタveridexを提供し、確かに現実的ではありません。veridexダウンロード:https://android.googlesource.com/platform/prebuilts/runtime/+/master/appcompat
Windows、Linux、およびMac版を含め、対応するダウンロード。./appcompat.sh --dexファイル= Q.apk自動的にスキャンを使用してディレクトリveridex線CDに抽出する必要があります。Q.apkパッケージの絶対パス、パッケージと同じディレクトリに直接ファイル名を入力veridexパッケージの場合。スキャン結果は、2つの部分に分け、非呼び出しインタフェースの一部は、位置、非SDKインターフェイス統計の数の他の一部をSDK。
アプリケーションが非SDKインターフェイスに依存している場合は、代わりのSDKへの移行を計画して開始する必要があります。あなたは非SDKインターフェイスを使用すると、アプリケーションの機能であるに代わるものを見つけることができない場合は、新しいパブリックAPIを要求しなければなりません。
公式要件targetSDK> = Pアプリケーションこれらのメソッドを使用していない、と、Googleには適用できない場合は、これらの非パブリックAPIのSDKのインタフェースに他の選択肢を探すために、要求の新しいパブリックAPI:https://で開発。 android.com/distribute/best-practices/develop/restrictions-non-sdk-interfaces#feature-request
高確率に非SDKインターフェイスを使用して、2つのプロジェクトがあります。
- カスタムビューは、プロセスに反映するパラメータを変更するために便宜的に使用されます。
- 非パーティSDK SDKインターフェイス(複数のこのような場合)の使用。
最初は、すべての後、私たち自身のコードを書くことで、優れたソリューションです。二三者SDKの最新バージョンにアップデートのみに頭痛、または銀行(適応仕事の全体のプロセスのも最大の一部)を介して、作業指示を言及。
7. Androidのアップグレードプロジェクトに発生した問題
- x86のにコンパイルするので、ライブラリのソースコードを探します
- あなたが特定のライブラリ関数をブロックしたり、テストをスキップすることができるようにライブラリだけで、特徴点、上は大きな全体的な影響のAPPを使用するようであれば
- ライブラリがあるので、コアライブラリプロジェクトがロードされなければならない場合は、また、上記のGoogleの自身の息子のQのバージョンがある、テンセントクラウドを用いて測定することができます。テンセントクラウド測定はADB接続するリモートデバッグ機能(私は成功していない)を持っています。ADB ROMが問題で、直接雲がログを見て直接測定することができる、ライン上に設置されていません。
- 私は間も古い、研究ので、理論的にはそれがV7のx86エミュレータコンパイルされたライブラリにインストールすることができますが、フーディーニに比較的小さい導入によるフーディーニしようとしたとして、我々は時間が十分でない提案し、その後、勉強しません。
開発プラットフォームのQが必要ですが、これはリリースプラットフォームです。
targetSDK == QアプリケーションのみQデバイス上で実行することができますのでQは、現在プレビュー版によるものです。
INSTALL_FAILED_INVALID_APK:ネイティブライブラリの抽出に失敗しました、RES = -2
HTTPS://issuetracker.google.com/issues/37045367見られる特定の理由に起因するパッケージ化ライブラリように、このエラーは、圧縮に起因する
のAndroidManifest.xmlノードのアプリケーションに参加は、android:extractNativeLibs="true"
アプリケーションで、コードの上か追加されていてもよいです/ defaultConfigノードはbuild.gradleの下に追加され
packagingOptions{
doNotStrip "/armeabi/.so" doNotStrip "/armeabi-v7a/.so" doNotStrip "/x86/.so" }
- 1
- 2
クラス「org.apache.http.client.methods.HttpPost」を見つけられませんでした
アプリケーションノードのAndroidManifest.xmlに追加されました
<uses-library android:name="org.apache.http.legacy" android:required="false"/>
- 1
あなたのプロジェクトがアンドロイドOまたはP経由収まらない場合は、注意を払う必要があります
アンドロイドOは(自動的にアプリケーション内で影響力のある更新)インストールされたアプリケーションの読み取り権限を
デフォルトではPがAPIへのアクセスを禁止します。httpアンドロイド
この記事の文書:
AndroidのQベータ版開発者用ドキュメントリンク:: https://developer.android.com/preview
AndroidのQベータ版ミラーのダウンロードリンク:https://developer.android.com/preview/download
AndroidのQベータ发布ブログ:https://android-developers.googleblog.com/2019/03/introducing-android-q-beta.html
非SDKインタフェース:https://juejin.im/post/5afe50eef265da0b70262463