AndroidStudio


Google官方的Android集成開發環境(IDE = Integrated Development Environment),Eclipse + Adt插件的代替者。

實用設置:

android studio是單工程的開發模式 android studio中的application相當於eclipse里的workspace概念 android studio中的module相當於eclipse里的project概念

中文亂碼—–在窗口中,找到IDE Settings->Appearance,在右側勾選上“Override default fonts by”,然后在第一個下拉框中選擇字體為“simsun”,然后apply,重啟IDE,就好了。

設置快捷鍵—–在settings窗口中,找到IDE Settings->keymap,右側打開的就是快捷鍵了。右鍵單擊要修改的快捷鍵,會彈出一個菜單,選擇“Add keyboard shortcut”就可以修改快捷鍵了。刪除的話,在彈出的菜單中選擇remove XXX即可。特別說明,在AS的快捷鍵設置里可以直接設置使用Eclipse快捷鍵還是別的IDE快捷鍵。如果你熱衷Eclipse那么也可設置成Eclipse的快捷鍵。

修改主題—–在IDE Settings->Appearance,右側的Theme選擇自己喜歡的主題即可。個人比較喜歡Darcula主題,也就是如上截圖樣式。

如何將Eclipse工程導入AS使用—–選擇File->Import Project,在彈出的菜單中選擇要導入的工程即可,選擇好以后就直接next,在第二個窗口中也選擇默認的第一個選項就可以。需要注意的是,在AS中,有兩種工程,一個是Project,一個是Module,上面已經細說過了。

導入jar包—–選擇File->Projcet Structure,在彈出的窗口中左側找到Libraries並選中,然后點擊“+”,並選擇Java就能導入Jar包了。或者直接拷貝jar文件到項目的libs文件夾下,然后運行:Sync Project with Gradle Files。然后clean project重新編譯。

刪除項目—–AS對工程刪除做了保護機制,默認你在項目右鍵發現沒有刪除選項。你會發現你的module上面會有一個小手機,這是保護機制。刪除的第一步就是去掉保護機制,也就是讓手機不見,具體做法就是鼠標放在工程上右鍵->open module setting,或者F4進入如圖界面,選中你要刪除的module,然后點擊減號,這樣就取消了保護機制,然后回到項目工程右鍵就可發現刪除選項。注意:刪除會將源文件刪除。

Android Studio目錄結構

新建工程項目后AS的Product目錄結構如下所示:

.idea://AS生成的工程配置文件,類似Eclipse的project.properties。
app://AS創建工程中的一個Module。
gradle://構建工具系統的jar和wrapper等,jar告訴了AS如何與系統安裝的gradle構建聯系。
External Libraries://不是一個文件夾,只是依賴lib文件,如SDK等。

新建工程項目后AS的Module目錄結構如下所示:

build://構建目錄,相當於Eclipse中默認Java工程的bin目錄,鼠標放在上面右鍵Show in Exploer即可打開文件夾,
    編譯生成的apk也在這個目錄的outs子目錄,不過在AS的工程里是默認不顯示out目錄的,就算有編譯結果也
    不顯示,右鍵打開通過文件夾直接可以看。
libs://依賴包,包含jar包和jni等包。
src://源碼,相當於eclipse的工程。
main://主文件夾 
    java://Java代碼,包含工程和新建是默認產生的Test工程源碼。 
    res://資源文件,類似Eclipse。
        layout://App布局及界面元素配置,雷同Eclipse。
        menu://App菜單配置,雷同Eclipse。 
        values://雷同Eclipse。
            dimens.xml://定義css的配置文件。 
            strings.xml://定義字符串的配置文件。 
            styles.xml://定義style的配置文件。
            ......://arrays等其他文件。
        ......://assets等目錄
    AndroidManifest.xml://App基本信息(Android管理文件) 
    ic_launcher-web.png://App圖標 
build.gradle://Module的Gradle構建腳本

對比

對比項 Eclipse + ADT Android Studio
基於 IBM公司的Eclipse JetBrains公司的 IDEA 社區版
運行速度
程序界面 漂亮
編碼速度 快(更智能的提示)
插件 安裝繁瑣 安裝簡單,自帶很多插件
版本控制 需額外安裝
內存占用
編譯 ANT gradle
依賴網絡
其他   內置終端; UI編輯支持多屏預覽;多APK打包

界面

  • 整體
  • 菜單 -File
  • 菜單 - Build

  • 快捷工具

  • Project視窗

-Structure視窗

  • 代碼編輯區域



  • 代碼編輯- 布局文件的多屏預覽

  • Android 監控

  • Message


Gradle相關

概念

Gradle是一個基於Apache Ant和Apache Maven概念的項目自動化建構工具。它使用一種基於Groovy的特定領域語言來聲明項目設置,而不是傳統的XML。當前其支持的語言限於Java、Groovy和Scala,計划未來將支持更多的語言。

https://zh.wikipedia.org/zh/Gradle

編譯過程

http://developer.android.com/tools/building/index.html

Gradle相關文件

  • 重要

project 中的 settings.gradle 說明

  1. // 這個Project中有2個Module
  2. include ':app', ':percent-23.1.0'

project 中的build.gradle說明

  1. // 構建腳本
  2. buildscript {
  3. // 倉庫
  4. repositories {
  5. // 中央倉庫 https://bintray.com/bintray/jcenter
  6. // 通過jar包的字符串包名,就可以下載到jar包了
  7. // 成熟的公司可能會有自己的倉庫服務器,需要在此配置
  8. jcenter()
  9. }
  10. dependencies {
  11. // android gradle構建工具,用於處理module下的build.gradle文件,此版本與Gradle版本有配套關系,目前gradle已經到2.8了,但主要使用的是2.4
  12. classpath 'com.android.tools.build:gradle:1.3.0'
  13. // NOTE: Do not place your application dependencies here; they belong
  14. // in the individual module build.gradle files
  15. }
  16. }
  17. // 所有項目都依賴於jcenter
  18. allprojects {
  19. repositories {
  20. jcenter()
  21. }
  22. }
  23. // gradle在執行構建任務時的清理配置
  24. task clean(type: Delete) {
  25. delete rootProject.buildDir
  26. }

module中的build.gradle詳細說明

  1. // 表示這個項目編譯完成后,是一個anrdoid應用程序
  2. apply plugin: 'com.android.application'
  3. // 表示這個項目編譯完成后,是一個anrdoid的庫
  4. //apply plugin: 'com.android.library'
  5. android {
  6. // 編譯的sdk版本,見sdk\platforms
  7. compileSdkVersion 23
  8. // 構建工具的版本,見sdk\build-tools
  9. buildToolsVersion "23.0.1"
  10. defaultConfig {
  11. // 包名:用於在市場上區分應用的唯一性的標示
  12. applicationId "cn.itcast.as.helloworld"
  13. // 最小sdk版本、目標sdk版,原先是放在清單文件中的
  14. minSdkVersion 15
  15. targetSdkVersion 23
  16. // 應用程序的版本號,和版本碼,原先是放在清單文件中的
  17. versionCode 1
  18. versionName "1.0"
  19. }
  20. // 構建類型
  21. buildTypes {
  22. // debug版默認有配置,沒有寫在這里
  23. // 發行版
  24. release {
  25. // 是否混淆
  26. minifyEnabled false
  27. // 混淆配置文件
  28. proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
  29. }
  30. }
  31. }
  32. // 關鍵:項目的依賴
  33. dependencies {
  34. // 在項目中的libs中的所有的.jar結尾的文件,都是依賴
  35. compile fileTree(dir: 'libs', include: ['*.jar'])
  36. // 依賴於junit測試
  37. testCompile 'junit:junit:4.12'
  38. // 還依賴於appcompat-v7,23.1.0版本
  39. compile 'com.android.support:appcompat-v7:23.1.0'
  40. }
  • 其他
所屬 文件 類型 作用
Project .gradle 文件夾 配置文件,無需更改、關注
Project gradle 文件夾 包含了gradle-wrapper相關文件,無需更改、關注
Project gradle.properties 文件 gradle啟動的配置,如java虛擬機的內存占用等,一般無需修改
Project gradlew/gradlew.bat 文件 初始化gradle相關變量的腳本

 


 

文件和文件夾說明

  • Project根目錄
文件/文件夾 說明
.idea/ IDE的Project相關設置
app/ 默認建立的module目錄
build/ 打包的臨時目錄
gradle/ gradle的相關目錄
.gradle/ gradle的相關目錄
.gitignore git同步時的忽略的文件
builder.gradle Project的gradle依賴
gradle.properties project的gradle配置
gradlew 執行gradle構建的腳本(un*x)
gradlew.bat 執行gradle構建的腳本(windows)
local.properties SDK目錄設置
Project.iml 存放module信息
settings.gradle Project下有哪些Module
  • module目錄
文件/文件夾 說明
build/ 編譯的中間數據、最終apk存放目錄
build/source/r/debug/R.java R文件
build/outputs/apk/ APK文件默認位置
libs/ 導入的jar包存放的位置
src/ 源碼(java、xml、..)
src/androidTest/ 測試代碼存放位置
src/main/java/your/package/name java代碼
src/main/jniLibs/ 動態連接庫所在目錄
src/main/assets/ 資產文件存放目錄
src/main/res/ 資源目錄
src/AndroidManifest.xml 清單文件
src/main/res/mipmap/ 一般放置應用圖標
app.iml 存放module信息(由AS創建)
build.gradle gradle的構建文件
proguard-rules.pro 混淆設置

 


 

設置

  • 文件編碼
  • 程序外觀
  • 編輯區域外觀

  • logcat外觀

 


 

快捷鍵

視窗快捷鍵

代碼補全

快捷鍵方案修改 && 編輯快捷鍵

 

活動模板

 

后綴補全

 

亂碼問題

 

 

  1. tasks.withType(Compile) {  
  2.     options.encoding = "UTF-8"  
  3. }

dub常用快捷鍵

動作 按鍵
刪除行 Ctrl + Y
復制一行 Ctrl + D
上下移動代碼 Alt + Shift + Up/Down
格式化代碼 Ctrl + Alt + L
優化導導包 Alt + Ctrl + O
大小寫轉換 Ctrl + Shift + U
打開文件 兩次shift
注釋代碼(//) Ctrl + /
注釋代碼(/**/) Ctrl + Shift + /
生成代碼 Alt + Insert
快速定位錯誤 F2
查找 Ctrl + F
查看繼承關系 Ctrl + H
查找+替換 Ctrl + R
快捷覆寫方法 Ctrl + O

序號

功能

Eclipse快捷鍵

Android Studio

快捷鍵

 

快速修復

(實現接口方法、強制類型轉換、導包)

Ctrl + 1

Alt + Enter

 

刪除光標所在行(選中行)

Ctrl + D

Ctrl + Y

Ctrl + X

 

復制光標所在的行(選中行)

Ctrl + Alt + Up/Down

Ctrl + D

 

格式化代碼(java、xml)

Ctrl + Shift + F

Ctrl + Alt + L

 

快速創建局部變量

Ctrl + 2,L

Ctrl + Alt + V

 

局部變量變為成員變量

Ctrl + 1

Ctrl + Alt + F

或者

alt+enter 選擇

 

上下移動選中的行

Alt + Up/Down

Ctrl + Shift + Up / Down

 

重命名

Ctrl + Shift + R

Shift + F6

 

方法參數提示

Alt + /

Ctrl + P

 

打印輸出

syso

sout

 

快速重寫方法

 

Ctrl + O輸入方法名上下方向鍵選擇后回車

 

快速定位到任意的文件

 

按兩次shift

 

快速定位到某一個類或文件

 

Ctrl + N:查找類

Ctrl + Shift + N:查找文件

 

顯示類結構窗口(Outline

 

Alt + 7

 

快速定位到類中的方法或屬性

Ctrl + O

Ctrl + F12

 

快速查看類繼承結構

Ctrl + T

Ctrl + H

 

快速查看方法在哪里被調用

 

Ctrl + Alt + H

 

快速定位到當前類報錯或警告的地方

 

F2 或Shift+F2

 

快速定位到類或方法的定義

 

Ctrl+B

 

代碼助手,自動補全

Alt + /

Ctrl + Alt +空格:屬性名、類名或接口名提示

Ctrl + Shift +空格:

方法提示

 

窗口最大化

ctrl + M

Ctrl +Shift + F12

 

快速選中字符串

雙擊

Ctrl + W

 

最近編輯的文件列表

 

Ctrl + E

 

搜索或替換

Ctrl + F

Ctrl + F

Ctrl + R

 

全局搜索或全局替換

Ctrl + H --> File Search

Ctrl + Shift + F

在選中的文件目錄里搜索

Ctrl + Shift + R

在選中的文件目錄里替換

 

導入包

Ctrl + Shift + O

(導包並自動清除沒有用到的包)

Alt+回車:導入當前包

Ctrl + Alt + O:刪除沒用到的包。

也可設置自動導包,勾選:

Add unambiguous imports on the fly

 

選中變量快速跳轉到下一個

Ctrl + K

Alt + F3, F3

 

光標所在上一個

或下一個的位置

Alt + Left / Right

Ctrl + Alt + Left / Right

 

顯示JavaDoc(注釋文檔)

 

Ctrl + Q

 

生成 get/set方法、構造方法、toString()

 

alt + insert

 

撤銷

Ctrl + Z

Ctrl+Z

 

恢復

Ctrl + Y

Ctrl+Shift+Z

 

注釋

Ctr + / 單行

Ctrl + Shift + / 多行

同左

 

回車換行

(光標定位到下一行)

Shift + Enter

同左

 

回車換行

(光標定位到上一行)

Ctrl + Shift + Enter

Ctrl + Alt + Enter

 

復制文件名

選中文件后Ctrl + C

同左

 

復制類的全局路徑

(包名加類名)

右擊-->

Copy Qualified Name

Ctrl + Shift + Alt + C

(右擊--> Copy Reference)

 

大寫/小寫

Ctrl + Shift + X

Ctrl + Shift + Y

Ctrl + Shift + U

 

回到上一次編輯的位置

Ctrl + Q

Ctrl + Shift + Backspace

 

視圖顯示與隱藏

 

Alt + 數字

 

關閉文件

 

Shift + 點擊

 

 

 

  自動修正
Command + N 自動生成代碼(Getter Setter)
Command + Alt + L 格式化代碼
Contral + Shift + F 格式化代碼(定制)
Command + Alt + T 把選中的代碼放在 try{} 、if{} 、 else{} 里
Command + / 注釋 //
Command + Shift + / 注釋 /* */
Command + Shift + Up/Down 語句上下移動
Option + Shift + Up/Down 內容上下移動
Option + Command + M 將選中代碼塊封裝成一個方法
Command + D 復制當前一行(或選擇區域),並粘貼到下面
Command + Z 后退
Command + Shift + Z 前進
Control + Alt + O 優化導入的包
Ctrl(Command)+ - / + 折疊/展開代碼
Ctrl(Command)+Shift+ - / + 折疊/展開全部代碼
Ctrl(Command)+Shift+. 折疊/展開當前花括號中的代碼
Command + Y 快速查看代碼實現
Contral + H 查看繼承關系
Contral + Alt + H 查看調用關系
Command + [ 返回上一次查看的位置
Command + ] 前進到返回之前查看的位置
Command + J 自動生成代碼
Command + E 查看最近打開的文件

http://www.cnblogs.com/dubo-/

建議調整的快捷鍵:

(1)刪除: ctrl + y,一只手能輕易的按下這兩個鍵嗎?建議修改為eclipse的ctrl+D

(2)復制選中的多行:

默認居然沒有快捷鍵,可以在keymap中的duplicute lines設置為eclipse的ctrl + alt + 向上

 


 

調試

進入調試的兩種方式

  • 以調試模式運行

  • 運行后調試

    需要注意 運行的程序的代碼應該與所看到的是同一份,不然點擊提示會錯位

如何打斷點

  • 代碼左側單擊

  • 代碼左側單擊時按着shift鍵

斷點類型

斷點類型 什么時候會停下來 注意
行斷點 執行到此行
成員變量斷點 被賦值 或 訪問 art虛擬機提供,需安卓5以上設備才有此功能
方法斷點 進入方法或退出方法 會影響代碼執行的效率,慎用
異常斷點 出現了未捕獲異常 及 捕獲的異常 默認不開啟

 


 

導入module

導入Eclipse項目

File –> New –> Import Module

導入AndroidStudio項目

File –> New –> Import Module

導入AAR

File –> New –>New Module –> Import .jar/.aar package

刪除導入的Module

當文件夾上顯示了手機或柱狀圖 圖標,說明此文件夾是受保護的,無法被刪除

  1. 取消保護

打開Project Struecture。 選中要刪除的module,點上面的減號。 然后點確定

  1. 刪除文件

在原來是module的文件夾上點擊鼠標右鍵,選中delete,在彈出的對話框上點確定。

 


 

導入依賴

導入Library


導入文件jar包

導入Module依賴

對應關系

 


 

插件管理

安裝插件的兩種方式

  • 本地安裝
  • 網絡安裝

ButterKnife Zelezny的使用

打包APK

 


 

混淆

作用及意義

  • 減小apk大小,刪除無用的類和方法
  • 避免被反編譯后重要的程序邏輯暴露

配置

app/build.gradle

  1. buildTypes {
  2. release {
  3. // false ,關閉混淆
  4. // true , 開啟混淆
  5. minifyEnabled false
  6. // proguard-android.txt 是通用的混淆配置文件,放在sdk中 (sdk\tools\proguard\)
  7. // proguard-rules.pro 是項目都有的混淆配置文件 ,在項目的根目錄中
  8. proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
  9. }
  10. }

通用混淆文件說明

  1. # 以#開頭的都是注釋,下同
  2. # This is a configuration file for ProGuard.
  3. # http://proguard.sourceforge.net/index.html#manual/usage.html
  4. # 不使用大小寫混合的類名
  5. # 比如說 a.java A.java。因為在windows下文件名是不區分大小寫的,會導致文件的覆蓋
  6. -dontusemixedcaseclassnames
  7. # 混淆第三方jar
  8. -dontskipnonpubliclibraryclasses
  9. # 打印更多日志
  10. -verbose
  11. # Optimization is turned off by default. Dex does not like code run
  12. # through the ProGuard optimize and preverify steps (and performs some
  13. # of these optimizations on its own).
  14. # 不做做優化(有時會弄巧成拙)
  15. -dontoptimize
  16. # 不做預校驗
  17. -dontpreverify
  18. # Note that if you want to enable optimization, you cannot just
  19. # include optimization flags in your own project configuration file;
  20. # instead you will need to point to the
  21. # "proguard-android-optimize.txt" file instead of this one from your
  22. # project.properties file.
  23. # 保留注解上的屬性
  24. -keepattributes *Annotation*
  25. # 保留此類(com.google.vending.licensing.ILicensingService)不被混淆,google需要用到
  26. -keep public class com.google.vending.licensing.ILicensingService
  27. # 保留此類( com.android.vending.licensing.ILicensingService)不被混淆,google需要用到
  28. -keep public class com.android.vending.licensing.ILicensingService
  29. # For native methods, see http://proguard.sourceforge.net/manual/examples.html#native
  30. # 保持 native 方法不被混淆,混淆后不能正確調用底層方法了
  31. -keepclasseswithmembernames class * {
  32. native <methods>;
  33. }
  34. # keep setters in Views so that animations can still work.
  35. # see http://proguard.sourceforge.net/manual/examples.html#beans
  36. # 保留任何直接或間接繼承與View的類的setget開頭的方法,不被混淆
  37. -keepclassmembers public class * extends android.view.View {
  38. void set*(***);
  39. *** get*();
  40. }
  41. # We want to keep methods in Activity that could be used in the XML attribute onClick
  42. # 保留直接或間接繼承於Activity的類的 點擊事件方法不被混淆,因為混淆后布局文件寫的點擊事件方法就會找不到
  43. -keepclassmembers class * extends android.app.Activity {
  44. public void *(android.view.View);
  45. }
  46. # For enumeration classes, see http://proguard.sourceforge.net/manual/examples.html#enumerations
  47. # 保留枚舉類的如下 values valueOf方法
  48. -keepclassmembers enum * {
  49. public static **[] values();
  50. public static ** valueOf(java.lang.String);
  51. }
  52. # 保留實現了Parcelable 接口的類的靜態CREATOR常量
  53. -keepclassmembers class * implements android.os.Parcelable {
  54. public static final android.os.Parcelable$Creator CREATOR;
  55. }
  56. # 保留R.java中的及內部類的的所有靜態字段
  57. -keepclassmembers class **.R$* {
  58. public static <fields>;
  59. }
  60. # The support library contains references to newer platform versions.
  61. # Don't warn about those in case this app is linking against an older
  62. # platform version. We know about them, and they are safe.
  63. # 告訴ProGuard不要警告找不到android.support開頭的包名.
  64. -dontwarn android.support.**

項目特有的常用的混淆語法

  • 特定的類不被混淆
    -keep class package.name.Klass {*;}
  • 某個包下的類不被混淆
    -keep class package.name.** {*;}
  • 繼承與某類的類不被混淆
    -keep class * extends java.lang.annotation.Annotation { *; }

使用第三方jar包在混淆后出錯

一般,都可以在網站上找到相應的混淆配置

比如

 


 

多APK打包

意義

  • 國內現狀: 多個電子市場可提供apk的下載,用於統計市場的作用
  • 同一個應用程序,給不同的客戶,需要連接不同的服務器

步驟

1 在清單文件中添加metadata

  1. <application
  2. ...... >
  3. <!-- market 表示鍵 ${MARKET}表示值 ,用${}表示會變......-->
  4. <meta-data android:name="market" android:value="${MARKET}"/>
  5. <!-- ......-->
  6. </application>

2 在程序中獲得metadata並使用

  1. //TODO 從sp中獲取是否是第一運行
  2. boolean isFirstRun= true;
  3. if(isFirstRun){
  4. // 通過PackageManager拿到在清單文件中記錄的metadata信息
  5. PackageManager packageManager = getPackageManager();
  6. String packageName = getPackageName();
  7. int flag = PackageManager.GET_META_DATA;
  8. // 表示我們獲取當前應用程序的application下的metadata數據
  9. ApplicationInfo applicationInfo = packageManager.getApplicationInfo(packageName, flag);
  10. // 傳入鍵名,拿到鍵值
  11. String market = applicationInfo.metaData.getString("market");
  12. //TODO 獲取imei
  13. String imei = "123456";
  14. // TODO 自己實現代碼
  15. sentToServer(market, imei);
  16. //TODO 寫入sp,下次啟動程序就不發送了
  17. }

3 添加flavor動態修改metadata

  1. android{
  2. //......
  3. productFlavors {
  4. _360 {
  5. manifestPlaceholders = [MARKET: "_360"]
  6. }
  7. wandoujia {
  8. manifestPlaceholders = [MARKET: "wandoujia"]
  9. }
  10. anzhi {
  11. manifestPlaceholders = [MARKET: "anzhi"]
  12. }
  13. }
  14. }

 


 

版本控制

SVN環境

  • 安裝TortoiseSVN

    !!! 注意勾選 command line client tools

  • 在as中,設置svn的命令行工具

    settings –> Version Control –> Subversion –>General –> use command line client
    選中TortoiseSVN的安裝目錄中的bin文件夾中的svn.exe

上傳本地代碼

  • 設置同步
    settings –> Version Control
    把project后面加上版本控制的類型

  • 設置忽略文件
    settings –> Version Control –> Ignored Files
    3種方式:特定文件、指定目錄下的文件、特定規則文件

  • 提交目錄

    project 右鍵 –> Subversion –> share directory
    這一步只提交了目錄,文件並沒有上傳到服務器

  • 上傳文件

    project 右鍵 –> Subversion –> submit directory

下載服務器的代碼

在Welcome to Android Studio界面,點擊第三個Check out project from Version Control

提交代碼,編輯沖突

project 右鍵 –> Subversion –> submit directory

好習慣:先update,再submit

  • 沖突的解決
    3種 接受服務器的,接受自己的,合並

英文 含義
Accept Theirs 用服務器的覆蓋本地的
Accept Youts 用本地的覆蓋服務器的
Merge 查看服務器和本地的,最終決定提交的內容

!!! 注意,在合並后,還需要submit

斷開連接

  • 斷開連接
    1. 先刪除配置
      在settings –> version control -掉同步文件夾

2. 再刪除文件
 刪除.svn文件夾

  • 忘記記錄的用戶名和密碼

settings –> version control –> subversion –>clear auth cache

http://www.cnblogs.com/dubo-/

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM