【回転】ソースを露出しないAndroid Libraryプロジェクトを作成する

3548 ワード

Android Library Project(ライブラリエンジニアリング)は、他のAndroidエンジニアリングに引用できるエンジニアリングです.では、なぜこのプロジェクトを使う必要があるのでしょうか.例えば、Androidプロジェクトを開発するとき、いくつかのAndroidプロジェクトの開発過程で、再利用可能なコードセグメントやリソースがあるという問題がよくあります.各プロジェクトがこれらのコードまたはリソースを繰り返し作成または追加する場合は、効率に非常に影響します.重複発明ホイールを回避するために、これらの重複リソースをAndroid Library Projectに追加することができます.その後、これらのものを多重化する場合は、現在のプロジェクトでこのAndroid Library Projectを引用すればいいのです.
もちろん、私たちのAndroid Library Projectは私たち自身だけでなく、このAndroid Lib Projectを他の人に共有したいが、自分のソースコードを暴露したくない場合は、これが私たちのこの文章の内容です.
HOW
まず、この文章では3つのプロジェクトに言及します.
LibraryProject:ソースコードを含まない他の人に共有するプロジェクトが必要です.
LibraryProjectSource:LibraryProjectにはソースコードのバージョンが含まれています.
AndroidProject:LibraryProjectのバージョンを参照します.
通常のAndroidプロジェクトを開発するのと同じように、まずプロジェクトを構築しますが、通常のコードを開始する前に、ソースコードを露出しない方法は、LibraryProjectSourceのソースコードをJARパッケージにパッケージし、他の人に共有するプロジェクトに追加することです.このプロジェクトでリソース(resディレクトリの下のファイル)が参照されていない場合は、容易に実現できます.しかし、R.id.resourceなどのリソースへの参照があれば、リソース参照の乱れの問題に直面することができます.
たとえば、AndroidProjectでTextViewを参照するとImageViewにナビゲートできます.これは、ソースコードにR.id.resourceを使用してリソースを参照している場合、JARパッケージにコンパイルするときに、R.id.resourceがR.javaファイルの対応する16進数のint値で置き換えられるためです.ただし、AndroidProjectファイルのリソースは、LibraryProjectのリソースと組み合わせて新しい16進数int値を再生成します.同じリソースでは、LibraryProjectSourceのint値とAndroid Projectの値が異なる可能性があります.
この16進数の数値をリアルタイムで取得する必要があります次の2つの方法があります.
1.(推奨)android.content.res.Resourcesクラスのint getIdentifier(String name,String defType,String defPackage). 
たとえば、Activityでレイアウトを設定する必要があります.res/layout/ディレクトリの「main_layout.xml」レイアウトファイルのIDを取得します.
   @Override     
   protected void onCreate(Bundle savedInstanceState) {
            ...
            int id = getResources().getIdentifier(“main_layout“, "layout", getPackageName());
            setContentView(id);
            ...
   }

注意:Libraryコードを書くときは、R.id.xxxxではなく、id値を簡単に取得する必要があります.
2.Java言語の反射メカニズムを使用します.しかし、反射を使うのは面倒だ.
   Field field = R.layout.class.getField("main_layout");
   int i = field.getInt(new R.layout());
   return i;

PUBLISH
最後に,作成したソースコードをJARパッケージに導き,LibraryProjectに追加する必要がある.そして私たちはこの工事を他の人に共有することができます.具体的な手順は次のとおりです.
1.LibraryProjectSourceのクラスファイルをエクスポート:プロジェクトフォルダディレクトリを開く->binディレクトリを開く->プロジェクト名と同じJARファイルをコピーします.元のプロジェクト依存JARパッケージをエクスポート:プロジェクトフォルダディレクトリを開く->libsディレクトリを開く->JARファイルをコピーします.
2.LibraryProjectSourceのパッケージ名と同じLibraryProject(パッケージ名はAndroidシステム認識アプリケーションのフラグ)を作成し、作成時にActivityの作成を選択せず、このプロジェクトをLibプロジェクトとする.
3.1からエクスポートした2つのパッケージをLibエンジニアリングのlibsフォルダの下にコピーし、Libエンジニアリング->Properties->Android->Is Library->OKを右クリックします.LibraryProjectSourceフォルダの下にあるリソースファイルをLibエンジニアリングの下にコピーします(主にassetsとresフォルダで、元のファイルを置き換えます).元工事中のAndroidManifestをxmlはこのプロジェクトのAndroidManifestに置き換えられます.xml.これでLibプロジェクトが完成します.
その後、Demo(Android Project)を書いてLibraryProjectが使用できるかどうかをテストします.
新規プロジェクト->右クリックプロジェクト->Properties->Android->Add->2で作成したLibraryProject->OKを選択します.
次にLibraryProjectインポート1からエクスポートされたクラスファイル:右クリックエンジニアリング->Properties->Java Build Path->Add JARs->2のLibエンジニアリングのlibsファイルの下にある1の元のエンジニアリングと同じ名前のJARパッケージを選択し、Order and Exportを選択して、入ったパッケージをフックします.
LibのAndroidManifestをxmlの必要な部分はDemoプロジェクトにコピーされます.たとえば、元のプロジェクトで使用する権限宣言、activity、service、broadcast部分などです.
TIPS
プロジェクトフォルダディレクトリを開く->binディレクトリを開く->プロジェクト名と同じJARファイルをコピーする
LibraryProjectSourceのbinディレクトリから自動生成jarをコピーすると、jd-guiで簡単に逆コンパイルすると、このjarはソースコードのパッケージであり、そのままパッケージされていることがわかります.実はこれは私たちの初心に反しています:ソースコードを隠します.
解決策はjarパケットをエクスポートした後、混同などの操作を行うことです.jarパッケージを混同し、proguardなどを使用できます.