導航:首頁 > 源碼編譯 > 安卓庫管理源碼

安卓庫管理源碼

發布時間:2024-05-11 05:22:57

⑴ 怎樣閱讀android系統源碼

由於工作需要大量修改framework代碼, 在AOSP(Android Open Source Project)源碼上花費了不少功夫, Application端和Services端都看和改了不少.
如果只是想看看一些常用類的實現, 在Android包管理器里把源碼下載下來, 隨便一個IDE配好Source Code的path看就行.
但如果想深入的了解Android系統, 那麼可以看下我的一些簡單的總結.

知識
java
Java是AOSP的主要語言之一. 沒得說, 必需熟練掌握.
熟練的Android App開發
linux
Android基於Linux的, 並且AOSP的推薦編譯環境是Ubuntu 12.04. 所以熟練的使用並了解Linux這個系統是必不可少的. 如果你想了解偏底層的代碼, 那麼必需了解基本的Linux環境下的程序開發. 如果再深入到驅動層, 那麼Kernel相關的知識也要具備.
Make
AOSP使用Make系統進行編譯. 了解基本的Makefile編寫會讓你更清晰了解AOSP這個龐大的項目是如何構建起來的.
Git
AOSP使用git+repo進行源碼管理. 這應該是程序員必備技能吧.
C++
Android系統的一些性能敏感模塊及第三方庫是用C++實現的, 比如: Input系統, Chromium項目(WebView的底層實現).

硬體
流暢的國際網路
AOSP代碼下載需要你擁有一個流暢的國際網路. 如果在下載代碼這一步就失去耐心的話, 那你肯定沒有耐心去看那亂糟糟的AOSP代碼. 另外, 好程序員應該都會需要一個流暢的Google.
一台運行Ubuntu 12.04的PC.
如果只是閱讀源碼而不做太多修改的話, 其實不需要太高的配置.
一台Nexus設備
AOSP項目默認只支持Nexus系列設備. 沒有也沒關系, 你依然可以讀代碼. 但如果你想在大牛之路走的更遠, 還是改改代碼, 然後刷機調試看看吧.
高品質USB線
要刷機時線壞了, 沒有更窩心的事兒了.
軟體
Ubuntu 12.04
官方推薦, 沒得選.
Oracle Java 1.6
注意不要用OpenJDK. 這是個坑, 官方文檔雖然有寫, 但還是單獨提一下.
安裝:
sudo apt-get install python-software-properties
sudo add-apt-repository ppa:webupd8team/java
sudo apt-get update
sudo apt-get install oracle-java6-installer
sudo apt-get install oracle-java6-set-default

Eclipse
估計會有不少人吐槽, 為什麼要用這個老古董. 其實原因很簡單, 合適. 剛開始搞AOSP時, 為了找到效率最優的工具, 我嘗試過Eclipse, IntelliJ IDEA, Vim+Ctags, Sublime Text+Ctags. 最終結果還是Eclipse. 主要優點有:
有語法分析 (快速准確的類, 方法跳轉).
支持C++ (IntelliJ的C++支持做的太慢了).
嵌入了DDMS, View Hierarchy等調試工具.
為了提高效率, 花5分鍾背下常用快捷鍵非常非常值得.
調整好你的classpath, 不要導入無用的代碼. 因為AOSP項目代碼實在是太多了. 當你還不需要看C++代碼時, 不要為項目添加C++支持, 建索引過程會讓你崩潰.
Intellij IDEA
開發App必備. 當你要調試系統的某個功能是, 常常需要迅速寫出一個調試用App, 這個時候老舊的Eclipse就不好用了. Itellij IDEA的xml自動補全非常給力.
巨人的肩膀

這個一定要先讀. 項目介紹, 代碼下載, 環境搭建, 刷機方法, Eclipse配置都在這里. 這是一切的基礎.

這個其實是給App開發者看的. 但是裡面也有不少關於系統機制的介紹, 值得細讀.

此老羅非彼老羅. 羅升陽老師的博客非常有營養, 基本可以作為指引你開始閱讀AOSP源碼的教程. 你可以按照博客的時間順序一篇篇挑需要的看.但這個系列的博客有些問題:
早期的博客是基於舊版本的Android;
大量的代碼流程追蹤. 讀文章時你一定要清楚你在看的東西在整個系統處於什麼樣的位置.

鄧凡平老師也是為Android大牛, 博客同樣很有營養. 但是不像羅升陽老師的那麼系統. 更多的是一些技術點的深入探討.

Android官方Issue列表. 我在開發過程中發現過一些奇怪的bug, 最後發現這里基本都有記錄. 當然你可以提一些新的, 有沒有人改就是另外一回事了.

一定要能流暢的使用這個工具. 大量的相關知識是沒有人系統的總結的, 你需要自己搞定.
其它
代碼組織
AOSP的編譯單元不是和git項目一一對應的, 而是和Android.mk文件一一對應的. 善用mmm命令進行模塊編譯將節省你大量的時間.
Binder
這是Android最基礎的進程間通訊. 在Application和System services之間大量使用. 你不僅要知道AIDL如何使用, 也要知道如何手寫Binder介面. 這對你理解Android的Application和System services如何交互有非常重要的作用. Binder如何實現的倒不必著急看.
HAL
除非你對硬體特別感興趣或者想去方案公司上班, 否則別花太多時間在這一層.
CyanogenMod
這是一個基於AOSP的第三方Rom. 從這個項目的wiki里你能學到很多AOSP官方沒有告訴你的東西. 比如如何支持Nexus以外的設備.
DIA
這是一個Linux下畫UML的工具, 能夠幫你梳理看過的代碼.
XDA

⑵ android系統源代碼情景分析 需要具備什麼基礎知識

Android系統的源代碼非常龐大和復雜,我們不能貿然進入,否則很容易在裡面迷入方向,進而失去研究它的信心。我們應該在分析它的源代碼之前學習好一些理論知識,下面就介紹一些與Android系統相關的資料。
我們知道,Android系統是基於Linux內核來開發的,在分析它在運行時庫層的源代碼時,我們會經常碰到諸如管道(pipe)、套接字(socket)和虛擬文件系統(VFS)等知識。此外,Android系統還在Linux內核中增加了一些專用的驅動程序,例如用於日誌系統的Logger驅動程序、用於進程間通信的Binder驅動程序和用於輔助內存管理的匿名共享內存Ashmem驅動程序。在分析這些Android專用驅動程序的時候,也會碰到Linux內核中與進程、內存管理相關的數據結構。因此,我們有必要掌握一些Linux內核的基礎知識,下面就介紹四本典經的Linux內核書籍。
1.Linux Kernel Development.
這本書的作者是Robert Love,目前最新的版本是第3版。這本書對Linux內核的設計和實現提供了一個總覽視圖,從概念上對Linux內核的各個子系統的設計目標和實現思路進行了清晰的描述,非常適合初學者閱讀。如果從軟體工程的角度來看,這本書就相當於是Linux內核的概要設計文檔。
2.Understanding the Linux Kernel.
這本書的作者是Daniel P. Bovet和Marco Cesati,目前最新的版本是第3版。這本書對Linux內核的實現提供了更多的細節,詳細地描述了內核開發中用到的重要數據結構、演算法以及編程技巧,非常適合中高級讀者閱讀。如果從軟體工程的角度來看,這本書就相當於是Linux內核的詳細設計文檔。
3.Linux Device Drivers.
這本書的作者是Jonathan Corbet, Alessandro Rubini和Greg Kroah-Hartman,目前最新的版本是第3版。這本書更加註重實際操作,它詳細地講解了Linux內核驅動程序的實現原理和實現方法,讀者可以跟著它來實際地編寫出自己的Linux驅動程序。閱讀了這本書之後,對我們後續去分析Android的專用驅動程序是有非常大的幫助的。
4.Linux內核源代碼情景分析
這本書的作者是毛德操和胡希明,是中國人自己編寫的一本經典的Linux內核書籍。這本書最大的特點是從使用情景出發,對Linux內核的源代碼作了詳細的分析,幫助讀者把枯燥無味的源代碼給理順了。
掌握了Linux內核的基礎知識之後,還不宜馬上就去分析Android系統的源代碼,因為這樣做是漫無目的的,我們應該帶著問題或者目標去分析Android系統的源代碼。要把問題或者目標挖掘出來,最好的方法就莫過於是在Android平台上編寫自己的應用程序了。通過編寫應用程序,我們可以知道Android平台都提供了哪些功能,進而我們就會想去了解這些功能是怎麼實現的,這樣就可以達到帶著問題或者目標去分析Android系統的源代碼了。這里介紹兩個Android應用程序開發教程的書籍:
1.Professional Android 2 Application Development.
2.Google Android SDK開發範例大全.
這兩本書都使用了大量的例子來說明如何使用Android SDK來開發Android應用程序。讀者可以根據實際情況來練習一下,主要掌握Android應用程序四大組件(Activity、Service、Broadcast Receiver和Content Provider)的用法,因為Android系統的整個架構和實現就是為了向開發者提供這四大組件來實現各種各樣的應用程序的。在學習的過程中,如果遇到其它問題,還可以參考官方文檔

⑶ 求java編寫的倉庫管理系統源代碼或詳細設計

import java.util.*;
import java.awt.event.*;
import java.awt.*;
import javax.swing.*;
import java.io.*;
class 商品 extends Panel
{String 代號,名稱;int 庫存;float 單價;
商品(String 代號,String 名稱,int 庫存,float 單價)
{this.代號=代號;this.名稱=名稱;this.庫存=庫存;this.單價=單價;
}
}
class ShowWin extends JFrame implements ActionListener
{ Hashtable hashtable=null;
JTextField 代號文本框=new JTextField(),
名稱文本框=new JTextField(),
庫存文本框=new JTextField(),
單價文本框=new JTextField(),
查詢文本框=new JTextField(),
查詢信息文本框=new JTextField(),
刪除文本框=new JTextField();
JButton b_add=new JButton("添加商品"),
b_del=new JButton("刪除商品"),
b_xun=new JButton("查詢商品"),
b_xiu=new JButton("修改商品"),
b_show=new JButton("顯示商品清單");
JTextArea 顯示區=new JTextArea(25,10);
ShowWin()
{super("倉庫管理窗口");
hashtable=new Hashtable();
Container con=getContentPane();
JScrollPane pane=new JScrollPane(顯示區);
顯示區.setEditable(false);
JPanel save=new JPanel();
save.setLayout(new GridLayout(8,2));
save.add(new Label("輸入代號:"));
save.add(代號文本框);
save.add(new Label("輸入名稱:"));
save.add(名稱文本框);
save.add(new Label("輸入庫存:"));
save.add(庫存文本框);
save.add(new Label("輸入單價:"));
save.add(單價文本框);
save.add(new Label("單擊添加:"));
save.add(b_add);
save.add(new Label("單擊修改:"));
save.add(b_xiu);
save.add(new Label("輸入查詢代號:"));
save.add(查詢文本框);
save.add(new Label("單擊查詢:"));
save.add(b_xun);
JPanel del=new JPanel();
del.setLayout(new GridLayout(2,2));
del.add(new Label("輸入刪除的代號:"));
del.add(刪除文本框);
del.add(new Label("單擊刪除:"));
del.add(b_del);
JPanel show=new JPanel();
show.setLayout(new BorderLayout());
show.add(pane,BorderLayout.CENTER);
show.add(b_show,BorderLayout.SOUTH);
JSplitPane split_one,split_two;
split_one=new JSplitPane(JSplitPane.VERTICAL_SPLIT,save,del);
split_two=new
JSplitPane(JSplitPane.HORIZONTAL_SPLIT,true,split_one,show);
con.add(split_two,BorderLayout.CENTER);
JPanel xun=new JPanel();
xun.add(new Label("所得信息:"));
xun.add(查詢信息文本框);
xun.setLayout(new GridLayout(2,1));
con.add(xun,BorderLayout.SOUTH);
b_add.addActionListener(this);
b_del.addActionListener(this);
b_xun.addActionListener(this);
b_xiu.addActionListener(this);
b_show.addActionListener(this);
}
public void actionPerformed(ActionEvent e)
{if(e.getSource()==b_add)
{String daihao=null,mingcheng=null;int kucun=0;float danjia=0.0f;
daihao=代號文本框.getText();mingcheng=名稱文本框.getText();
kucun=Integer.parseInt(庫存文本框.getText());
danjia=Float.valueOf(單價文本框.getText()).floatValue();
商品 goods=new 商品(daihao,mingcheng,kucun,danjia);
hashtable.put(daihao,goods);
try{FileOutputStream file=new FileOutputStream("goods.txt");
ObjectOutputStream out=new ObjectOutputStream(file);
out.writeObject(hashtable); out.close();
}
catch(IOException event){}
}
else if(e.getSource()==b_del)
{String daihao1=刪除文本框.getText();
try{FileInputStream come_in=new FileInputStream("goods.txt");
ObjectInputStream in=new ObjectInputStream(come_in);
hashtable=(Hashtable)in.readObject(); //////
in.close();
}
catch(ClassNotFoundException event){}
catch(IOException event){}
商品 temp=(商品)hashtable.get(daihao1);
{hashtable.remove(daihao1);}
try{FileOutputStream file=new FileOutputStream("goods.txt");
ObjectOutputStream out =new ObjectOutputStream(file);
out.writeObject(hashtable);//
out.close();
}
catch(IOException event){}
}
//
else if(e.getSource()==b_xun)
{ String aa;
aa=查詢文本框.getText();
查詢信息文本框.setText(null);
try{FileInputStream come_in=new FileInputStream("goods.txt");
ObjectInputStream in =new ObjectInputStream(come_in);
hashtable=(Hashtable)in.readObject(); ////
in.close();
}
catch(ClassNotFoundException event){}
catch(IOException event){}
商品 a=(商品)hashtable.get(aa);
查詢信息文本框.setText(" 代號:"+a.代號+" 名稱:"+a.名稱+" 庫存:"+a.庫存+" 單價:"+a.單價);
}
//
else if(e.getSource()==b_xiu)
{ String bb;
bb=代號文本框.getText();
try{FileInputStream come_in=new FileInputStream("goods.txt");
ObjectInputStream in=new ObjectInputStream(come_in);
hashtable=(Hashtable)in.readObject(); //////
in.close();
}
catch(ClassNotFoundException event){}
catch(IOException event){}
商品 temp=(商品)hashtable.get(bb);
{hashtable.remove(bb);}
try{FileOutputStream file=new FileOutputStream("goods.txt");
ObjectOutputStream out =new ObjectOutputStream(file);
out.writeObject(hashtable);//
out.close();
}
catch(IOException event){}
String daihao1=null,mingcheng1=null;int kucun1=0;float danjia1=0.0f;
daihao1=代號文本框.getText();mingcheng1=名稱文本框.getText();
kucun1=Integer.parseInt(庫存文本框.getText());
danjia1=Float.valueOf(單價文本框.getText()).floatValue();
商品 goods1=new 商品(daihao1,mingcheng1,kucun1,danjia1);
hashtable.put(daihao1,goods1);
try{FileOutputStream file=new FileOutputStream("goods.txt");
ObjectOutputStream out=new ObjectOutputStream(file);
out.writeObject(hashtable); out.close();
}
catch(IOException event){}

}
//
else if(e.getSource()==b_show)
{ 顯示區.setText(null);
try{FileInputStream come_in=new FileInputStream("goods.txt");
ObjectInputStream in =new ObjectInputStream(come_in);
hashtable=(Hashtable)in.readObject(); ////
}
catch(ClassNotFoundException event){}
catch(IOException event){}
Enumeration enum=hashtable.elements();
while(enum.hasMoreElements())
{ 商品 te=(商品)enum.nextElement();
顯示區.append("商品代號:"+te.代號+" ");
顯示區.append("商品名稱:"+te.名稱+" ");
顯示區.append("商品庫存:"+te.庫存+" ");
顯示區.append("商品單價:"+te.單價+" ");
顯示區.append("\n ");
}
}
}
}
public class LinkListFour
{public static void main(String args[])
{ ShowWin win=new ShowWin();
win.setSize(400,350);
win.setVisible(true);
win.addWindowListener(new WindowAdapter()
{public void windowClosing(WindowEvent e)
{ System.exit(0);}});
}
}

⑷ 怎樣查看 Android APP 源代碼

壓縮軟體打開apk文件,解壓出根目錄中的classes.dex文件

使用cmd ,dex2jar.bat classes.dex命令將classes.dex轉換為jar

再用jd-gui打開該jar就可以查看源碼了,如果apk安全性好的話,有些代碼是看不到的

⑸ 如何創建Android庫以及Android aar文件詳解

創建 Android 庫

Android 庫在結構上與 Android 應用模塊相同。它可以提供構建應用所需的一切內容,包括源代碼、資源文件和 Android 清單。不過,Android 庫將編譯到您可以用作 Android 應用模塊依賴項的 Android 歸檔 (AAR:Android Archive Resource) 文件,而不是在設備上運行的 APK。與 JAR 文件不同,AAR 文件可以包含 Android 資源和一個清單文件,這樣,除了 Java 類與方法外,您還可以捆綁布局和可繪制對象等共享資源。

庫模塊在以下情況下非常有用:

⑹ 自己可以編譯安卓源碼嗎

用最新的Ubuntu 16.04,請首先確保自己已經安裝了Git.沒安裝的同學可以通過以下命令進行安裝:

sudo apt-get install git git config –global user.email 「[email protected]」 git config –global user.name 「test」

其中[email protected]為你自己的郵箱.

簡要說明

android源碼編譯的四個流程:1.源碼下載;2.構建編譯環境;3.編譯源碼;4運行.下文也將按照該流程講述.

源碼下載

由於某牆的原因,這里我們採用國內的鏡像源進行下載.
目前,可用的鏡像源一般是科大和清華的,具體使用差不多,這里我選擇清華大學鏡像進行說明.(參考:科大源,清華源)

repo工具下載及安裝

通過執行以下命令實現repo工具的下載和安裝

mkdir ~/binPATH=~/bin:$PATHcurl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repochmod a+x ~/bin/repo

補充說明
這里,我來簡單的介紹下repo工具,我們知道AOSP項目由不同的子項目組成,為了方便進行管理,Google採用Git對AOSP項目進行多倉庫管理.在聊repo工具之前,我先帶你來聊聊多倉庫項目:

我們有個非常龐大的項目Pre,該項目由很多個子項目R1,R2,...Rn等組成,為了方便管理和協同開發,我們為每個子項目創立自己的倉庫,整個項目的結構如下:


這里寫圖片描述

執行完該命令後,再使用make命令繼續編譯.某些情況下,當你執行jack-admin kill-server時可能提示你命令不存在,此時去你去out/host/linux-x86/bin/目錄下會發現不存在jack-admin文件.如果我是你,我就會重新repo sync下,然後從頭來過.

錯誤三:使用emulator時,虛擬機停在黑屏界面,點擊無任何響應.此時,可能是kerner內核問題,解決方法如下:
執行如下命令:

  • ./out/host/linux-x86/bin/emulator -partition-size 1024 -kernel ./prebuilts/qemu-kernel/arm/kernel-qemu-armv7

  • 通過使用kernel-qemu-armv7內核 解決模擬器等待黑屏問題.而-partition-size 1024 則是解決警告: system partion siez adjusted to match image file (163 MB >66 MB)

    如果你一開始編譯的版本是aosp_arm-eng,使用上述命令仍然不能解決等待黑屏問題時,不妨編譯aosp_arm64-eng試試.

    結束吧

    到現在為止,你已經了解了整個android編譯的流程.除此之外,我也簡單的說明android源碼的多倉庫管理機制.下面,不妨自己動手嘗試一下.

    閱讀全文

    與安卓庫管理源碼相關的資料

    熱點內容
    程序員經常用工具 瀏覽:835
    降服主力指標源碼主圖 瀏覽:499
    python實用庫 瀏覽:691
    電腦默認7個文件夾 瀏覽:11
    新唐單片機安裝c51後編譯錯誤 瀏覽:529
    紅包源碼引流神器 瀏覽:234
    學生初中畢業撕書解壓 瀏覽:747
    命令方塊刷銅點教學 瀏覽:690
    php郵件訂閱系統 瀏覽:996
    柱樑底加密箍間距 瀏覽:29
    pythonjavascript對比 瀏覽:740
    什麼動漫app是大陸字幕 瀏覽:286
    android查看activity棧 瀏覽:918
    x86固件編譯 瀏覽:165
    安卓下什麼可以看微博動圖 瀏覽:412
    永輝生活app注冊有什麼優惠嗎 瀏覽:411
    行偏移演算法 瀏覽:240
    什麼app也能讓wifi增強 瀏覽:178
    雙分錄核演算法反映什麼 瀏覽:210
    ubuntuphpaptget 瀏覽:256