Translate

2014년 10월 24일 금요일

[IntelliJ][Android] Package Name 변경하기




지우지 못하는 이미 설치되어(embeded)있는 App을 루팅없이 다시한번 설치하려면 Package Name 변경이 필요하다. (정확히는 Application ID)


========================
2015.04.23 추가
기존의 방법대로 변경 시 R을 인식하지 못하는 문제가 있어서 다시 기술을 한다.
(안되는 분이 있다면 댓글을 달아주시면 좋을텐데.. 아무도 댓글을 달아주지 않는다;;)

========================
2015.04.30 추가
Gradle 없는경우 java packagename 을 변경하지 않고 설치 시 사용하는 id(applicationId) 만 변경하여 단말기에 빌드하는 방법을 추가.



Android Studio 에서의 방법

확인버전: Android Studio 1.1.0

1. gradle 을 사용하는 경우
  - Android Studio 에서 프로젝트를 만들거나 import 시 gradle 만들겠다고 체크한경우

1004lucifer
아래와 같이 gradle 파일에서 applicationId 를 변경해 주면 된다. (간단)


PS. 주의
com.android.application 이 단말기에 설치되어 있는경우
위의 방법을 사용 시 AndroidManifest.xml 의 <permisstion> 태그의 name 변경이 필요하다.
Gradle 에서 applicationId 만 변경 시 permission이름이 자동으로 바뀌지 않는데 Lollipop 에서는 같은 이름의 퍼미션을 허용하지 않는다.




2. gradle 을 사용하지않는 경우
  - 기존에 Eclipse 에서 사용하던 프로젝트를 import 할 시 gradle 없이 import가 가능한데 그때에 사용 가능한 방법이다. (링크: gradle 없이 Module import 방법)
1004lucifer


  1) package name 선택 => Refactor => Rename




  2) "Rename package" 선택




  3) 원하는 package name으로 변경
1004lucifer



  4) AndroidManifest.xml 에서 package 이름에 마우스 커서를 클릭 후 Rename 선택




  5) 변경 원하는 동일한 package name 입력



  6) "Save All" 선택 후 새로운 package 에 R파일이 생성되었는지 확인



위와같이 작업 후 빌드를 하면 변경된 ApplicationID로 빌드가 된다.





IntelliJ 에서의 방법

확인버전: IntelliJ 14.1
1004lucifer
Android Studio - gradle 없는 방법으로 똑같이 작업을 하면 된다.





PS.
위의 방법으로 대부분의 작업이 자동으로 Package Name 변경이 이루어 지는데
(Gradle 사용, 미사용 둘다)

1. aidl 파일
2. String 문자로 이루어진 Package Name
위의 두개의 경우에는 자동으로 변경되지 않으며 수동으로 변경을 해주어야 한다.

빌드를 해보면 에러가 나거나 앱 실행중에 앱이 죽으며 로그를 남기거나 한다.
2번의 경우는 ContentProvider Uri 에 사용되는 Package Name 이 String으로 되어있다보니 자동으로 변경되지 않아 직접 변경을 해 주었다.







VS





Gradle이 없는 상황에서의 위의 방법은 Source의 packagename 이 모두 변경이 된다.
(이거자체는 문제가 안된다.)
하지만 회사의 프로젝트의 경우 아무렇게나 커밋을 할 수 있는 상황이 아니다보니 예상밖의 문제점이 생겼다.
1004lucifer
문제가 되는 부분은 packagename 을 변경 시 모든 java파일의 packagename 을 변경을 하면서 원하지 않던 부분이 변경되는 부분에 문제가 있었다.
(packagename 을 다시 되돌려도 많은 java파일과 xml이 수정되어 있다. - 자동 최적화)

1. AndroidManifest.xml 파일
  - <activity> 태그의 name 속성의 Class 경로가 모두 점(.) 으로 시작되도록 수정되었다.
2. 대부분의 java 파일
  - 사용되지 않는 Class는 import 가 삭제되었다.
  - 문자열 마지막에 필요없는 공백이 삭제되었다.


분명 위의 기능 자체는 좋은 기능이긴 한데 수정된 파일이 너무 많이 생겨버리다보니 어떤 파일을 커밋해야 할지 헷갈려 버리는 문제가 생겨버렸다.



IntelliJ의 버그인지는 잘 모르겠지만 Source의 packagename 을 변경하지 않고 단말기에 프로그램을 설치할 수 있는 방법을 기술한다.


1. 아래와 같이 Project 를 빌드한다. (에러가 없는 상태이어야 한다.)



2. AndroidManifest.xml 파일수정
  [아래의 package 이름을 변경한다. ex)com.test => com.test1 ]
  - <manifest package="com.test">
  - <provider android:authorities="com.test" />
  - <permission android:name="com.test.Permission" /> (선택: Lollipop 에서는 중복 퍼미션을 허용하지 않는다. 같은 앱이 설치되어 있다면 변경해야 한다.)

3. 그외 java 에서 String으로 package명이 기술되어 있다면 수정이 필요할 수 있다.
  (꼭 수정이 되어야 한다면 빌드시 오류가 나거나 앱 실행시 종료가 되어버린다. 로그를 보고 수정하는게 편할 수 도 있다.)
1004lucifer
4.  Run 실행을 하면 단말에 설치가 된다.


PS. 주의
위의 작업 후 Ctrl+s 라던지.. 'Save All' 버튼을 누르지 않도록 주의한다.
위의 상태는 컴파일은 com.test 로 컴파일이 되어있는 상태에서 ApplicationID 만 com.test1 으로 단말기에 설치하는 방법이며 위의 상태에서 컴파일이 된다면 Source 파일에서 R파일 관련하여 오류가 발생을 한다.
그런 경우에는 <manifest package="com.test1"> 부분을 Rollback 후 다시 Project 빌드를 한 후 차례대로 위의 방법대로 따라한다.

꼭 2번의 작업 전에 1번의 작업과 같이 Project 빌드가 끝난 후 작업을 해주어야 단말기에 정상적으로 설치가 된다.

















=======================================
아래의 방법은 현재는 정상적으로 Package 이름이 변경이 되지 않을 수 있다.
상단의 방법을 참고.



1. Manifest 파일
1004lucifer
  1) manifest 태그의 package 속성값 변경
    - <manifest package="com.test1"

=====================================
2015.03.31 추가 (IntelliJ 14.1 에서 테스트 완료)
단순히 문자열만 변경해서는 에러가 나며 제대로 되지 않아 패키지명 변경 시 아래와 같이 작업을 해주어야 한다.

1. AndroidManifest.xml 파일을 열고 package 이름에 커서를 올려 놓은 후 'Refactor => Rename' 선택 (단축키 shift + F6)

2. 변경 할 패키지 이름을 적고 Refactor 버튼 클릭
=====================================



  2) provider 태그의 authorities 속성값 변경
    - <provider android:authorities="com.test1"

  3) permission 태그의 name 속성값 변경 (lollipop 에서는 중복된 퍼미션 허용이 안됨)
    - <permission android:name="com.test.permission.TIME_TICK2"

2. Manifest 파일의 Provider 태그의 name 값에 있는 Class 에서 사용하는 패키지 명 변경




PS.
이클립스도 마찬가지로 위와같이 변경이 가능한 것으로 기억하고 있다.



====================================
간단한 테스트 프로젝트에서는 정상적으로 되지만 현재 작업중인 프로젝트에서는 아래의 방법대로 했을 시 정상적으로 이용이 되지 않아 위의 방법을 사용하고 있다.



JetBrains 사이트에서 변경방법을 참고했다.
http://www.jetbrains.com/idea/webhelp/renaming-an-application-package-(application-id).html






변경 방법은 다음과 같다.
(Android Studio 역시 크게 다르지 않을 것으로 예상한다.)

1004lucifer
1. AndroidManifest.xml 파일을 열고 package 이름에 커서를 올려 놓은 후 'Refactor => Rename' 선택 (단축키 shift + F6)



2. 변경 할 패키지 이름을 적고 Refactor 버튼 클릭



3. 'File => Save All' 선택
    (IntelliJ 툴은 파일을 변경하면 따로 저장버튼을 누르지 않더라도 자동으로 저장이 되지만 이상하게도 cmd + S 를 누르고 나서야 gen 디렉토리에 반영이 되었다.)



3. 'gen => package_name' 변경이 되었는지 확인



4. 'src => package_name' 선택 후 'Refactor => Rename' 선택 (단축키 shift + F6)



5. 'Rename directory' 선택


1004lucifer
6. 변경 할 패키지 이름을 적고 Refactor 버튼 클릭



7. 실행 시 다음과 같은 오류가 나면서 수행이 되지 않는다.
(Error: {package_name}/{Activity} is not an Activity subclass or alias)


1004lucifer
8. 'Activity => Launch' 항목에서 패키지 이름을 정상적으로 고친 후 다시 실행




댓글 없음 :

댓글 쓰기