Android library aar format on maven

最近試著將自己寫的 Android Library Push 上 Maven,

並且使用最新的 aar 格式,

網路上查了一下,

並沒有詳細的中文教學,

靠著自己摸索和一些舊資料完成了,

在這邊紀錄一下,以免忘記,

  1. 第一步需要再 sonatype 上申請帳號,

申請網址:https://issues.sonatype.org/secure/Signup!default.jspa

2.

登入以後再首頁點擊Create Issue

會跳出一個視窗表格,請依照下列方式填寫,

Create Issue
Project Community Support - Open Source Project Repository Hosting
Issue Type New Project
Summary 簡介,簡單介紹一下自己的 Open Source Project
Group Id 以後發布要用的網域,官網有詳細教學
不知道怎麼填寫的話,因為我是放在 Github 上,
所以我就是用com.github.semoncat,可以參考我的改成自己喜歡的ID,
這部分非常重要,以後不能再改,
更改就要 重新申請 ,所以請慎選。
Project URL Github 上的網址
SCM url 版本控管的位置

填寫完成以後,就可以等待管理員回復,

因為是人工審核,所以回復的時間不一定,

但是都蠻快的,美國上班時間通常就會馬上回復,

管理員回復以後,就會開通上傳的權限。

3.

接下來需要產生 GPG Key ,

類似 Google Play Store Key ,

上網搜尋有很多 GPG Key 的產生法,

產生完以後要上傳到 Key Server 或者存在本機都是 OK 的,

最主要就是需要 Key 的存取路徑,

所以完成以後請把 GPG Key 的路徑記錄下來,

稍後會用到!

4.

接下來就是設定 Android Library 的部分了,

因為我是使用Android Studio

所以接下來的教學都以 Android Studio 為主。

請打開自己的 Project ,

這邊設定其實非常複雜,

好在有高人也寫好 Library - gradle-mvn-push (這居然也有 Libraray ),

非常方便套用,

Github 上有詳細的教學,

補充一些作者省略的設定

build.gradle
1
allprojects {
    version = VERSION_NAME
    group = GROUP

    repositories {
        mavenCentral()
    }
}
USER_HOME/.gradle/gradle.properties
1
NEXUS_USERNAME= sonatype 帳號
NEXUS_PASSWORD= sonatype 密碼
signing.keyId= GPG Key ID
signing.password= GPG Key Password
signing.secretKeyRingFile= GPG Key Path ,it's can be a local path or http.

之後就可以使用指令gradlew clean build uploadArchives上傳自己的專案了,

之後應該會收到已經 Release 的 EMail ,

收到以後,

請回到申請開通帳號的 Commit 上通知管理員,

管理員幫你開通以後,

之後就可以自由的使用該 Group ID 上傳專案了!

不需要再如此繁瑣的程序!

PS.關於申辦 sonatype 帳號的部分,可能會因為網站改版而異動,還請參考官方教學申請!

補充資料

  1. http://blog.moetang.net/archives/480
  2. https://docs.sonatype.org/display/Repository/Sonatype+OSS+Maven+Repository+Usage+Guide

XML解析套件 - Simple

最近想找個類似 GSON 的 XML 解析套件,

發現 GSON 真是太強了,

大部分的 XML 解析套件實在有夠難用,

勉強找到一款堪用的,

Simple

但是用起來跟 GSON 還是差了十萬八千里,

但是官網範例寫的比 GSON 好就是了,

官網已經有非常詳細的教學,

這篇主要會稍微提一下關於 List 的部分,

以下是一個 XML 的例子

1
2
3
4
5
6
7
8
9
10
11
12
13
<parent name="john" id="1">
<children>
<child id="2" name="tom">
<parent ref="1"/>
</child>
<child id="3" name="dick">
<parent ref="1"/>
</child>
<child id="4" name="harry">
<parent ref="1"/>
</child>
</children>
</parent>

以上 XML 只要使用 以下 Bean 就可以成功讀取

Parent
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
@Root
public class Parent {

private List<Child> children;

private String name;

@Attribute
public String getName() {
return name;
}

@Attribute
public void setName(String name) {
this.name = name;
}

@Element
public void setChildren(List<Child> children) {
this.children = children;
}

@Element
public List<Child> getChildren() {
return children;
}

public void addChild(Child child) {
children.add(child);
}
}

Child
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
@Root
public class Child {

private Parent parent;

private String name;

public Child() {
super();
}

public Child(Parent parent) {
this.parent = parent;
}

@Attribute
public String getName() {
return name;
}

@Attribute
public void setName(String name) {
this.name = name;
}

@Element
public Parent getParent() {
return parent;
}

@Element
public void setParent(Parent parent) {
this.parent = parent;
}
}

其中要注意的是Child的父節點<children>是必須的,

不然讀不到,

還有,

如果要implements Serializable

必須使用Serializer mSerializer = new Persister();來建構,

這是我今天使用後的一些心得記錄。

Android Debug Tool - Hugo

在 Github 上看到一個好用的 Plugin - Hugo

這個工具可以很方便的顯示一些 Debug Info ,

例如 Function 的傳入值、回傳值、執行時間…等,

引入的方式也非常簡單,

  1. build.gradle
1
2
3
4
5
6
7
8
9
10
11
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:0.7.+'
classpath 'com.jakewharton.hugo:hugo-plugin:1.0.1'
}
}
apply plugin: 'android'
apply plugin: 'hugo'

2.

1
2
3
4
5
@DebugLog
public String getName(String first, String last) {
SystemClock.sleep(15); // Don't ever really do this!
return first + " " + last;
}

然後你的 LogCat 就會出現以下訊息!

1
2
D/Example: ⇢ getName(first="Jake", last="Wharton")
D/Example: ⇠ getName [16ms] = "Jake Wharton"

非常方便的一個 Debug 工具!

MirrorOp Cracked Tutorial

反編譯工具組

  1. 將目標Apk放在反編譯工具組的Target。

  2. 打開反編譯工具組。

  3. 鍵入 C 以設定 Apk 名稱。

  4. 鍵入 S 以反編譯 Apk。

  5. 搜索所有 SMALI 檔案,關鍵字為Lcom/awindinc/sphone2tv/Global;->m_LicensedType:I

  6. 將SMALI文件中sget的後面的判斷刪除。

  7. 打開String XML,找到跟提示未註冊視窗有關的 string name。

  8. 利用該關鍵字搜尋 public.xml ,獲得該 string name 的 ID 。

  9. 利用該ID 搜尋所有 SMALI 檔案,找到 AlertBuilder 相關程式碼。

  10. AlertBuilder.Show()刪除,到此破解完成。

參考資料

Android Distance Sorting

最近專案有一個需求,

需要將飲料店從距離近的列到距離遠的,

網路上查都是說先取出來再用Array去Sort,

對大量資料來說,

這樣完全沒有用,

終於在Stackoverflow找到比較好的解法,

首先,取得自身的GPS座標以後,

在自身座標上加上自己想要的範圍,

例如兩公里內,

然後取得區間的經緯度,

在使用這樣的SQLite指令,

select * from points where lat between ? and ? and lon between ? and ?

就可以很順利的取得周圍的地標了!

Android Studio NoClassDefFoundError

最近開始使用Android Studio,

一開始實在是頗痛苦,

今天又遇到這個奇怪的Bug,

函式庫一直無法引入,

最後終於在Stack Overflow找到解法,

在Android Studio中,

Tools -> Open Terminal…

在命令列中打入

gradlew clean

就OK了。

Android Library Project 存取 Assets 的方法

根據官方文檔表示

Library projects cannot include raw assets

也就是說,主 Project 無法存取 Library 中的 Assets 資料夾,

我覺得這非常不方便,

網友建議的解法通常是在複製一份 Assets 到 主 Project,

可是我覺得這方法很蠢,

終於在 Stackoverflow 中找到比較好的解法

  1. 在 Library Project 的 Assets 目錄下,在建立一個 Assets 目錄,其他資源就直接擺這個目錄,

    也就是說,假設原本目錄是 /Assets/Test.txt , 現在的目錄就會變成 /Assets/Assets/Test.txt

  2. 在 主 Project 中 按右鍵 -> Build Path -> Link Source…。

  3. 選擇 Variables -> New…。

  4. Name 填入你想要的名字,
    Location 選擇 Library Project 中的 /Assects 資料夾,選第一層就好,不要選到第二層 Assets。

  5. 新增完成以後 Link 到你的專案就完成了。

Tardis 紙模

DSC_0045.jpg

好久沒做紙模了,

剛好看到 Doctor Who 官方粉絲團正在辦活動,

釋出了 Tardis 的紙模,

看了很手癢,

剛好女王生日也快到了,

來裝送她的禮物,

不過技術差了,

做出來效果不好,

這次做完真想重回紙模世界,

感覺有好多事情想做,

但是時間卻好少。