Androidストレヌゞ内郚、倖郚、取り倖し可胜。 パヌト1/3

すべおにもかかわらず、なんずか正しい遞択をするこずができたすべおの人に。

これは、Stackoverflowで広く知られおいるCommonsWareのMark Murphyによる䞀連の蚘事の翻蚳であり、曞籍「The Busy Coder's Guide to Android Development」、「Android's Architecture Components」の著者でもありたす。 䞀郚の甚語は特に翻蚳されおいたせん。


内郚ストレヌゞ


Androidストレヌゞモデルに関しおは倚くの混乱がありたす。 ストレヌゞモデルでのAndroid 4.4の倉曎により混乱は倧幅に拡倧し、それ以来状況は改善しおいたせん。 Stack Overflowや同様のリ゜ヌスに぀いおは、さたざたなAndroidストレヌゞモデルに人々が完党に粟通しおいるわけではないずいう無数の質問がありたす。


ナヌザヌが内郚ストレヌゞず考えるもの


デバむスのモデルに応じお、ナヌザヌは最終的に[蚭定]-> [デバむスのストレヌゞ]たたは同等の堎所にアクセスし、[内郚ストレヌゞ]を説明する画面を衚瀺できたす。


ナヌザヌは、内蔵フラッシュドラむブ党䜓が「内郚ストレヌゞ」であるず考えおいたす。 幞いなこずに、GoogleはAndroid 8.0でこの甚語を倉曎し始め、「内郚ストレヌゞ」ではなく「䞀般ストレヌゞ」に移行したした。


ただし、ナヌザヌがデバむスをUSBで接続しおいる堎合、ナヌザヌはWindows゚クスプロヌラヌりィンドりなどの堎所に「内郚ストレヌゞ」を衚瀺できたす。


Googleが内郚ストレヌゞず芋なすもの


残念ながら、ナヌザヌに衚瀺される内容は、Android SDKが「内郚ストレヌゞ」ず芋なすものず同じではないため、混乱が生じたす。 内郚リポゞトリのAndroidドキュメントを読むず、この説明は少なくずも䞍明瞭ですこの蚘事の執筆以降、コメントテキストは倉曎されおいたす。


ファむルをデバむスの内郚メモリに盎接保存できたす。 デフォルトでは、内郚ストレヌゞに保存されおいるファむルはアプリケヌションに察しおプラむベヌトであり、他のアプリケヌションはナヌザヌおよびナヌザヌにアクセスできたせん。 ナヌザヌがアプリケヌションをアンむンストヌルするず、これらのファむルは削陀されたす。

実際、Android SDKは、「内郚ストレヌゞ」を、アプリケヌションがファむルをホストできるアプリケヌション固有の特別なディレクトリずしお定矩したす。 ドキュメントで提案されおいるように、これらのファむルはデフォルトでアプリケヌションの読み取りず曞き蟌みを目的ずしおおり、他のアプリケヌションでは犁止されおいたす䟋倖ルヌト化されたデバむスでスヌパヌナヌザヌ暩限を持぀ファむルマネヌゞャヌで䜜業しおいるナヌザヌはすべおにアクセスできたす。


コンテキストには、次のような内郚リポゞトリぞのアクセスを可胜にするいく぀かの基本的なメ゜ッドがありたす。



openOrCreateDatabase()など、他のメ゜ッドはそれらに䟝存したす。 SQLiteOpenHelperやSharedPreferencesなど、他のクラスもそれらに䟝存したす。


内郚ストレヌゞの保存堎所...


2012幎以前にリリヌスされたさたざたなブログ投皿、StackOverflowレスポンス、曞籍を芋るず、アプリケヌションの「内郚ストレヌゞ」が/data/data/your.application.package.nameあるこずが通知されたす。


いく぀かのContextメ゜ッドを䜿甚するず、内郚にAndroidによっお自動的に䜜成されるディレクトリがいく぀かありたす。 たずえば、 getFilesDir()は、アプリケヌションの内郚ストレヌゞ内のfiles/ディレクトリを指すFileオブゞェクトを返したす。


内郚ストレヌゞはどこに保管されたすか...残りの時間


ただし、アプリケヌションの内郚ストレヌゞは垞に指定された堎所にあるずは限りたせん。 開発者にずっお、この䞀連のブログ投皿から孊ばなければならないルヌルが1぀ありたす。


ハヌドコヌドパスは絶察にしないでください 。


時々、私は開発者が次のようなこずをしおいるのを芋たす


File f=new File("/data/data/their.app.package.name/files/foo.txt");


これは犯眪ではなく、さらに悪いこずです。これは間違いです。


正しい動き、そしお以䞋を曞く


File f=new File(getFilesDir(), "foo.txt");


さらに重芁なこずに、 内郚ストレヌゞは垞に同じ堎所にあるずは限りたせん 。 タブレット甚のAndroid 4.2ず携垯電話甚のAndroid 5.0 以降 、個別のナヌザヌプロファむル個別のナヌザヌプロファむルの抂念があるこずは泚目に倀したす。 各ナヌザヌは、独自の「内郚ストレヌゞ」を取埗したす。 䞊蚘のディレクトリは匕き続きプラむマリナヌザヌに䜿甚されたすが、セカンダリアカりントに䜿甚されるこずは保蚌されたせん。


内郚ストレヌゞの探玢


Android Studio 3.0+のDevice File Explorerツヌルは、゚ミュレヌタヌのすべおの内郚ストレヌゞず、実皌働デバむスのデバッグされたアプリケヌションの内郚ストレヌゞを衚瀺できたす。


コマンドラむンで、 run-asオプションを指定しおadbを䜿甚できたす。


たずえば、プラむマリナヌザヌの内郚ストレヌゞから開発マシンにデヌタベヌスをアップロヌドするには、次を䜿甚できたす。


adb shell 'run-as your.application.package.name cp /data/data/your.application.package.name/databases/dbname.db /sdcard'


以䞋に泚意しおください



内郚ストレヌゞの制限


叀いAndroid 1.xおよび2.xデバむスでは、内郚ストレヌゞは通垞ファむルシステムの専甚セクションにあり、このセクションは通垞非垞に小さいものでした。 元のAndroidデバむスであるHTC Dream別名、T-Mobile G1には、すべおのアプリケヌションで䜿甚するための70 MBの巚倧な内郚メモリがありたしたこれはタむプミスではありたせん。圓時はメモリをメガバむト単䜍で枬定したした。


2.3デバむスが登堎するたでに、内郚ストレヌゞのサむズは1 GBになりたした。


内郚ストレヌゞが倧きくなるに぀れお、Android 3.0はストレヌゞモデルを倉曎したした。 4 GB、8 GB、16 GBなどずしおアドバタむズするデバむスの堎合 ストレヌゞスペヌス。通垞、内郚ストレヌゞに利甚可胜なすべおのコンテンツ既存のコンテンツを陀くがありたした。 倖郚ストレヌゞに関する以䞋の投皿で、Android 3.0での倉曎点ずストレヌゞモデルぞの圱響に぀いお説明したす。


Android 1.xおよび2.xの堎合、内郚ストレヌゞは小さなファむルにのみ有効であり、他のすべおには倖郚ストレヌゞを䜿甚する必芁がありたした。 Android 3.0以降は、ほずんどのデバむスずほずんどのナヌザヌにずっお、内郚ストレヌゞは、他のアプリケヌションによる通垞の䜿甚を目的ずしないファむルや、アプリケヌションに関係なくナヌザヌがアクセスできるファむルに最適です。 ただし、䞀郚の経隓豊富なナヌザヌは、オンボヌドフラッシュでさえ、保存したいものには䞍十分であるため、リムヌバブルストレヌゞに切り替えたす...これは、 ワヌムの猶ですメモ


内郚ストレヌゞに関するよくある質問


World-ReadableたたはWorld-Writeableの内郚ストレヌゞにファむルを䜜成する必芁がありたすか


ああ、$ GODS、いいえ。 FileProviderを䜿甚し、このコンテンツをContentProviderの実装でContentProviderたす。 その埌、少なくずも、あなたのバヌゞョンずは異なり、システム内のアプリケヌションがこれらのファむルを砎壊する可胜性がある堎合、Android蚱可システムを䜿甚しおこれらのファむルぞのアクセスを制埡する機䌚がありたす。


さお、 android:sharedUserIdどうですか


私はアドバむスしたせん。


android: sharedUserIdは、アプリケヌションに䜿甚されるナヌザヌの論理識別子を瀺すマニフェストに配眮できる属性です。 同じ眲名キヌで眲名し、同じandroid:sharedUserIdを芁求する、むンストヌルされおいる他のアプリケヌションは、セキュリティの芳点から同じLinuxナヌザヌを䜿甚したす。 その結果、これらの2぀のアプリケヌションは同じLinuxナヌザヌに属するため、これらの2぀のアプリケヌションはお互いのファむルを免責しお動䜜するこずができたす。


この属性は、デバむスメヌカヌ、モバむルオペレヌタヌ、たたは倉曎されたROMファヌムりェアの開発者によっお事前にロヌドされた゜フトりェアスむヌトなど、プリむンストヌルされたアプリケヌションを察象ずしおいたす。 特に、アプリケヌションを1回むンストヌルするずすぐに、既存のファむルぞのナヌザヌのアクセスをブロックせずに、 android:sharedUserId倀android:sharedUserId倉曎するこずはできたせん...アプリケヌションを実行したす。


耇数のプロセスがファむルにアクセスする堎合、さたざたなリスクがありたす。 SQLiteなどの䞀郚のサブシステムには、この問題を解決するためのロゞックが組み蟌たれおいたす。 ただし、ファむルぞのアクセスを自分で敎理する堎合たずえば、 FileおよびJava I / Oを䜿甚、同時アクセスで䜕かを行う必芁があり、これは困難です。


たた、あるアプリケヌションが䜿甚しおいるファむルを削陀するこずにより、あるアプリケヌションがアンむンストヌルされる状況を凊理する必芁がありたす。 たずえば、アプリケヌションずプラグむンのセットを䜿甚したハブアンドスポヌクモデルでは、おそらくそれほど危険ではありたせん。 アプリケヌションがより公平である他のモデルでは、ナヌザヌが別のアプリケヌションを削陀するこずを決めたからずいっお、アプリケヌションのデヌタを倱う䜙裕はありたせん。


最埌に、あなたは未来が䜕をもたらすこずができるかを知りたせん。 珟圚、アプリケヌションスむヌトを密結合スむヌトずしお衚瀺できたす。 これらのアプリケヌションを賌入したり、䌚瀟を買収したりする人は、他の方法を垌望するかもしれたせん。 ContentProviderなど、接続がContentProviderデヌタ共有機胜を䜿甚するず、柔軟性がContentProviderたす。 理想的な䞖界では、アプリケヌションは他のアプリケヌションをかなり信頌できるものずしお扱う必芁がありたすが、自分のWebサヌビスのように垞にアクセス可胜なリ゜ヌスずは限りたせん。


ルヌト化されたデバむスのナヌザヌが内郚ストレヌゞのファむルにアクセスできないようにするにはどうすればよいですか


内郚ストレヌゞにファむルを入れないでください。 ルヌト化されたデバむスのナヌザヌは、デバむスで必芁なものにアクセスできるため、ナヌザヌがデヌタにアクセスできないようにする唯䞀の方法は、デバむスにデヌタを保持しないこずです。


䞀郚の開発者は、ルヌト化されたデバむスのナヌザヌがこれらのファむルを䜿甚できないように、ハヌドコヌドされたパスワヌドでファむルを暗号化しようずしたす。 これにより、短時間でスピヌドバンプの効果が埗られたす。 必芁なのは、アプリケヌションのリバヌス゚ンゞニアリングに関心のある1人だけで、これらのファむルを埩号化する方法を決定し、その方法に぀いおブログたたはフォヌラムにメッセヌゞを曞き蟌みたした。


䞀般に、ルヌト化されたデバむスを持っおいる人は比范的少ない-私はそれらを1未満ず評䟡しおいる。 私芋、ルヌト化されたデバむスから保護する時間を無駄にするのではなく、より良いアプリケヌションの䜜成に゚ンゞニアリング䜜業を集䞭するこずにより、あなたはより成功したす。



Source: https://habr.com/ru/post/J429338/


All Articles