APK 파일 상태에서 Package Name을 변경하는 방법을 공유 합니다.
필요한 툴은 apktool 이 필요합니다.
apktool을 이용하여 Decompile 하고
패키지명 수정후에 다시 apktool 을 이요하여 Compile 하는 과정입니다.
수정하는 과정에서 사용되는 awk, sed, grep 명령은 mac 기본 명령어 이며
aapt는 android-sdk에 포함된 바이너리 입니다.
그럼 시작합니다.
파일명 TestProject.apk 이며
패키지명 com.example.testproject 입니다.
변경될 이름은 xxx.example.testproject 입니다.
apk 패키지명 확인 방법
aapt dump badging TestProject.apk |grep package
package: name='com.example.testproject' versionCode='1' versionName='1.1.1' platformBuildVersionName='8.0.0'
먼저 APK 파일을 디컴파일 한다.
ls
TestProject.apk apktool_2.2.4.jar
java -jar apktool_2.2.4.jar d TestProject.apk
I: Using Apktool 2.2.4 on TestProject.apk
I: Loading resource table...
I: Decoding AndroidManifest.xml with resources...
I: Loading resource table from file: /Users/user/Library/apktool/framework/1.apk
I: Regular manifest package...
I: Decoding file-resources...
I: Decoding values */* XMLs...
I: Baksmaling classes.dex...
I: Copying assets and libs...
I: Copying unknown files...
I: Copying original files...
ls
TestProject/ TestProject.apk
디컴파일 된 디렉토리로 이동후에 com.example 로 시작 되는 파일을 한번에 수정합니다.
cd TestProject
grep -r "com\.example" *
AndroidManifest.xml:<?xml version="1.0" encoding="utf-8" standalone="no"?><manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.testproject">
AndroidManifest.xml: <activity android:label="@string/app_name" android:name="com.example.testproject.MainActivity">
grep -r "com\.example" * | awk '{split($1, result, ":"); print result[1]}'
AndroidManifest.xml
AndroidManifest.xml
grep -r "com\.example" * | awk '{split($1, result, ":"); print result[1]}' | sort -u
AndroidManifest.xml
grep -r "com\.example" * | awk '{split($1, result, ":"); print result[1]}' | sort -u | xargs sed -i '' 's/com\.example/xxx\.example/g'
grep -r 로 "com.example" 문구가 포함된 파일을 모두 찾습니다.
awk 명령으로 파일명만 파싱하고
sort -u 명령으로 중복된 파일명을 골라냅니다. (이 명령은 안해도 수정하는것에는 문제없습니다.)
xargs는 앞에 나온 결과물들을 뒤에 명령어에 인자로 넘겨줍니다.
sed를 통해 "com.example" 을 "xxx.example" 로 수정합니다.
* mac이 라닌 linux라면 sed -i 's/com\.example/xxx\.example/g' 로 -i 옵션에 인자가 없습니다.
동일하게 com/example 로 시작 되는 파일을 한번에 수정합니다.
smali file에서는 패키지구분자가 "/"로 변경 됩니다.
grep -r "com/example" * | awk '{split($1, result, ":"); print result[1]}' | sort -u |xargs sed -i '' 's/com\/example/xxx\/example/g'
모든 파일을 변경 하고 smali 디렉토리에 패키지명 이름으로 된 디렉토리명을 변경 합니다.
ls smali/
android/ com/
mv smali/com smali/xxx
ls smali/
android/ xxx/
모든 변경 작업은 끝났고 다시 apktool로 빌드를 합니다.
빌드후에 dist/ 디렉토리에 재빌드된 apk 파일이 들어있습니다.
cd ..
ls
TestProject/ TestProject.apk apktool_2.2.4.jar
java -jar apktool_2.2.4.jar b TestProject/
I: Using Apktool 2.2.4
I: Checking whether sources has changed...
I: Smaling smali folder into classes.dex...
I: Checking whether resources has changed...
I: Building resources...
I: Copying libs... (/lib)
I: Building apk file...
I: Copying unknown files/dir...
aapt dump badging TestProject/dist/TestProject.apk | grep package
package: name='xxx.example.testproject' versionCode='1' versionName='1.1.1' platformBuildVersionName='8.0.0'
재빌드된 파일은 Signing이 안되어 있습니다.
Signing 후에 단말기 설치/실행 이 가능합니다.
'Computer' 카테고리의 다른 글
adb 쉽게 쓰기 (0) | 2017.11.06 |
---|---|
RHEL 7 에 Docker 수동 설치(how to manually install apache on ubuntu) (0) | 2017.11.06 |
비트코인 광고 사이트(Bitcoin Ad Networks) (0) | 2017.11.04 |
CentOS, RHEL, Ubuntu 의존성 패키지 자동 다운로드 (Download Package With All Dependencies in CentOS, RHEL, Ubuntu) (0) | 2017.11.04 |
Jekyll 설치 오류 (0) | 2017.11.04 |