2016年8月22日 星期一

Ubuntu-16.04 下載及編譯android source

這幾天為了在Ubuntu-16.04 下載 android source 和編譯 android,查了很多網站也花很多時間,所以做個筆記記錄一下。
------------------------------------------------------------


更新套件庫資訊
sudo apt-get update

install git

sudo apt install git


Installing Repo 

mkdir ~/bin 
PATH=~/bin:$PATH

curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo 
chmod a+x ~/bin/repo

下載android source
建立一個放source的目錄然後進去目錄下,名字可以自訂。

mkdir android
cd android

設定名字和信箱
 git config --global user.name "Your Name"
 git config --global user.email "you@example.com"

執行repo init更新URL的目錄資料,執行完會顯示很多的版本名稱。
repo init -u https://android.googlesource.com/platform/manifest

選要建立的版本
repo init -u https://android.googlesource.com/platform/manifest -b android-4.0.1_r1

輸入repo sync就會開始下載android source了,檔案很大超過20GB,所以要等蠻久的。
repo sync

安裝好後還不能編譯,還需要安裝jdk和很多東西


先分別執行這兩行,將java套件放到套件來源,第一行是oracle版本,第二行是openjdk版本的java
sudo add-apt-repository ppa:webupd8team/java
sudo add-apt-repository ppa:openjdk-r/ppa

更新套件庫資訊
sudo apt-get update

搜尋oracle-java或openjdk
apt-cache search oracle-java

會列出很多版本
oracle-jdk7-installer - Oracle JDK7 Installer meta package
oracle-java7-installer - Oracle Java(TM) Development Kit (JDK) 7
oracle-java6-installer - Oracle Java(TM) Development Kit (JDK) 6
oracle-java8-installer - Oracle Java(TM) Development Kit (JDK) 8
oracle-java7-set-default - Set Oracle JDK 7 as default Java
oracle-java6-set-default - Set Oracle JDK 6 as default Java
oracle-java8-set-default - Set Oracle JDK 8 as default Java
oracle-java7-unlimited-jce-policy - Unlimited JCE Policy for Oracle Java 7
oracle-java8-unlimited-jce-policy - Unlimited JCE Policy for Oracle Java 8
oracle-java9-installer - Oracle Java(TM) Development Kit (JDK) 9
oracle-java9-set-default - Set Oracle JDK 9 as default Java
oracle-java9-unlimited-jce-policy - Unlimited JCE Policy for Oracle Java 9

要編譯android的話要選擇對應的jdk版本,
android_4.0是oracle-java6-installer - Oracle Java(TM) Development Kit (JDK) 6請輸入
sudo apt-get install oracle-java6-installer

android_6.0是OpenJDK 7 請輸入
sudo apt-get install openjdk-7-jdk

安裝好之後輸入 java -version 就可以看目前的java版本,如下。
java version "1.6.0_45"
Java(TM) SE Runtime Environment (build 1.6.0_45-b06)
Java HotSpot(TM) 64-Bit Server VM (build 20.45-b01, mixed mode)

如果想要換目前的java和javac版本可以輸入
sudo update-alternatives --config java

然後還需要安裝一些編譯工具,不然編譯的時候會有錯誤訊息,以下是從網路上找到的

-----------------------------------android 4.x--------------------------------------------------
sudo apt-get install -y git flex bison gperf build-essential libncurses5-dev:i386

sudo apt-get install libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-dev g++-multilib

sudo apt-get install tofrodos python-markdown libxml2-utils xsltproc zlib1g-dev:i386

sudo apt-get install dpkg-dev libsdl1.2-dev libesd0-dev

sudo apt-get install git-core gnupg flex bison gperf build-essential

sudo apt-get install zip curl zlib1g-dev gcc-multilib g++-multilib

sudo apt-get install libc6-dev-i386

sudo apt-get install lib32ncurses5-dev x11proto-core-dev libx11-dev

sudo apt-get install lib32z-dev ccache

sudo apt-get install libgl1-mesa-dev libxml2-utils xsltproc unzip m4
----------------------------------------------------------------------------------------------------

-----------------------------android 6.x----------------------------------------------------------
sudo apt-get install git gnupg flex bison gperf build-essential

sudo apt-get install zip curl libc6-dev libncurses5-dev:i386 x11proto-core-dev

sudo apt-get install libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-glx:i386

sudo apt-get install libgl1-mesa-dev g++-multilib mingw32 tofrodos

sudo apt-get install python-markdown libxml2-utils xsltproc zlib1g-dev:i386

sudo ln -s /usr/lib/i386-linux-gnu/mesa/libGL.so.1 /usr/lib/i386-linux-gnu/libGL.so
--------------------------------------------------------------------------------------------------------


再來...還沒結束
編譯 android 4.0 的話要把 make 套件降版本 改為3.81
從這裡可以下載 make-3.81.tar.bz2
http://ftp.gnu.org/gnu/make/

下載後解開它,然後cd make-3.81到目錄下再執行下面這幾行
sudo ./configure
sudo make
sudo make install

執行完後要 重新開一個終端機 才能確定是不是安裝成功
make -version

成功就會顯示
GNU Make 3.81
Copyright (C) 2006  Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.

This program built for x86_64-unknown-linux-gnu


編譯 android 6.0 的話要修改android source下的一個檔案,
因為直接編譯的時候有遇到錯誤訊息。

檔案是 android/art/build/Android.common_build.mk
在75行左右

ifneq ($(WITHOUT_HOST_CLANG),true)
改為
ifeq ($(WITHOUT_HOST_CLANG),false)

到這邊準備工作終於完成了,最後將你要編譯的app專案整個放到 packages/apps/ 底下
並在專案裡面建一個Android.mk檔,檔案內容輸入這幾行,或參考底下的網站。
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
# Build all java files in the java subdirectory
LOCAL_SRC_FILES := $(call all-subdir-java-files)
# Name of the APK to build
LOCAL_PACKAGE_NAME := LocalPackage
# Tell it to build an APK
include $(BUILD_PACKAGE)

存檔後離開,在終端機中目標指向source的目錄
make clean
cd ~/Android
 . build/envsetup.sh
注意前面有個".",執行上面這行後,編譯器才能使用mm || mmm指令
mm packages/apps/Music
make Music

接著就會開始編譯了。
如果編譯失敗的話可以把專案裡的R.java檔刪除再編譯試試看。

編譯成功後會顯示檔案放的位置
例如Android4編譯完就顯示
Install: out/target/product/generic/system/app/Music.apk
apk就在out/target/product/generic/system/app/底下。






以下是參考網站
----------------------------------------------------------------------------------------------------



Android 4.3源码的下载和编译环境的安装及编译:http://jingyan.baidu.com/article/c85b7a641200e0003bac95a3.html

Android源码下载及开发环境的搭建: http://sammor.iteye.com/blog/1337612

Ubuntu 16.04 64bit 编译 Android 4.4 源码: http://www.jianshu.com/p/2b2c723825a9

如何在 Ubuntu 14.04 中安裝 Oracle/Open JDK: http://www.team-bob.org/linux-%E5%A6%82%E4%BD%95%E5%9C%A8-ubuntu-14-04-%E4%B8%AD%E5%AE%89%E8%A3%9D-oracleopen-jdk/

How do I install openjdk 7 on Ubuntu 16.04? http://askubuntu.com/questions/761127/how-do-i-install-openjdk-7-on-ubuntu-16-04

在Ubuntu Server14.04上編譯Android6.0源碼: http://www.zendei.com/article/9949.html

Ubuntu 16.04 LTS 成功编译 Android 6.0 源码教程: http://www.zendei.com/article/9949.html
(上面這個有解決android6遇到編譯問題的方法)


-----------------------------------------------------------------------------------------------------------

2015年11月15日 星期日

151116 java多執行緒測試 Thread

上面是題目
我用了兩個執行緒來算pi,
第一個是讓程式一直遞回計算pi,
第二個是用來監視輸入的文字,
如果輸入0以外的值則會在螢幕印出目前用遞回算出的數字,
輸入0則會終止計算,
程是裡面用到的是繼承Thread,
而繼承Thread必須要有一個run{}來運行執行緒。

程式碼↓

 執行結果:
 ----
class a1105 extends Thread {
public static void main(String arg[]) {
a1105 pi = new a1105();
}
public a1105() {
Thread wating = new watinginput(this);
wating.start();
this.start();
}
public volatile String nnnnnn;
    public double pi=1,i=1;
public void pi() {
pi =pi*i*2/(2*i-1)*i*2/(2*i+1);
i=i+1;
}
public void run() {
System.out.println("run,pi/2=(2/1)*(2/3)*(4/3)*(4/5)*(6/5)*(6/7)...");
while (true) {
this.pi();
}
}
public class watinginput extends Thread {
private a1105 wtf;
private java.util.Scanner input;

public watinginput(a1105 aaa) {
this.wtf = aaa;
input = new java.util.Scanner(System.in);
}
public void run() {
String nnnnnn = input.nextLine();
while (!nnnnnn.equals("0")) {
System.out.println("pi=" + pi*2+",i="+i);
nnnnnn = input.nextLine();
}
System.exit(0);
}
}
}


2015年9月26日 星期六

0927 java Awt.Graphics2D畫圖



 終於用java畫出數據圖了!!
我先定義一個物件讓幫我讀檔 把數據存到矩陣中,
在用awt套件的Graphics2D畫圖,
畫數據圖的時候是以每一個點去畫一個1x1的矩形,
因為他沒有point的圖形可以用 所以用矩形代替,
畫的時候要呼叫物件讀取數據,
然後會用到try{__}catch (IOException e) {__},
我目前還不太懂這東西。。。因為eclipse幫忙除錯就用了它 哈哈哈

用java畫數據圖好麻煩。。。。。。。。
附上程式碼
----------------------------------------------------------------------------------------------
package factorial;

import java.awt.*;
import java.awt.event.*;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.awt.geom.*;

public class Awt01 extends Frame {

static Awt01 frm = new Awt01();
static Graphics2D g2;

public static void main(String[] args) throws IOException {

Awt01 aa = new Awt01();
aa.bbb();
}

public double[] bbb() throws IOException {
frm.setTitle("Awt01");
frm.setSize(500, 600);
frm.setVisible(true);
FileReader fr = new FileReader("test.txt");
BufferedReader br = new BufferedReader(fr);
String line, tempstring;
String[] tempArray = new String[2];
ArrayList<String> myList = new ArrayList<String>();
int i = 0;
while ((line = br.readLine()) != null) {
// br.readLine()是讀取txt檔的每一行資料,把讀到的資料存到line
// 再將line丟給tempstring去儲存
tempstring = line;
// tempstring.split("\\s") 會依照空白鍵來切割,有幾個空白就切幾次
tempArray = tempstring.split("\\s");
// 按照順序.一行一行的儲存到動態陣列裡面
for (i = 0; i < tempArray.length; i++) {
myList.add(tempArray[i]);
}
}
// tempArray[]是String,一維矩陣
/*
* 轉換成double的二維矩陣 int k = myList.size() / 2; int count = 0; double[][]
* trans_array = new double[k][2]; for (int x = 0; x < myList.size() /
* 2; x++) { for (int y = 0; y < 2; y++) { trans_array[x][y] =
* Double.parseDouble((String) myList.get(count)); count++; //
* 一個index來決定myList讀取值的位置 } }
**/
// 轉換成double的一維矩陣
int k = myList.size();
int count = 0;
double[] trans_array = new double[k];
for (int x = 0; x < myList.size(); x++) {
trans_array[x] = Double.parseDouble((String) myList.get(count));
count++;
}
System.out.println(trans_array[3]);
return trans_array;
}

public void paint(Graphics g) {
Awt01 aa = new Awt01();

Graphics2D g2 = (Graphics2D) g;
Line2D linex = new Line2D.Double(0, frm.getHeight() * 5 / 6, frm.getWidth(), frm.getHeight() * 5 / 6);
Line2D liney = new Line2D.Double(frm.getWidth() / 6, 0, frm.getWidth() / 6, frm.getHeight());
g2.draw(linex);
g2.draw(liney);
try {
double[] wtf = aa.bbb();
int x1, y1;
double[] wtf2 = new double[3200];
System.out.println(wtf[50]+frm.getWidth() / 6);
for (int t = 0; t <= 1599; t++) {
y1 = t * 2;
x1 = t * 2 + 1;
wtf2[x1] = wtf[x1]* 24+frm.getWidth() / 6;
wtf2[y1] = wtf[y1]* -180+frm.getHeight() * 5 / 6;
Rectangle2D.Double r1 = new Rectangle2D.Double(wtf2[x1], wtf2[y1], 1, 1);
g2.draw(r1);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}
}


150926 關於static 物件呼叫方法

函式 (方法 method)

static
有static 類別方法 ---不用先建構物件,可直接以類別呼叫該方法,例如 Integer.parseInt("123");
無static 物件方法-----必須先建構物件,再以物件名稱呼叫,例如 Test a=new Test(); a.ppp();

class Test{
public void ppp(){
System.out.println("物件方法");
}

public static void kkk(){
System.out.println("類別方法");
}
}


Test.kkk(); 正確
Test.ppp(); 錯誤
Test a=new Test();
a.ppp();//正確


----------------------------------------------------------
以下是我寫的範例參考,用來計算n!=多少。


class factorial {
public static void main(String[] args) {
long xxx, n;// 定義我們的答案xxx為長整數
// 定義a是一個factorial()類的新物件
factorial a = new factorial();
// 呼叫a物件的calcute函式,並且給這個函式一個值n(必須是常整數類型),calcute會回傳一個值
for (n = -1; n <= 5; n++) {
xxx = a.calculate(n);
// 在螢幕上顯示n階層=xxx
System.out.println(n + "!=" + xxx);
}
}

// 定義一個公開的函式名字叫做calculate,我們把她用來計算階層
// (long n1)表示它包含一個參數n1(常整數類型)
// 函式不包含void則需要回傳(return)一個值,return的類型是long
public long calculate(long n1) {
//如果n1等於0則回傳答案=1
if (n1 == 0)
return 1;
//如果n1<0則回傳答案等於0
if (n1 < 0)
return 0;
//定義一個ans為long,計算n!的答案
long ans = 1;
for (int i = 1; i <= n1; i++) {
ans = ans * i;
}
//回傳ans給xxx=a.calcute(n)
return ans;

}
}

執行結果










另外用public static long calculate(long n1)的方法如下圖,執行結果一樣。
//*****是原版的寫法




















































如果使用void的方法,將不會回傳值
會變成下面結果。。。














































2015年9月17日 星期四

0918 java long資料型態

關於long常整數的error,需要加一個L告訴編譯器這是一個較大的資料。

2015年9月16日 星期三

0916_simple_app 1+2+3+...=?

因為上課要跟大家分享java用途,
所以我做了一個簡單的app,幫你計算從1+2+3+...+n=?
開發軟體是用eclipse,
用到了 TextView ,EditText ,Button,
也有介紹到byte,short,int,long的資料型態,
簡報裡面有詳細的教學。


簡報和apk檔







2015年8月6日 星期四

150806

我想用java畫下面的函數圖

我先用上一篇貼的方法寫了可以讀取txt數據的程式
顯示的0.01代表成功讀到數據了

再來就遇到一些問題
原本想用g.drawString(".",x,y)把點畫上去,但是x,y只能用整數
後來用Graphics2D的drawString,也只能用到float浮點數

如果要用double的話 就剩下用Graphics2D去畫 Rectangle2D.Double(x,y,w,h,)
意思是畫一個很小的長方形看起來像一個點

最後寫完程式卻發現*.Double()裡面不能放陣列的數據......
只要裡面放了陣列就會變成這樣
弄了我兩三天了還是沒辦法解決....
打算先放著之後再回來研究了  (T-T)

--------------------------------------------------------
import java.awt.*;
import java.awt.event.*;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.awt.geom.*;


public class Awt01 extends Frame{
//public double trans_array[][]; //二維矩陣
public double trans_array[];

static Awt01 frm =new Awt01();
static Graphics2D g2;

public static void main(String[] args) throws IOException {

frm.setTitle("Awt01");
frm.setSize(500,600);
frm.setVisible(true);

FileReader fr = new FileReader("test.txt");
BufferedReader br = new BufferedReader(fr);
String line, tempstring;
String[] tempArray = new String[2];
ArrayList<String> myList = new ArrayList<String>();
int i = 0;
while ((line = br.readLine()) != null) {
// br.readLine()是讀取txt檔的每一行資料,把讀到的資料存到line
// 再將line丟給tempstring去儲存
tempstring = line;

// tempstring.split("\\s") 會依照空白鍵來切割,有幾個空白就切幾次
tempArray = tempstring.split("\\s");

// 按照順序.一行一行的儲存到動態陣列裡面
for (i = 0; i < tempArray.length; i++) {
myList.add(tempArray[i]);
}
}
// tempArray[]是String,一維矩陣
/* 轉換成double的二維矩陣
int k = myList.size() / 2;
int count = 0;
double[][] trans_array = new double[k][2];
for (int x = 0; x < myList.size() / 2; x++) {
for (int y = 0; y < 2; y++) {
trans_array[x][y] = Double.parseDouble((String) myList.get(count));
count++; // 一個index來決定myList讀取值的位置
}
}**/
//轉換成double的一維矩陣
int k =myList.size();
int count=0;
double[] trans_array =new double[k];
for(int x=0;x<myList.size();x++){
trans_array[x] =Double.parseDouble((String) myList.get(count));
count++;
}
System.out.println(trans_array[3]);

}

public void paint(Graphics g) {
Graphics2D g2=(Graphics2D) g;
Line2D linex=new Line2D.Double(0,frm.getHeight()*5/6,frm.getWidth(),frm.getHeight()*5/6);
Line2D liney=new Line2D.Double(frm.getWidth()/6,0,frm.getWidth()/6,frm.getHeight());
g2.draw(linex);
g2.draw(liney);
//for (int t=0;t<5;t++){
Rectangle2D.Double r1=new Rectangle2D.Double(trans_array[t*2-1], trans_array[t*2], 1, 1);
g2.draw(r1);

//}




}
}

---------------------------------------------------------------------
150926 成功畫出東西了!!爽~
晚點再補齊內容







2015年8月3日 星期一

150803

eclipse的偏好設定
參考網站:http://j796160836.pixnet.net/blog/post/31387535-%5Bjava%5D-eclipse%E7%9A%84%E5%81%8F%E5%A5%BD%E8%A8%AD%E5%AE%9A(%E6%93%8D%E4%BD%9C%E7%BF%92%E6%85%A3%E5%92%8C%E5%A5%BD%E7%94%A8%E6%8A%80%E5%B7%A7)

快捷鍵
Ctrl + Shift + F  自動排版
Alt   +  /    開啟字彙選擇框(自動完成框)
Ctrl  +  D  刪除一行
Ctrl  +  /    註解/解除註解多行

Ctrl  +  L  到指定行號(一搬編輯器是Ctrl+G)
Ctrl  +  1   跳出修正建議框

----------------------------------------------------------
awt的繪圖
參考網站:http://web.thu.edu.tw/s922930/www/java%B8p%AD%D7%A4W/0724/ch20.pdf



2015年7月31日 星期五

java0731

1.Error: cvc-complex-type.2.4.d: 從元素 'd:skin' 開始找到無效的內容。此處未預期子項元素。
2.沒有顯示模擬器

-----------------------------------------------------------------------------------------------
解決辦法
 把三個已安裝的檔案移除
選取API22:Android5.1.1