나는 모든 곳을 보았고 가능하다면 어떻게 할 수 있는지에 대한 정확한 답이나 자습서를 찾을 수 없습니다.
루팅하지 않고도 Android 기기의 데이터베이스를 가져올 수 있습니까? 내 PC에서 데이터를 수집하기 위해 어떤 방식 으로든 해당 데이터를 추출해야하는데 어떻게 수행 할 수 있습니까? 앱을 다시 프로그래밍하거나 여러분이 알고있는 방법을 다시 프로그래밍해야하나요?하지만 기기를 루팅하지 않고 기억하세요. 감사
나는 모든 곳을 보았고 가능하다면 어떻게 할 수 있는지에 대한 정확한 답이나 자습서를 찾을 수 없습니다.
루팅하지 않고도 Android 기기의 데이터베이스를 가져올 수 있습니까? 내 PC에서 데이터를 수집하기 위해 어떤 방식 으로든 해당 데이터를 추출해야하는데 어떻게 수행 할 수 있습니까? 앱을 다시 프로그래밍하거나 여러분이 알고있는 방법을 다시 프로그래밍해야하나요?하지만 기기를 루팅하지 않고 기억하세요. 감사
답변:
원하는 것을 달성하는 일반적인 방법은 ADB pull 명령을 사용하는 것입니다.
대부분의 경우 선호하는 또 다른 방법은 코드로 데이터베이스를 SD 카드에 복사하는 것입니다.
try {
File sd = Environment.getExternalStorageDirectory();
if (sd.canWrite()) {
String currentDBPath = "/data/data/" + getPackageName() + "/databases/yourdatabasename";
String backupDBPath = "backupname.db";
File currentDB = new File(currentDBPath);
File backupDB = new File(sd, backupDBPath);
if (currentDB.exists()) {
FileChannel src = new FileInputStream(currentDB).getChannel();
FileChannel dst = new FileOutputStream(backupDB).getChannel();
dst.transferFrom(src, 0, src.size());
src.close();
dst.close();
}
}
} catch (Exception e) {
}
아래와 같이 매니페스트의 SD에 쓰기 권한을 설정하는 것을 잊지 마십시오.
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
기기가 Android v4 이상을 실행중인 경우 명령 을 사용하여 루트 없이 데이터베이스를 포함한 앱 데이터를 adb backup
가져온 다음 백업 파일을 추출하고 sqlite 데이터베이스에 액세스 할 수 있습니다.
다음 명령을 사용하여 USB 케이블을 통해 PC에 앱 데이터를 먼저 백업 app.package.name
하고, 애플리케이션의 실제 패키지 이름으로 바꿉니다.
adb backup -f ~/data.ab -noapk app.package.name
그러면 "장치 잠금을 해제하고 백업 작업을 확인하십시오"라는 메시지가 표시됩니다. 나중에 추출 할 수 있도록 백업 암호화를위한 비밀번호를 제공하지 마십시오 . 장치에서 "내 데이터 백업"버튼을 클릭합니다. 화면에 백업중인 패키지의 이름이 표시되고 성공적으로 완료되면 자동으로 닫힙니다.
data.ab
홈 폴더 의 결과 파일에는 Android 백업 형식의 애플리케이션 데이터가 포함됩니다. 추출하려면 다음 명령을 사용하십시오.
dd if=data.ab bs=1 skip=24 | openssl zlib -d | tar -xvf -
위의 내용이 openssl:Error: 'zlib' is an invalid command.
오류로 종료 되면 아래를 시도하십시오.
dd if=data.ab bs=1 skip=24 | python -c "import zlib,sys;sys.stdout.write(zlib.decompress(sys.stdin.read()))" | tar -xvf -
결과는 apps/app.package.name/
sqlite 데이터베이스를 포함하여 애플리케이션 데이터가 포함 된 폴더입니다.
자세한 내용은 원본 블로그 게시물을 확인하십시오 .
openssl:Error: 'zlib' is an invalid command.
응답 한 메시지 가 표시됩니다. 17 바이트에 불과하기 때문에 명령도 실패했다고 가정합니다. 디버그 앱에서 데이터베이스를 얻을 수 없다는 것이 나쁘다고 생각합니다 !! dd if=data.ab bs=1 skip=24 | python -c "import zlib,sys;sys.stdout.write(zlib.decompress(sys.stdin.read()))" | tar -xvf -
17+0 records in17+0 records out17 bytes transferred in 0.000064 secs
adb pull
android:allowBackup="false"
openssl
Mac OS X의 My도 zlib
명령을 지원하지 않았 으므로 brew :를 사용하여 명령을 다시 설치했습니다 brew reinstall openssl
. 이것은 시스템 openssl을 대체하지 않습니다. 따라서 현재 세션에 대해서만 PATH 명령을 수정했습니다. 그 후이 export PATH=/usr/local/opt/openssl/bin:$PATH
답변의 명령을 성공적으로 수행 할 수 있습니다.
들어 디버깅 애플리케이션 1 에 비 뿌리 장치 , 당신은 다음 명령을 사용할 수 있습니다 :
adb shell run-as package.name chmod 666 /data/data/package.name/databases/file
adb pull /data/data/package.name/databases/file
예:
adb shell run-as com.app chmod 666 /data/data/com.app/databases/data.db
adb pull /data/data/com.app/databases/data.db
환경 변수에 대한 PATH adb를 설정하거나 cd 명령을 사용하여 android sdk 폴더 platform-tools.
예:
cd /folder/android-sdk/platform-tools/
그런 다음 위의 명령을 사용하십시오.
1 Play 스토어에있는 대부분의 앱 은 매니페스트에서 디버깅 가능 플래그 를 설정해야하므로 디버깅 할 수 없습니다 .
package.name
앱 패키지로 교체 한 후 오류가 반환됩니다.run-as: Package 'com.my.app' is unknown
여기에있는 대부분의 답변은 필요한 것보다 훨씬 더 복잡합니다. 휴대 전화에서 컴퓨터로 앱 데이터베이스를 복사하려면 다음 명령이 필요합니다.
adb -d shell "run-as your.package.name cat databases/database.name" > target.sqlite
위의 명령에 입력해야하는 것은 앱의 패키지 이름, 데이터베이스 이름, 선택적으로 데이터베이스를 복사 할 대상 / 위치입니다.
이 특정 명령은 컴퓨터에 장치가 하나만 연결되어있는 경우에만 작동합니다. 이 -d
매개 변수는 연결된 유일한 장치가 대상이됨을 의미합니다. 그러나 대신 사용할 수있는 다른 매개 변수가 있습니다.
-e
실행중인 유일한 에뮬레이터를 대상으로합니다. -s <serialnumber>
특정 일련 번호가있는 기기를 타겟팅합니다.
adb -d shell "run-as your.package.name cat databases/database_name.db > /mnt/sdcard/database_name.db"
시작하고 SSHDroid
SFTP 프로토콜을 통해 전화기에 연결하십시오. / mnt / sdcard를 기본 원격 디렉토리로 설정합니다.
adb -d shell "run-as your.package.name ls databases"
) 의 파일을 나열 할 수 있습니다. 2) 데이터베이스와 함께 다른 관련 파일을 가져올 수 있습니다. -smh 및 -wal 파일을 추출하는 제 경우 는 SQLite 용 DB 브라우저 에서 데이터베이스를 열 수있는 유일한 방법이었습니다
Android Studio 3.0 이상 버전을 사용하면 애플리케이션이 루팅되지 않은 기기에서 디버그 모드로 실행되는 경우 데이터베이스 (공유 환경 설정, 캐시 디렉토리 등)를 가져올 수 있습니다.
android studio를 사용하여 데이터베이스를 가져 오려면 다음 단계를 따르십시오.
Ubuntu의 경우 (뿐만 아니라?) :
Sergeis Answer를 참조 하지만 openssl 대신 zlib- flate를 사용하십시오.
고양이 appbackup.ab | (dd bs = 24 count = 0 skip = 1; cat) | zlib-flate -uncompress> appbackup.tar
그렇지 않으면 openssl이 던질 것입니다.
openssl : 오류 : 'zlib'는 잘못된 명령입니다.
openssl은 Ubuntu에서 zlib 지원으로 컴파일되지 않기 때문에
나에게 정말 효과가있는 것은 아무것도 없기 때문이다. 나는 함께 결합 된 다른 답변을 기반으로 작은 Windows BATCH 스크립트를 만듭니다. 누군가를 돕기를 바랍니다. 간단히 사용 : backupDatabase <PackageName> <ApplicationName> [TargetDirectory]. Sergei의 백업 방법과 Android Backup Extractor를 사용 합니다.
@echo off
if [%1]==[] goto usage
if [%2]==[] goto usage
if NOT [%4]==[] goto usage
@echo Processing: preparations
set PACKAGE=%1
set APPLICATION_NAME=%2
set TARGET_DIR=%cd%
IF NOT "%~3"=="" set TARGET_DIR=%3
set PATH_ADB="c:\Program Files (x86)\Android\android-studio\sdk\platform-tools"
set PATH_ABE="c:\Programs\android-backup-extractor-20140630-bin"
set PATH_7Z="c:\Program Files\7-Zip"
@echo Processing: backup
%PATH_ADB%\adb.exe backup -f %TARGET_DIR%\%APPLICATION_NAME%\%APPLICATION_NAME%.ab -noapk %PACKAGE%
@echo Processing: unpack
java -jar %PATH_ABE%\abe.jar unpack %TARGET_DIR%\%APPLICATION_NAME%\%APPLICATION_NAME%.ab %TARGET_DIR%\%APPLICATION_NAME%\%APPLICATION_NAME%.ab.tar
@echo Processing: extract
cd %TARGET_DIR%\%APPLICATION_NAME%
%PATH_7Z%\7z.exe e %APPLICATION_NAME%.ab.tar "apps\%PACKAGE%\db\%APPLICATION_NAME%"
@echo Processing: cleaning
del %APPLICATION_NAME%.ab
del %APPLICATION_NAME%.ab.tar
goto :eof
:usage
@echo.Pull out SQLite database file from your android device.
@echo.Needs: - connected device
@echo. - device enable backup.
@echo. - application enable backup
@echo. - application in debug mode
@echo. - installed Android Backup Extractor
@echo. - installed command line TAR extractor (7z, ...)
@echo.Does NOT need: root device
@echo.
@echo.Uses: - ADB backup (set PATH_ADB)
@echo. - Android Backup Extractor (http://sourceforge.net/projects/adbextractor/) (set PATH_ABE)
@echo. - Extract TAR container, uses 7z (set PATH_7Z)
@echo.
@echo.Usage: backupDatabase ^<PackageName^> ^<ApplicationName^> [TargetDirectory]
@echo.Example: backupDatabase com.foo.example ExampleApp
@echo Example: backupDatabase com.foo.example ExampleApp workspace\AndroidProjects\Example
exit /B 1
장치에서 sqlite 파일을 쉽게 추출 할 수 있습니다 (루트 필요 없음).
adb 시작
cd / sdk / platform-tools ./adb shell
그런 다음 터미널에 다음 명령을 입력하십시오
./adb -d shell "run-as com.your_packagename cat /data/data/com.your_packagename/databases/jokhanaNepal> /sdcard/jokhana.sqlite"
예를 들어
./adb -d shell "run-as com.yuvii.app cat /data/data/com.yuvii.app/databases/jokhanaNepal> /sdcard/jokhana.sqlite"
Android 6에서 수행하려는 경우 권한을 요청 하고이 질문에 대한 답변 코드를 사용하십시오.
if (ActivityCompat.checkSelfPermission(MainActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, STORAGE_PERMISSION_RC);
return;
}
일단 부여되면
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == STORAGE_PERMISSION_RC) {
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
//permission granted start reading or writing database
} else {
Toast.makeText(this, "No permission to read external storage.", Toast.LENGTH_SHORT).show();
}
}
}
또는 내 라이브러리 Ultra Debugger를 사용할 수 있습니다 . 데이터베이스를 파일로 다운로드하거나 브라우저에서 직접 값을 편집 할 수 있습니다. 루트가 필요하지 않으며 사용하기 매우 쉽습니다.
Mac (루트 필요 없음)
1. Go to platform-tools folder.
2) Run following command in terminal.
./adb -d shell "run-as your.package.name cat databases/database.sqlite" > database.sqlite
platform-tools 폴더의 sqlite 파일을 복사합니다.
루팅 된 기기에서 다음을 수행 할 수 있습니다.
// check that db is there
>adb shell
# ls /data/data/app.package.name/databases
db_name.sqlite // a custom named db
# exit
// pull it
>adb pull /data/app.package.name/databases/db_name.sqlite
Lam Vinh가 제공 한 답변에 따라 1 세대 Nexus 7에서 저에게 적합한 간단한 배치 파일이 있습니다. 패키지 이름과 데이터베이스 이름 (.sqlite 확장자 제외)을 입력하라는 메시지가 표시되고 c : \ temp에서. 여기에서는 환경 변수에 Android sdk가 설정되어 있다고 가정합니다.
@echo off
cd c:\temp\
set /p UserInputPackage= Enter the package name:
set /p UserInputDB= Enter the database name:
@echo on
adb shell "run-as %UserInputPackage% chmod 666 /data/data/%UserInputPackage%/databases/%UserInputDB%.sqlite"
adb pull /data/data/%UserInputPackage%/databases/%UserInputDB%.sqlite
@echo off
pause
Android 4.0 이상이고 Mac 을 사용하는 경우 앱 콘텐츠를 데스크톱에 저장하는 루비 스크립트가 있습니다. 테스트하지는 않았지만 우분투에서도 작동 할 것이라고 생각합니다.
puts "enter your package name"
package_name = gets.chomp
puts "press the 'Back up my data' button on your device"
`adb backup -f ~/Desktop/data.ab -noapk #{package_name}`
puts "press enter once once the 'Backup finished' toast has appeared"
gets.chomp
puts "extracting..."
`dd if=data.ab bs=1 skip=24 | openssl zlib -d | tar -xvf -`
실행하려면 -> ruby your_ruby_file_name.rb
이 스크립트는 "행복한 경로"전용이므로 기기가 연결되어 있고 adb가 프로필에 추가되었는지 확인하세요.
나는 내부 저장소 (adb가있는 PC가 아닌)에서 앱 데이터베이스를 "저장"하고 "복원"하는 완전한 솔루션을 제공합니다.
두 가지 방법으로 하나는 저장하고 다른 하나는 데이터베이스를 복원합니다. MainActivity의 onCreate () 끝에 이러한 메서드를 사용합니다 (데이터베이스를 저장하거나 복원하려는 경우 둘 중 하나).
내부 저장소에 데이터베이스 저장 :
void copyDatabase (){
try {
final String inFileName = "/data/data/<pakage.name>/databases/database.db";
final String outFileName = Environment.getExternalStorageDirectory() + "database_backup.db";
File dbFile = new File(inFileName);
FileInputStream fis = new FileInputStream(dbFile);
Log.d(TAG, "copyDatabase: outFile = " + outFileName);
// Open the empty db as the output stream
OutputStream output = new FileOutputStream(outFileName);
// Transfer bytes from the inputfile to the outputfile
byte[] buffer = new byte[1024];
int length;
while ((length = fis.read(buffer)) > 0) {
output.write(buffer, 0, length);
}
// Close the streams
output.flush();
output.close();
fis.close();
}catch (Exception e){
Log.d(TAG, "copyDatabase: backup error");
}
}
내부 저장소에서 데이터베이스 복원 :
void restoreDatabase (){
try {
final String inFileName = Environment.getExternalStorageDirectory() + "database_backup.db";
final String outFileName = "/data/data/<package.name>/databases/database.db";
File dbFile = new File(inFileName);
FileInputStream fis = new FileInputStream(dbFile);
Log.d(TAG, "copyDatabase: outFile = " + outFileName);
// Open the empty db as the output stream
OutputStream output = new FileOutputStream(outFileName);
// Transfer bytes from the inputfile to the outputfile
byte[] buffer = new byte[1024];
int length;
while ((length = fis.read(buffer)) > 0) {
output.write(buffer, 0, length);
}
// Close the streams
output.flush();
output.close();
fis.close();
}catch (Exception e){
Log.d(TAG, "copyDatabase: backup error");
}
}
일이 자동화되면 항상 더 좋습니다. 그래서 ADB를 사용하여 장치에서 db 파일을 복사하는 간단한 파이썬 스크립트 를 작성 했습니다. 자주 사용하면 개발 시간을 많이 절약 할 수 있습니다.
기기가 루팅되지 않은 경우 디버깅 가능한 앱 에서만 작동합니다 .
다음과 같이 실행하십시오. python copyandroiddbfile.py
import sys
import subprocess
import re
#/
# Created by @nieldeokar on 25/05/2018.
#/
# 1. Python script which will copy database file of debuggable apps from the android device to your computer using ADB.
# 2. This script ask for PackageName and DatabaseName at runtime.
# 3. You can make it static by passing -d at as command line argument while running script and setting defaults in following way.
# 4. Edit script and change the values of varialbe packageName and dbName to debuggable app package name and database name then
# run script as : python Copydbfileandroid.py -d
useDefaults = False
def checkIfPackageInstalled(strSelectedDevice) :
packageName = 'com.nileshdeokar.healthapp.debug'
dbName = 'healthapp.db'
if not useDefaults :
print('Please enter package name : ')
packageName = raw_input()
packageString = 'package:'+packageName
try:
adbCheckIfPackageInstalledOutput = subprocess.check_output('adb -s ' + strSelectedDevice + ' shell pm list packages | grep -x '+ packageString, shell=True)
except subprocess.CalledProcessError as e:
print "Package not found"
return
if packageString.strip() == adbCheckIfPackageInstalledOutput.strip() :
if not useDefaults :
print('Please enter db name : ')
dbName = raw_input()
adbCopyDbString = 'adb -s '+strSelectedDevice + ' -d shell \"run-as '+packageName+' cat /data/data/'+packageName+'/databases/'+ dbName +'\" > '+dbName
try:
copyDbOp = subprocess.check_output(adbCopyDbString,shell=True)
except subprocess.CalledProcessError as e:
return
if "is not debuggable" in copyDbOp :
print packageString + 'is nto debuggable'
if copyDbOp.strip() == "":
print 'Successfully copied '+dbName + ' in current directory'
else :
print 'Package is not installed on the device'
defaultString = "-d"
if len(sys.argv[1:]) > 0 and sys.argv[1] == defaultString :
useDefaults = True
listDevicesOutput = subprocess.check_output("adb devices", shell=True)
listDevicesOutput = listDevicesOutput.replace("List of devices attached"," ").replace("\n","").replace("\t","").replace("\n\n","")
numberofDevices = len(re.findall(r'device+', listDevicesOutput))
connectedDevicesArray = listDevicesOutput.split("device")
del connectedDevicesArray[-1]
strSelectedDevice = ''
if(numberofDevices > 1) :
print('Please select the device : \n'),
for idx, device in enumerate(connectedDevicesArray):
print idx+1,device
selectedDevice = raw_input()
if selectedDevice.isdigit() :
intSelected = int(selectedDevice)
if 1 <= intSelected <= len(connectedDevicesArray) :
print 'Selected device is : ',connectedDevicesArray[intSelected-1]
checkIfPackageInstalled(connectedDevicesArray[intSelected-1])
else :
print 'Please select in range'
else :
print 'Not valid input'
elif numberofDevices == 1 :
checkIfPackageInstalled(connectedDevicesArray[0])
elif numberofDevices == 0 :
print("No device is attached")
데이터베이스 파일을 원하는 경우
DDMS> 파일 탐색보기
패키지 이름에서 db 파일 찾기
그런 다음 장치에서 파일 가져 오기를 클릭합니다 (루팅 된 장치 만 해당).