2011-07-01 12 views
9

NDKアプリケーションを/system/appディレクトリにプレインストールしようとしています。 ZIPファイルマネージャでapkファイルを開くと、.soファイルがlibディレクトリ内にあります。しかし、apkファイルをプリインストールすると、apkの.soファイルはsystem/libディレクトリにコピーされないため、アプリケーションを起動したときにアプリケーションが失敗する可能性があります。Android NDKアプリケーションの事前インストール

.soファイルがAPKファイルから抽出され、system/libディレクトリにコピーされるように、誰でもAPKファイルのAndroid.mkに設定する必要があることを教えてください。アプリケーションをシステムイメージに含める必要があります。

ご意見をいただければ幸いです。

おかげで、 artsylar

+0

技術的には、.soファイルを/data/data/com.yourpackage.name/libディレクトリにコピーする必要がありますが、インストール済みのアプリで同じ問題が発生していますAPK。 – Devunwired

+0

私たちは、7zipのようなzipツールを使用して、APKからsoファイルを手動で解凍しただけです。次に、アンドロイドのソースコードをコンパイルしながら、ファイルを/out/..../system/libディレクトリにコピーするmakeファイルを作成しました。私たちの場合、それはネイティブのアプリケーションが必要とするので、ROMイメージに含めることを望んでいます。そのため、/ system/libディレクトリにコピーする必要があります。 – artsylar

+0

このフォーラムを参照するにはhttps://groups.google.com/group/android-ndk/browse_thread/thread/2d08a95b3038e532?hl=ja 彼らと同じ問題がありました – artsylar

答えて

4

は私が同じニーズを持っていたし、重い研究の2日後、私は、この問題に対する解決策を思い付きました。それは簡単ではなく、Androidシステムコードも変更できる必要があります。

基本的に、PackageManagerServiceは、システムアプリケーションが更新されていない限り、ネイティブバイナリ(.soファイル)をアンパックするのを防ぎます。ですから、これを修正する唯一の方法は、PMS.javaを修正することです(この問題を解決しようとして以来、私はひどい気分になっています)。システムの最初の起動時に

、私はisPackageNative(PackageParser.PackageのPKG)関数を記述することでネイティブバイナリのためのすべてのシステムパッケージをチェックしてください。

private boolean isPackageNative(PackageParser.Package pkg) throws IOException { 
    final ZipFile zipFile = new ZipFile(pkg.mPath); 
    final Enumeration<? extends ZipEntry> privateZipEntries = zipFile.entries(); 
    while (privateZipEntries.hasMoreElements()) { 
     final ZipEntry zipEntry = privateZipEntries.nextElement(); 
     final String zipEntryName = zipEntry.getName(); 
     if(true) Log.e(TAG, " Zipfile entry:"+zipEntryName); 
     if (zipEntryName.endsWith(".so")) { 
      zipFile.close(); 
      return true; 
     } 
    } 
    zipFile.close(); 
    return false; 
    } 

この関数は、ネイティブライブラリのため、それが持っている場合は、すべてのパッケージをチェックします1つ、私はそれを解凍します。 PMSはscanPackageLI(....)でこのチェックを行います。メソッド内で次のコードを検索します。

if (isSystemApp(pkg) && !isUpdatedSystemApp(pkg)) 

を入力し、isPackageNative(pkg)チェックを追加します。他にも小さな変更が必要ですが、あなたがこの方向性を持っていればそれを理解するでしょう。それが役に立てば幸い!

+0

答えが不完全でも+1。それは助けになった。 – Halsafar

+0

うわー、ありがとう!私は今のところそれを試してみる機会がありませんが、これは最高の答えです。それを行うには最良の方法のように見えるので、これを答えとして受け入れます。ありがとう! – artsylar

1

あなたが "adbのプッシュ" .soファイルを自分でする必要があります。また、必ずライブラリをsystem/libにプッシュする必要はありません(フォルダによってはアクセス許可が拒否される可能性があります)。大半は

を発行することにより data/appにプッシュして、ロード
System.load("/data/app/<libName>.so"); 
+0

に感謝@ digitalmouse12。しかし、アプリケーションをシステムイメージに統合する必要があります。つまり、adbを使用せずにプレインストールする必要があります。 – artsylar

+0

この記事[リンク](http://groups.google.com/group/android-porting/browse_thread/thread/aff028eff3d680a4/342691bc1145389a?lnk=gst&q=boot+so+apk#342691bc1145389a)が見つかりました。 "最初の起動シーケンス(例えば、エミュレータ起動時のワイプデータ、またはデバイスの工場出荷時リセット)のあと、システムは/ system/app/ .apkの下にバンドルされているアプリケーションをスキャンしてインストールしますそれらを1つ1つ」。 – artsylar

+0

また、ライブラリファイル(* .so)が/ system/libディレクトリに展開されることを意味しますか?しかし、「システムにバンドルされているアプリケーションは、システムライブラリを/ system/libの下に置く必要があります」という理由もありますか? – artsylar

2

私はあなたが読み取り専用としてマウントされているAndroidの/システムパーティションとして、デフォルトでそれを行うことはできませんと思います!このコマンドによって書き込み権限で/システムをマウントするようにあなたは根ざした携帯電話が必要となります。

mount -o rw,remount -t yaffs2 /dev/block/mtdblock3 /system. 

だから、あなたが根ざし携帯電話を持っている場合は、あなたのアプリケーションでこのコードを追加することができます

Process p; 
try { 
    // Preform su to get root privledges 
    p = Runtime.getRuntime().exec("su"); 
    // Attempt to write a file to a root-only 
    DataOutputStream os = new DataOutputStream(p.getOutputStream()); 
    // gain root privileges 
    os.writeBytes("mount -o rw,remount -t yaffs2 /dev/block/mtdblock3 /system\n"); 
    // do here the copy operation you want in /system/lib file, for example: 
    os.writeBytes("mv /sdcard/mylib.so /system/lib/\n"); 

    // Close the terminal 
    os.writeBytes("exit\n"); 
    os.flush(); 

} catch (IOException e) { 
    toastMessage("could not get root access"); 
} 

そうでなければ、digitalmouse12が与えた解決策に従わなければなりません。

+0

これは、電話機のインストールを変更することについて話しているので、実際には関係ありませんが、電話機にインストールする前に、インストールするシステムイメージに何かを含めることについてポスターが話しています。 –

+0

Thanasisありがとうございました。しかし、クリスは正しいです。私が知りたいのは、バンドルされた.soファイルがあらかじめ組み込まれたapkファイルをシステムイメージにプレインストールする方法です。 – artsylar

+0

はい、今問題を理解していますが、解決策がわかりません。私が何かを見つけたら教えてあげましょう! :) –

0

おそらくどこかのドキュメントがありますが、それが見つからない場合は、関連付けられたjniライブラリ.soとあらかじめインストールされているアプリケーションを特定し、または対応するシステムイメージまたはそれがどのように処理されるかは、update.zipを参照してください。言い換えれば

、例によってプログラミング...